ZGlmZiAtLWdpdCBhLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZCBiLy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODYxMWZkCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9idWdfcmVwb3J0Lm1kCkBAIC0wLDAgKzEsMzUgQEAKKy0tLQorbmFtZTogQnVnIHJlcG9ydAorYWJvdXQ6IENyZWF0ZSBhIHJlcG9ydCB0byBoZWxwIHVzIGltcHJvdmUgdGhlIHF1YWxpdHkgb2Ygb3VyIHNvZnR3YXJlCit0aXRsZTogJycKK2xhYmVsczogJycKK2Fzc2lnbmVlczogJycKKworLS0tCisKKyoqQ2F1dGlvbioqCitUaGUgSXNzdWVzIGFyZSBzdHJpY3RseSBsaW1pdGVkIGZvciB0aGUgcmVwb3J0aW5nIG9mIHByb2JsZW0gZW5jb3VudGVyZWQgd2l0aCB0aGUgc29mdHdhcmUgcHJvdmlkZWQgaW4gdGhpcyBwcm9qZWN0LgorRm9yIGFueSBvdGhlciBwcm9ibGVtIHJlbGF0ZWQgdG8gdGhlIFNUTTMyIHByb2R1Y3QsIHRoZSBwZXJmb3JtYW5jZSwgdGhlIGhhcmR3YXJlIGNoYXJhY3RlcmlzdGljcyBhbmQgYm9hcmRzLCB0aGUgdG9vbHMgdGhlIGVudmlyb25tZW50IGluIGdlbmVyYWwsIHBsZWFzZSBwb3N0IGEgdG9waWMgaW4gdGhlIFtTVCBDb21tdW5pdHkvU1RNMzIgTUNVcyBmb3J1bV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvZ3JvdXAvMEY5MFgwMDAwMDBBWHNBU0FXL3N0bTMyLW1jdXMpLgorCisqKkRlc2NyaWJlIHRoZSBzZXQtdXAqKgorICogVGhlIGJvYXJkIChlaXRoZXIgU1QgUlBOIHJlZmVyZW5jZSBvciB5b3VyIGN1c3RvbSBib2FyZCkuCisgKiBJREUgb3IgYXQgbGVhc3QgdGhlIGNvbXBpbGVyIGFuZCBpdHMgdmVyc2lvbi4KKworKipEZXNjcmliZSB0aGUgYnVnKioKK0EgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgYnVnIGlzLgorCisqKkhvdyBUbyBSZXByb2R1Y2UqKgorMS4gSW5kaWNhdGUgdGhlIGdsb2JhbCBiZWhhdmlvciBvZiB5b3VyIGFwcGxpY2F0aW9uIHByb2plY3QuCisKKzIuIFRoZSBtb2R1bGVzIHRoYXQgeW91IHN1c3BlY3QgdG8gYmUgdGhlIGNhdXNlIG9mIHRoZSBwcm9ibGVtIChEcml2ZXIsIEJTUCwgTVcgLi4uKS4KKworMy4gVGhlIHVzZSBjYXNlIHRoYXQgZ2VuZXJhdGVzIHRoZSBwcm9ibGVtLgorCis0LiBIb3cgd2UgY2FuIHJlcHJvZHVjZSB0aGUgcHJvYmxlbS4KKworCisqKkFkZGl0aW9uYWwgY29udGV4dCoqCitJZiB5b3UgaGF2ZSBhIGZpcnN0IGFuYWx5c2lzIG9yIHBhdGNoIGNvcnJlY3Rpb24sIHRoYW5rIHlvdSB0byBzaGFyZSB5b3VyIHByb3Bvc2FsLgorCisqKlNjcmVlbnNob3RzKioKK0lmIGFwcGxpY2FibGUsIGFkZCBzY3JlZW5zaG90cyB0byBoZWxwIGV4cGxhaW4geW91ciBwcm9ibGVtLgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9vdGhlci1pc3N1ZS5tZCBiLy5naXRodWIvSVNTVUVfVEVNUExBVEUvb3RoZXItaXNzdWUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyY2Y1OAotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvSVNTVUVfVEVNUExBVEUvb3RoZXItaXNzdWUubWQKQEAgLTAsMCArMSwyMiBAQAorLS0tCituYW1lOiAnT3RoZXIgSXNzdWUgJworYWJvdXQ6IEdlbmVyaWMgaXNzdWUgZGVzY3JpcHRpb24KK3RpdGxlOiAnJworbGFiZWxzOiAnJworYXNzaWduZWVzOiAnJworCistLS0KKworKipDYXV0aW9uKioKK1RoZSBJc3N1ZXMgYXJlIHN0cmljdGx5IGxpbWl0ZWQgZm9yIHRoZSByZXBvcnRpbmcgb2YgcHJvYmxlbSBlbmNvdW50ZXJlZCB3aXRoIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHByb2plY3QuCitGb3IgYW55IG90aGVyIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgU1RNMzIgcHJvZHVjdCwgdGhlIHBlcmZvcm1hbmNlLCB0aGUgaGFyZHdhcmUgY2hhcmFjdGVyaXN0aWNzIGFuZCBib2FyZHMsIHRoZSB0b29scyB0aGUgZW52aXJvbm1lbnQgaW4gZ2VuZXJhbCwgcGxlYXNlIHBvc3QgYSB0b3BpYyBpbiB0aGUgW1NUIENvbW11bml0eS9TVE0zMiBNQ1VzIGZvcnVtXShodHRwczovL2NvbW11bml0eS5zdC5jb20vcy9ncm91cC8wRjkwWDAwMDAwMEFYc0FTQVcvc3RtMzItbWN1cykuCisKKyoqRGVzY3JpYmUgdGhlIHNldC11cCoqCisgKiBUaGUgYm9hcmQgKGVpdGhlciBTVCBSUE4gcmVmZXJlbmNlIG9yIHlvdXIgY3VzdG9tIGJvYXJkKS4KKyAqIElERSBvciBhdCBsZWFzdCB0aGUgY29tcGlsZXIgYW5kIGl0cyB2ZXJzaW9uLgorCisqKkFkZGl0aW9uYWwgY29udGV4dCoqCitJZiB5b3UgaGF2ZSBhIGZpcnN0IGFuYWx5c2lzIG9yIGEgcGF0Y2ggcHJvcG9zYWwsIHRoYW5rIHlvdSB0byBzaGFyZSB5b3VyIHByb3Bvc2FsLgorCisqKlNjcmVlbnNob3RzKioKK0lmIGFwcGxpY2FibGUsIGFkZCBzY3JlZW5zaG90cyB0byBoZWxwIGV4cGxhaW4geW91ciBwcm9ibGVtLgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQgYi8uZ2l0aHViL1BVTExfUkVRVUVTVF9URU1QTEFURS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzRkMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQKQEAgLTAsMCArMSw1IEBACisjIyBJTVBPUlRBTlQgSU5GT1JNQVRJT04KKworIyMjIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50IChDTEEpCisqIFRoZSBQdWxsIFJlcXVlc3QgZmVhdHVyZSB3aWxsIGJlIGNvbnNpZGVyZWQgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIGFmdGVyIHRoZSBzaWduYXR1cmUgb2YgYSAqKkNvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50IChDTEEpKiogYnkgdGhlIHN1Ym1pdHRlci4KKyogSWYgeW91IGRpZCBub3Qgc2lnbiBzdWNoIGFncmVlbWVudCwgcGxlYXNlIGZvbGxvdyB0aGUgc3RlcHMgbWVudGlvbmVkIGluIHRoZSBbQ09OVFJJQlVUSU5HLm1kXShodHRwczovL2dpdGh1Yi5jb20vU1RNaWNyb2VsZWN0cm9uaWNzL3N0bTMyX213X2ZyZWVydG9zL2Jsb2IvbWFzdGVyL0NPTlRSSUJVVElORy5tZCkgZmlsZS4KZGlmZiAtLWdpdCBhL0NPREVfT0ZfQ09ORFVDVC5tZCBiL0NPREVfT0ZfQ09ORFVDVC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTUyYjA0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09ERV9PRl9DT05EVUNULm1kCkBAIC0wLDAgKzEsNzYgQEAKKyMgQ29udHJpYnV0b3IgQ292ZW5hbnQgQ29kZSBvZiBDb25kdWN0CisKKyMjIE91ciBQbGVkZ2UKKworSW4gdGhlIGludGVyZXN0IG9mIGZvc3RlcmluZyBhbiBvcGVuIGFuZCB3ZWxjb21pbmcgZW52aXJvbm1lbnQsIHdlIGFzCitjb250cmlidXRvcnMgYW5kIG1haW50YWluZXJzIHBsZWRnZSB0byBtYWtpbmcgcGFydGljaXBhdGlvbiBpbiBvdXIgcHJvamVjdCBhbmQKK291ciBjb21tdW5pdHkgYSBoYXJhc3NtZW50LWZyZWUgZXhwZXJpZW5jZSBmb3IgZXZlcnlvbmUsIHJlZ2FyZGxlc3Mgb2YgYWdlLCBib2R5CitzaXplLCBkaXNhYmlsaXR5LCBldGhuaWNpdHksIHNleCBjaGFyYWN0ZXJpc3RpY3MsIGdlbmRlciBpZGVudGl0eSBhbmQgZXhwcmVzc2lvbiwKK2xldmVsIG9mIGV4cGVyaWVuY2UsIGVkdWNhdGlvbiwgc29jaW8tZWNvbm9taWMgc3RhdHVzLCBuYXRpb25hbGl0eSwgcGVyc29uYWwKK2FwcGVhcmFuY2UsIHJhY2UsIHJlbGlnaW9uLCBvciBzZXh1YWwgaWRlbnRpdHkgYW5kIG9yaWVudGF0aW9uLgorCisjIyBPdXIgU3RhbmRhcmRzCisKK0V4YW1wbGVzIG9mIGJlaGF2aW9yIHRoYXQgY29udHJpYnV0ZXMgdG8gY3JlYXRpbmcgYSBwb3NpdGl2ZSBlbnZpcm9ubWVudAoraW5jbHVkZToKKworKiBVc2luZyB3ZWxjb21pbmcgYW5kIGluY2x1c2l2ZSBsYW5ndWFnZQorKiBCZWluZyByZXNwZWN0ZnVsIG9mIGRpZmZlcmluZyB2aWV3cG9pbnRzIGFuZCBleHBlcmllbmNlcworKiBHcmFjZWZ1bGx5IGFjY2VwdGluZyBjb25zdHJ1Y3RpdmUgY3JpdGljaXNtCisqIEZvY3VzaW5nIG9uIHdoYXQgaXMgYmVzdCBmb3IgdGhlIGNvbW11bml0eQorKiBTaG93aW5nIGVtcGF0aHkgdG93YXJkcyBvdGhlciBjb21tdW5pdHkgbWVtYmVycworCitFeGFtcGxlcyBvZiB1bmFjY2VwdGFibGUgYmVoYXZpb3IgYnkgcGFydGljaXBhbnRzIGluY2x1ZGU6CisKKyogVGhlIHVzZSBvZiBzZXh1YWxpemVkIGxhbmd1YWdlIG9yIGltYWdlcnkgYW5kIHVud2VsY29tZSBzZXh1YWwgYXR0ZW50aW9uIG9yCisgYWR2YW5jZXMKKyogVHJvbGxpbmcsIGluc3VsdGluZy9kZXJvZ2F0b3J5IGNvbW1lbnRzLCBhbmQgcGVyc29uYWwgb3IgcG9saXRpY2FsIGF0dGFja3MKKyogUHVibGljIG9yIHByaXZhdGUgaGFyYXNzbWVudAorKiBQdWJsaXNoaW5nIG90aGVycycgcHJpdmF0ZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhIHBoeXNpY2FsIG9yIGVsZWN0cm9uaWMKKyBhZGRyZXNzLCB3aXRob3V0IGV4cGxpY2l0IHBlcm1pc3Npb24KKyogT3RoZXIgY29uZHVjdCB3aGljaCBjb3VsZCByZWFzb25hYmx5IGJlIGNvbnNpZGVyZWQgaW5hcHByb3ByaWF0ZSBpbiBhCisgcHJvZmVzc2lvbmFsIHNldHRpbmcKKworIyMgT3VyIFJlc3BvbnNpYmlsaXRpZXMKKworUHJvamVjdCBtYWludGFpbmVycyBhcmUgcmVzcG9uc2libGUgZm9yIGNsYXJpZnlpbmcgdGhlIHN0YW5kYXJkcyBvZiBhY2NlcHRhYmxlCitiZWhhdmlvciBhbmQgYXJlIGV4cGVjdGVkIHRvIHRha2UgYXBwcm9wcmlhdGUgYW5kIGZhaXIgY29ycmVjdGl2ZSBhY3Rpb24gaW4KK3Jlc3BvbnNlIHRvIGFueSBpbnN0YW5jZXMgb2YgdW5hY2NlcHRhYmxlIGJlaGF2aW9yLgorCitQcm9qZWN0IG1haW50YWluZXJzIGhhdmUgdGhlIHJpZ2h0IGFuZCByZXNwb25zaWJpbGl0eSB0byByZW1vdmUsIGVkaXQsIG9yCityZWplY3QgY29tbWVudHMsIGNvbW1pdHMsIGNvZGUsIHdpa2kgZWRpdHMsIGlzc3VlcywgYW5kIG90aGVyIGNvbnRyaWJ1dGlvbnMKK3RoYXQgYXJlIG5vdCBhbGlnbmVkIHRvIHRoaXMgQ29kZSBvZiBDb25kdWN0LCBvciB0byBiYW4gdGVtcG9yYXJpbHkgb3IKK3Blcm1hbmVudGx5IGFueSBjb250cmlidXRvciBmb3Igb3RoZXIgYmVoYXZpb3JzIHRoYXQgdGhleSBkZWVtIGluYXBwcm9wcmlhdGUsCit0aHJlYXRlbmluZywgb2ZmZW5zaXZlLCBvciBoYXJtZnVsLgorCisjIyBTY29wZQorCitUaGlzIENvZGUgb2YgQ29uZHVjdCBhcHBsaWVzIGJvdGggd2l0aGluIHByb2plY3Qgc3BhY2VzIGFuZCBpbiBwdWJsaWMgc3BhY2VzCit3aGVuIGFuIGluZGl2aWR1YWwgaXMgcmVwcmVzZW50aW5nIHRoZSBwcm9qZWN0IG9yIGl0cyBjb21tdW5pdHkuIEV4YW1wbGVzIG9mCityZXByZXNlbnRpbmcgYSBwcm9qZWN0IG9yIGNvbW11bml0eSBpbmNsdWRlIHVzaW5nIGFuIG9mZmljaWFsIHByb2plY3QgZS1tYWlsCithZGRyZXNzLCBwb3N0aW5nIHZpYSBhbiBvZmZpY2lhbCBzb2NpYWwgbWVkaWEgYWNjb3VudCwgb3IgYWN0aW5nIGFzIGFuIGFwcG9pbnRlZAorcmVwcmVzZW50YXRpdmUgYXQgYW4gb25saW5lIG9yIG9mZmxpbmUgZXZlbnQuIFJlcHJlc2VudGF0aW9uIG9mIGEgcHJvamVjdCBtYXkgYmUKK2Z1cnRoZXIgZGVmaW5lZCBhbmQgY2xhcmlmaWVkIGJ5IHByb2plY3QgbWFpbnRhaW5lcnMuCisKKyMjIEVuZm9yY2VtZW50CisKK0luc3RhbmNlcyBvZiBhYnVzaXZlLCBoYXJhc3NpbmcsIG9yIG90aGVyd2lzZSB1bmFjY2VwdGFibGUgYmVoYXZpb3IgbWF5IGJlCityZXBvcnRlZCBieSBjb250YWN0aW5nIHRoZSBwcm9qZWN0IHRlYW0gYXQgaHR0cHM6Ly93d3cuc3QuY29tL2NvbnRlbnQvc3RfY29tL2VuL2NvbnRhY3QtdXMuaHRtbC4gQWxsCitjb21wbGFpbnRzIHdpbGwgYmUgcmV2aWV3ZWQgYW5kIGludmVzdGlnYXRlZCBhbmQgd2lsbCByZXN1bHQgaW4gYSByZXNwb25zZSB0aGF0CitpcyBkZWVtZWQgbmVjZXNzYXJ5IGFuZCBhcHByb3ByaWF0ZSB0byB0aGUgY2lyY3Vtc3RhbmNlcy4gVGhlIHByb2plY3QgdGVhbSBpcworb2JsaWdhdGVkIHRvIG1haW50YWluIGNvbmZpZGVudGlhbGl0eSB3aXRoIHJlZ2FyZCB0byB0aGUgcmVwb3J0ZXIgb2YgYW4gaW5jaWRlbnQuCitGdXJ0aGVyIGRldGFpbHMgb2Ygc3BlY2lmaWMgZW5mb3JjZW1lbnQgcG9saWNpZXMgbWF5IGJlIHBvc3RlZCBzZXBhcmF0ZWx5LgorCitQcm9qZWN0IG1haW50YWluZXJzIHdobyBkbyBub3QgZm9sbG93IG9yIGVuZm9yY2UgdGhlIENvZGUgb2YgQ29uZHVjdCBpbiBnb29kCitmYWl0aCBtYXkgZmFjZSB0ZW1wb3Jhcnkgb3IgcGVybWFuZW50IHJlcGVyY3Vzc2lvbnMgYXMgZGV0ZXJtaW5lZCBieSBvdGhlcgorbWVtYmVycyBvZiB0aGUgcHJvamVjdCdzIGxlYWRlcnNoaXAuCisKKyMjIEF0dHJpYnV0aW9uCisKK1RoaXMgQ29kZSBvZiBDb25kdWN0IGlzIGFkYXB0ZWQgZnJvbSB0aGUgW0NvbnRyaWJ1dG9yIENvdmVuYW50XVtob21lcGFnZV0sIHZlcnNpb24gMS40LAorYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmNvbnRyaWJ1dG9yLWNvdmVuYW50Lm9yZy92ZXJzaW9uLzEvNC9jb2RlLW9mLWNvbmR1Y3QuaHRtbAorCitbaG9tZXBhZ2VdOiBodHRwczovL3d3dy5jb250cmlidXRvci1jb3ZlbmFudC5vcmcKKworRm9yIGFuc3dlcnMgdG8gY29tbW9uIHF1ZXN0aW9ucyBhYm91dCB0aGlzIGNvZGUgb2YgY29uZHVjdCwgc2VlCitodHRwczovL3d3dy5jb250cmlidXRvci1jb3ZlbmFudC5vcmcvZmFxCmRpZmYgLS1naXQgYS9DT05UUklCVVRJTkcubWQgYi9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkMjJkOQotLS0gL2Rldi9udWxsCisrKyBiL0NPTlRSSUJVVElORy5tZApAQCAtMCwwICsxLDMxIEBACisjIyBDb250cmlidXRpbmcgZ3VpZGUKK1RoaXMgZG9jdW1lbnQgc2VydmVzIGFzIGEgY2hlY2tsaXN0IGJlZm9yZSBjb250cmlidXRpbmcgdG8gdGhpcyByZXBvc2l0b3J5LgorSXQgaW5jbHVkZXMgbGlua3MgdG8gcmVhZCB1cCBvbiBpZiB0b3BpY3MgYXJlIHVuY2xlYXIgdG8geW91LgorCitUaGlzIGd1aWRlIG1haW5seSBmb2N1c2VzIG9uIHRoZSBwcm9wZXIgdXNlIG9mIEdpdC4KKworIyMjIDEuIEJlZm9yZSBvcGVuaW5nIGFuIGlzc3VlCitQbGVhc2UgY2hlY2sgdGhlIGZvbGxvd2luZyBib3hlcyBiZWZvcmUgcG9zdGluZyBhbiBpc3N1ZToKKy0gWyBdIGBNYWtlIHN1cmUgeW91IGFyZSB1c2luZyB0aGUgbGF0ZXN0IGNvbW1pdCAobWFqb3IgcmVsZWFzZXMgYXJlIFRhZ2dlZCwgYnV0IGNvcnJlY3Rpb25zIGFyZSBhdmFpbGFibGUgYXMgbmV3IGNvbW1pdHMpLmAKKy0gWyBdIGBNYWtlIHN1cmUgeW91ciBpc3N1ZSBpcyBhIHF1ZXN0aW9uL2ZlZWRiYWNrL3N1Z2dlc3Rpb25zIFJFTEFURUQgVE8gdGhlIHNvZnR3YXJlIHByb3ZpZGVkIGluIHRoaXMgcmVwb3NpdG9yeS5gIE90aGVyd2lzZSwgaXQgc2hvdWxkIGJlIGRpc2N1c3NlZCBvbiB0aGUgW1NUIENvbW11bml0eS9TVE0zMiBNQ1VzIGZvcnVtXShodHRwczovL2NvbW11bml0eS5zdC5jb20vcy9ncm91cC8wRjkwWDAwMDAwMEFYc0FTQVcvc3RtMzItbWN1cykuCistIFsgXSBgTWFrZSBzdXJlIHlvdXIgaXNzdWUgaXMgbm90IGFscmVhZHkgcmVwb3J0ZWQvZml4ZWQgb24gR2l0SHViIG9yIGRpc2N1c3NlZCBvbiBhIHByZXZpb3VzIGlzc3VlLmAgUGxlYXNlIHJlZmVyIHRvIHRoaXMgW2Rhc2hib2FyZF0oaHR0cHM6Ly9naXRodWIuY29tL29yZ3MvU1RNaWNyb2VsZWN0cm9uaWNzL3Byb2plY3RzLzUpIGZvciB0aGUgbGlzdCBvZiBpc3N1ZXMgYW5kIHB1bGwtcmVxdWVzdHMuIERvIG5vdCBmb3JnZXQgdG8gYnJvd3NlIGludG8gdGhlICoqY2xvc2VkKiogaXNzdWVzLgorCisjIyMgMi4gUG9zdGluZyB0aGUgaXNzdWUKK1doZW4geW91IGhhdmUgY2hlY2tlZCB0aGUgcHJldmlvdXMgYm94ZXMuIFlvdSB3aWxsIGZpbmQgdHdvIHRlbXBsYXRlcyAoQnVnIFJlcG9ydCBvciBPdGhlciBJc3N1ZSkgYXZhaWxhYmxlIGluIHRoZSAqKklzc3VlcyoqIHRhYiBvZiB0aGUgcmVwb3NpdG9yeSAoW2xpbmtdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJfbXdfZnJlZXJ0b3MvaXNzdWVzL25ldy9jaG9vc2UpKS4KKworIyMjIDMuIFB1bGwgUmVxdWVzdHMKK1NUTWljcm9sZWN0cm9uaWNzIGlzIGhhcHB5IHRvIHJlY2VpdmUgY29udHJpYnV0aW9ucyBmcm9tIHRoZSBjb21tdW5pdHksIGJhc2VkIG9uIGFuIGluaXRpYWwgQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQgKENMQSkgcHJvY2VkdXJlLgorCisqIElmIHlvdSBhcmUgYW4gaW5kaXZpZHVhbCB3cml0aW5nIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGFuZCB5b3UgYXJlIHN1cmUgKip5b3Ugb3duIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkqKiwgdGhlbiB5b3UgbmVlZCB0byBzaWduIGFuIEluZGl2aWR1YWwgQ0xBIChodHRwczovL2NsYS5zdC5jb20pLgorKiBJZiB5b3Ugd29yayBmb3IgYSBjb21wYW55IHRoYXQgd2FudHMgYWxzbyB0byBhbGxvdyB5b3UgdG8gY29udHJpYnV0ZSB3aXRoIHlvdXIgd29yaywgeW91ciBjb21wYW55IG5lZWRzIHRvIHByb3ZpZGUgYSBDb3Jwb3JhdGUgQ0xBIChodHRwczovL2NsYS5zdC5jb20pIG1lbnRpb25pbmcgeW91ciBHaXRIdWIgYWNjb3VudCBuYW1lLgorKiBJZiB5b3UgYXJlIG5vdCBzdXJlIHRoYXQgYSBDTEEgKEluZGl2aWR1YWwgb3IgQ29ycG9yYXRlKSBoYXMgYmVlbiBzaWduZWQgZm9yIHlvdXIgR2l0SHViIGFjY291bnQgeW91IGNhbiBjaGVjayBoZXJlIChodHRwczovL2NsYS5zdC5jb20pLgorCitQbGVhc2Ugbm90ZSB0aGF0OgorKiBUaGUgQ29ycG9yYXRlIENMQSB3aWxsIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgSW5kaXZpZHVhbCBDTEEuCisqIE9uZSBDTEEgc3VibWlzc2lvbiBpcyBzdWZmaWNpZW50LCBmb3IgYW55IHByb2plY3QgcHJvcG9zZWQgYnkgU1RNaWNyb2VsZWN0cm9uaWNzLgorCisjIyMjIEhvdyB0byBwcm9jZWVkCisKKyogV2UgcmVjb21tZW5kIHRvIGVuZ2FnZSBmaXJzdCBhIGNvbW11bmljYXRpb24gdGhydSBhbiBpc3N1ZSwgaW4gb3JkZXIgdG8gcHJlc2VudCB5b3VyIHByb3Bvc2FsLiBKdXN0IHRvIGNvbmZpcm0gdGhhdCBpdCBjb3JyZXNwb25kcyB0byBTVE1pY3JvZWxlY3Ryb25pY3MgZG9tYWluIG9yIHNjb3BlLgorKiBUaGVuIGZvcmsgdGhlIHByb2plY3QgdG8geW91ciBHaXRIdWIgYWNjb3VudCB0byBmdXJ0aGVyIGRldmVsb3AgeW91ciBjb250cmlidXRpb24uIFBsZWFzZSB1c2UgdGhlIGxhdGVzdCBjb21taXQgdmVyc2lvbi4KKyogUGxlYXNlLCBzdWJtaXQgb25lIFB1bGwgUmVxdWVzdCBmb3Igb25lIG5ldyBmZWF0dXJlIG9yIHByb3Bvc2FsLiBUaGlzIHdpbGwgZWFzZSB0aGUgYW5hbHlzaXMgYW5kIHRoZSBmaW5hbCBtZXJnZSBpZiBhY2NlcHRlZC4KZGlmZiAtLWdpdCBhL0xpY2Vuc2UubWQgYi9MaWNlbnNlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MWMwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWNlbnNlLm1kCkBAIC0wLDAgKzEsMyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLgorCitUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBBbWF6b24uY29tIHVuZGVyIHRoZSAqKk1JVCBvcGVuIHNvdXJjZSoqIGxpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGlzIGxpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBbaGVyZV0oaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpLgpkaWZmIC0tZ2l0IGEvTGljZW5zZS9saWNlbnNlLnR4dCBiL0xpY2Vuc2UvbGljZW5zZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3MjMxMAotLS0gL2Rldi9udWxsCisrKyBiL0xpY2Vuc2UvbGljZW5zZS50eHQKQEAgLTAsMCArMSwzNyBAQAorVGhlIEZyZWVSVE9TIGtlcm5lbCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIG9wZW4gc291cmNlIGxpY2Vuc2UsIHRoZSB0ZXh0IG9mCit3aGljaCBpcyBwcm92aWRlZCBiZWxvdy4KKworVGhpcyBsaWNlbnNlIGNvdmVycyB0aGUgRnJlZVJUT1Mga2VybmVsIHNvdXJjZSBmaWxlcywgd2hpY2ggYXJlIGxvY2F0ZWQgaW4gdGhlCisvRnJlZVJUT1MvU291cmNlIGRpcmVjdG9yeSBvZiB0aGUgb2ZmaWNpYWwgRnJlZVJUT1Mga2VybmVsIGRvd25sb2FkLiAgSXQgYWxzbworY292ZXJzIG1vc3Qgb2YgdGhlIHNvdXJjZSBmaWxlcyBpbiB0aGUgZGVtbyBhcHBsaWNhdGlvbiBwcm9qZWN0cywgd2hpY2ggYXJlCitsb2NhdGVkIGluIHRoZSAvRnJlZVJUT1MvRGVtbyBkaXJlY3Rvcnkgb2YgdGhlIG9mZmljaWFsIEZyZWVSVE9TIGRvd25sb2FkLiAgVGhlCitkZW1vIHByb2plY3RzIG1heSBhbHNvIGluY2x1ZGUgdGhpcmQgcGFydHkgc29mdHdhcmUgdGhhdCBpcyBub3QgcGFydCBvZiBGcmVlUlRPUworYW5kIGlzIGxpY2Vuc2VkIHNlcGFyYXRlbHkgdG8gRnJlZVJUT1MuICBFeGFtcGxlcyBvZiB0aGlyZCBwYXJ0eSBzb2Z0d2FyZQoraW5jbHVkZXMgaGVhZGVyIGZpbGVzIHByb3ZpZGVkIGJ5IGNoaXAgb3IgdG9vbHMgdmVuZG9ycywgbGlua2VyIHNjcmlwdHMsCitwZXJpcGhlcmFsIGRyaXZlcnMsIGV0Yy4gIEFsbCB0aGUgc29mdHdhcmUgaW4gc3ViZGlyZWN0b3JpZXMgb2YgdGhlIC9GcmVlUlRPUworZGlyZWN0b3J5IGlzIGVpdGhlciBvcGVuIHNvdXJjZSBvciBkaXN0cmlidXRlZCB3aXRoIHBlcm1pc3Npb24sIGFuZCBpcyBmcmVlIGZvcgordXNlLiAgRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQsIHJlZmVyIHRvIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mIGVhY2gKK3NvdXJjZSBmaWxlLgorCisKK0xpY2Vuc2UgdGV4dDoKKy0tLS0tLS0tLS0tLS0KKworQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgordGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KK3RoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KK3VzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCit0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCitzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCitjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKK0ZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCitJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKwpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCmluZGV4IDUwNjg5OWQuLjRlODBmMTggMTAwNjQ0Ci0tLSBhL1JFQURNRS5tZAorKysgYi9SRUFETUUubWQKQEAgLTEgKzEsNDggQEAKLSMgc3RtMzJfbXdfZnJlZXJ0b3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjIE1pZGRsZXdhcmUgRnJlZVJUT1MgTUNVIENvbXBvbmVudAorCisjIyBPdmVydmlldworCisqKlNUTTMyQ3ViZSoqIGlzIGFuIFNUTWljcm9lbGVjdHJvbmljcyBvcmlnaW5hbCBpbml0aWF0aXZlIHRvIGVhc2UgdGhlIGRldmVsb3BlcnMgbGlmZSBieSByZWR1Y2luZyBlZmZvcnRzLCB0aW1lIGFuZCBjb3N0LgorCisqKlNUTTMyQ3ViZSoqIGNvdmVycyB0aGUgb3ZlcmFsbCBTVE0zMiBwcm9kdWN0cyBwb3J0Zm9saW8uIEl0IGluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBlbWJlZGRlZCBzb2Z0d2FyZSBwbGF0Zm9ybSwgZGVsaXZlcmVkIGZvciBlYWNoIFNUTTMyIHNlcmllcy4KKyAgICogVGhlIENNU0lTIG1vZHVsZXMgKGNvcmUgYW5kIGRldmljZSkgY29ycmVzcG9uZGluZyB0byB0aGUgQVJNKHRtKSBjb3JlIGltcGxlbWVudGVkIGluIHRoaXMgU1RNMzIgcHJvZHVjdC4KKyAgICogVGhlIFNUTTMyIEhBTC1MTCBkcml2ZXJzIDogYW4gYWJzdHJhY3Rpb24gZHJpdmVycyBsYXllciwgdGhlIEFQSSBlbnN1cmluZyBtYXhpbWl6ZWQgcG9ydGFiaWxpdHkgYWNyb3NzIHRoZSBTVE0zMiBwb3J0Zm9saW8uCisgICAqIFRoZSBCU1AgRHJpdmVycyBvZiBlYWNoIGV2YWx1YXRpb24gb3IgZGVtb25zdHJhdGlvbiBib2FyZCBwcm92aWRlZCBieSB0aGlzIFNUTTMyIHNlcmllcy4KKyAgICogQSBjb25zaXN0ZW50IHNldCBvZiBtaWRkbGV3YXJlcyBjb21wb25lbnRzIHN1Y2ggYXMgUlRPUywgVVNCLCBGYXRGUywgR3JhcGhpY3MsIFNUTTMyX1RvdWNoU2Vuc2luZ19MaWJyYXJ5Li4uCisgICAqIEEgZnVsbCBzZXQgb2Ygc29mdHdhcmUgcHJvamVjdHMgKGJhc2ljIGV4YW1wbGVzLCBhcHBsaWNhdGlvbnMgb3IgZGVtb25zdHJhdGlvbnMpIGZvciBlYWNoIGJvYXJkIHByb3ZpZGVkIGJ5IHRoaXMgU1RNMzIgc2VyaWVzLgorCitUd28gbW9kZWxzIG9mIHB1YmxpY2F0aW9uIGFyZSBwcm9wb3NlZCBmb3IgdGhlIFNUTTMyQ3ViZSBlbWJlZGRlZCBzb2Z0d2FyZToKKyAgICogVGhlIG1vbm9saXRoaWMgKipNQ1UgUGFja2FnZSoqIDogYWxsIFNUTTMyQ3ViZSBzb2Z0d2FyZSBtb2R1bGVzIG9mIG9uZSBTVE0zMiBzZXJpZXMgYXJlIHByZXNlbnQgKERyaXZlcnMsIE1pZGRsZXdhcmVzLCBQcm9qZWN0cywgVXRpbGl0aWVzKSBpbiB0aGUgcmVwbyAodXN1YWwgbmFtZSAqKlNUTTMyQ3ViZXh4KiosIHh4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNUTTMyIHNlcmllcykuCisgICAqIFRoZSAqKk1DVSBjb21wb25lbnQqKiA6IHByb2dyZXNzaXZlbHkgZnJvbSBOb3ZlbWJlciAyMDE5LCBlYWNoIFNUTTMyQ3ViZSBzb2Z0d2FyZSBtb2R1bGUgYmVpbmcgcGFydCBvZiB0aGUgU1RNMzJDdWJlIE1DVSBQYWNrYWdlLCB3aWxsIGJlIGRlbGl2ZXJlZCBhcyBhbiBpbmRpdmlkdWFsIHJlcG8sIGFsbG93aW5nIHRoZSB1c2VyIHRvIHNlbGVjdCBhbmQgZ2V0IG9ubHkgdGhlIHJlcXVpcmVkIHNvZnR3YXJlIGZ1bmN0aW9ucy4KKworIyMgRGVzY3JpcHRpb24KKworVGhpcyAqKnN0bTMyX213X2ZyZWVydG9zKiogTUNVIGNvbXBvbmVudCByZXBvc2l0b3J5IGlzIG9uZSBlbGVtZW50ICoqY29tbW9uIHRvIGFsbCoqIFNUTTMyQ3ViZSBNQ1UgZW1iZWRkZWQgc29mdHdhcmUgcGFja2FnZXMsIHByb3ZpZGluZyB0aGUgKipGcmVlUlRPUyBNaWRkbGV3YXJlKiogcGFydC4KKworIyMgTGljZW5zZQorCitDb3B5cmlnaHQgKGMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLgorCitUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBBbWF6b24uY29tIHVuZGVyIHRoZSAqKk1JVCBvcGVuIHNvdXJjZSoqIGxpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGlzIGxpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBbaGVyZV0oaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpLgorCisjIyBSZWxlYXNlIG5vdGUKKworRGV0YWlscyBhYm91dCB0aGUgY29udGVudCBvZiB0aGlzIHJlbGVhc2UgYXJlIGF2YWlsYWJsZSBpbiB0aGUgcmVsZWFzZSBub3RlIFtoZXJlXShodHRwczovL3d3dy5mcmVlcnRvcy5vcmcvSGlzdG9yeS50eHQpLgorCitEZXRhaWxzIGFib3V0IHRoZSB1cGRhdGVzIG1hZGUgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIGFyZSBhdmFpbGFibGUgaW4gdGhlIHJlbGVhc2Ugbm90ZSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9zdG0zMl9td19mcmVlcnRvcy9ibG9iL21hc3Rlci9Tb3VyY2Uvc3RfcmVhZG1lLnR4dCkuCisKKyMjIENvbXBhdGliaWxpdHkgaW5mb3JtYXRpb24KKworVGhpcyB0YWJsZSBzaG93cyB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGUgTVcgY29tcG9uZW50IHZlcnNpb24gYW5kIG90aGVyIGNvbXBvbmVudHMgY29ycmVzcG9uZGluZyB2ZXJzaW9ucy4gSXQgaXMgKipjcnVjaWFsKiogdGhhdCB5b3UgdXNlIGEgY29uc2lzdGVudCBzZXQgb2YgdmVyc2lvbnMsIGFzIG1lbnRpb25lZCBpbiB0aGlzIHRhYmxlLgorCitJbiB0aGUgY2FzZSBvZiB0aGUgRnJlZVJUT1MsIHRoaXMgY29ycmVzcG9uZGVuY2UgaXMgcGFydGljdWxhciB0byB0aGUgQ01TSVMtUlRPUyBWMiwgdGhlIENNU0lTLVJUT1MgVjEgYmVpbmcgY29tcGF0aWJsZSB3aXRoIG9sZGVyIENNU0lTIENvcmUgdmVyc2lvbnMgdG9vLgorCitGcmVlUlRPUyB8IENNU0lTIENvcmUgfAorLS0tLS0tLS0gfCAtLS0tLS0tLS0tIHwKK1RhZyB2MTAuMC4xIHwgVGFnIHY1LjQuMAorCisjIyBUcm91Ymxlc2hvb3RpbmcKKworSWYgeW91IGhhdmUgYW55IGlzc3VlIHdpdGggdGhlICoqc29mdHdhcmUgY29udGVudCoqIG9mIHRoaXMgcmVwb3NpdG9yeSwgeW91IGNhbiBmaWxlIGFuIGlzc3VlIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vU1RNaWNyb2VsZWN0cm9uaWNzL3N0bTMyX213X2ZyZWVydG9zL2lzc3Vlcy9uZXcvY2hvb3NlKS4KKworRm9yIGFueSBvdGhlciBxdWVzdGlvbiByZWxhdGVkIHRvIHRoZSBwcm9kdWN0LCB0aGUgdG9vbHMsIHRoZSBlbnZpcm9ubWVudCwgeW91IGNhbiBzdWJtaXQgYSB0b3BpYyB0byB0aGUgW1NUIENvbW11bml0eV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvKS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9DTVNJU19SVE9TL2Ntc2lzX29zLmMgYi9Tb3VyY2UvQ01TSVNfUlRPUy9jbXNpc19vcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZjIzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvQ01TSVNfUlRPUy9jbXNpc19vcy5jCkBAIC0wLDAgKzEsMTcyNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogJERhdGU6ICAgICAgICA1LiBGZWJydWFyeSAyMDEzCisgKiAkUmV2aXNpb246ICAgIFYxLjAyCisgKgorICogUHJvamVjdDogICAgICBDTVNJUy1SVE9TIEFQSQorICogVGl0bGU6ICAgICAgICBjbXNpc19vcy5jCisgKgorICogVmVyc2lvbiAwLjAyCisgKiAgICBJbml0aWFsIFByb3Bvc2FsIFBoYXNlCisgKiBWZXJzaW9uIDAuMDMKKyAqICAgIG9zS2VybmVsU3RhcnQgYWRkZWQsIG9wdGlvbmFsIGZlYXR1cmU6IG1haW4gc3RhcnRlZCBhcyB0aHJlYWQKKyAqICAgIG9zU2VtYXBob3JlcyBoYXZlIHN0YW5kYXJkIGJlaGF2aW9yCisgKiAgICBvc1RpbWVyQ3JlYXRlIGRvZXMgbm90IHN0YXJ0IHRoZSB0aW1lciwgYWRkZWQgb3NUaW1lclN0YXJ0CisgKiAgICBvc1RocmVhZFBhc3MgaXMgcmVuYW1lZCB0byBvc1RocmVhZFlpZWxkCisgKiBWZXJzaW9uIDEuMDEKKyAqICAgIFN1cHBvcnQgZm9yIEMrKyBpbnRlcmZhY2UKKyAqICAgICAtIGNvbnN0IGF0dHJpYnV0ZSByZW1vdmVkIGZyb20gdGhlIG9zWHh4eERlZl90IHR5cGVkZWYncworICogICAgIC0gY29uc3QgYXR0cmlidXRlIGFkZGVkIHRvIHRoZSBvc1h4eHhEZWYgbWFjcm9zCisgKiAgICBBZGRlZDogb3NUaW1lckRlbGV0ZSwgb3NNdXRleERlbGV0ZSwgb3NTZW1hcGhvcmVEZWxldGUKKyAqICAgIEFkZGVkOiBvc0tlcm5lbEluaXRpYWxpemUKKyAqIFZlcnNpb24gMS4wMgorICogICAgQ29udHJvbCBmdW5jdGlvbnMgZm9yIHNob3J0IHRpbWVvdXRzIGluIG1pY3Jvc2Vjb25kIHJlc29sdXRpb246CisgKiAgICBBZGRlZDogb3NLZXJuZWxTeXNUaWNrLCBvc0tlcm5lbFN5c1RpY2tGcmVxdWVuY3ksIG9zS2VybmVsU3lzVGlja01pY3JvU2VjCisgKiAgICBSZW1vdmVkOiBvc1NpZ25hbEdldCAKKyAqICAgIAorICogIAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IKkgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MgSW50ZXJuYXRpb25hbCBOLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDIwMTMgQVJNIExJTUlURUQKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBBUk0gIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjbXNpc19vcy5oIgorCisvKgorICogQVJNIENvbXBpbGVyIDQvNQorICovCisjaWYgICBkZWZpbmVkICggX19DQ19BUk0gKQorCisgICNkZWZpbmUgX19BU00gICAgICAgICAgICBfX2FzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICNkZWZpbmUgX19JTkxJTkUgICAgICAgICBfX2lubGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgI2RlZmluZSBfX1NUQVRJQ19JTkxJTkUgIHN0YXRpYyBfX2lubGluZQorCisgICNpbmNsdWRlICJjbXNpc19hcm1jYy5oIgorCisvKgorICogR05VIENvbXBpbGVyCisgKi8KKyNlbGlmIGRlZmluZWQgKCBfX0dOVUNfXyApCisKKyAgI2RlZmluZSBfX0FTTSAgICAgICAgICAgIF9fYXNtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGFzbSBrZXl3b3JkIGZvciBHTlUgQ29tcGlsZXIgICAgICAgICAgKi8KKyAgI2RlZmluZSBfX0lOTElORSAgICAgICAgIGlubGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IGlubGluZSBrZXl3b3JkIGZvciBHTlUgQ29tcGlsZXIgICAgICAgKi8KKyAgI2RlZmluZSBfX1NUQVRJQ19JTkxJTkUgIHN0YXRpYyBpbmxpbmUKKworICAjaW5jbHVkZSAiY21zaXNfZ2NjLmgiCisKKworLyoKKyAqIElBUiBDb21waWxlcgorICovCisjZWxpZiBkZWZpbmVkICggX19JQ0NBUk1fXyApCisKKyAgI2lmbmRlZiAgIF9fQVNNCisgICAgI2RlZmluZSBfX0FTTSAgICAgICAgICAgICAgICAgICAgIF9fYXNtCisgICNlbmRpZgorICAjaWZuZGVmICAgX19JTkxJTkUKKyAgICAjZGVmaW5lIF9fSU5MSU5FICAgICAgICAgICAgICAgICAgaW5saW5lCisgICNlbmRpZgorICAjaWZuZGVmICAgX19TVEFUSUNfSU5MSU5FCisgICAgI2RlZmluZSBfX1NUQVRJQ19JTkxJTkUgICAgICAgICAgIHN0YXRpYyBpbmxpbmUKKyAgI2VuZGlmCisKKyAgI2luY2x1ZGUgPGNtc2lzX2lhci5oPgorI2VuZGlmCisKK2V4dGVybiB2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIodm9pZCk7CisKKy8qIENvbnZlcnQgZnJvbSBDTVNJUyB0eXBlIG9zUHJpb3JpdHkgdG8gRnJlZVJUT1MgcHJpb3JpdHkgbnVtYmVyICovCitzdGF0aWMgdW5zaWduZWQgcG9ydEJBU0VfVFlQRSBtYWtlRnJlZVJ0b3NQcmlvcml0eSAob3NQcmlvcml0eSBwcmlvcml0eSkKK3sKKyAgdW5zaWduZWQgcG9ydEJBU0VfVFlQRSBmcHJpb3JpdHkgPSB0c2tJRExFX1BSSU9SSVRZOworICAKKyAgaWYgKHByaW9yaXR5ICE9IG9zUHJpb3JpdHlFcnJvcikgeworICAgIGZwcmlvcml0eSArPSAocHJpb3JpdHkgLSBvc1ByaW9yaXR5SWRsZSk7CisgIH0KKyAgCisgIHJldHVybiBmcHJpb3JpdHk7Cit9CisKKyNpZiAoSU5DTFVERV91eFRhc2tQcmlvcml0eUdldCA9PSAxKQorLyogQ29udmVydCBmcm9tIEZyZWVSVE9TIHByaW9yaXR5IG51bWJlciB0byBDTVNJUyB0eXBlIG9zUHJpb3JpdHkgKi8KK3N0YXRpYyBvc1ByaW9yaXR5IG1ha2VDbXNpc1ByaW9yaXR5ICh1bnNpZ25lZCBwb3J0QkFTRV9UWVBFIGZwcmlvcml0eSkKK3sKKyAgb3NQcmlvcml0eSBwcmlvcml0eSA9IG9zUHJpb3JpdHlFcnJvcjsKKyAgCisgIGlmICgoZnByaW9yaXR5IC0gdHNrSURMRV9QUklPUklUWSkgPD0gKG9zUHJpb3JpdHlSZWFsdGltZSAtIG9zUHJpb3JpdHlJZGxlKSkgeworICAgIHByaW9yaXR5ID0gKG9zUHJpb3JpdHkpKChpbnQpb3NQcmlvcml0eUlkbGUgKyAoaW50KShmcHJpb3JpdHkgLSB0c2tJRExFX1BSSU9SSVRZKSk7CisgIH0KKyAgCisgIHJldHVybiBwcmlvcml0eTsKK30KKyNlbmRpZgorCisKKy8qIERldGVybWluZSB3aGV0aGVyIHdlIGFyZSBpbiB0aHJlYWQgbW9kZSBvciBoYW5kbGVyIG1vZGUuICovCitzdGF0aWMgaW50IGluSGFuZGxlck1vZGUgKHZvaWQpCit7CisgIHJldHVybiBfX2dldF9JUFNSKCkgIT0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIEtlcm5lbCBDb250cm9sIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFJUT1MgS2VybmVsIGZvciBjcmVhdGluZyBvYmplY3RzLgorKiBAcmV0dmFsIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zS2VybmVsSW5pdGlhbGl6ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NTdGF0dXMgb3NLZXJuZWxJbml0aWFsaXplICh2b2lkKTsKKworLyoqCisqIEBicmllZiAgU3RhcnQgdGhlIFJUT1MgS2VybmVsIHdpdGggZXhlY3V0aW5nIHRoZSBzcGVjaWZpZWQgdGhyZWFkLgorKiBAcGFyYW0gIHRocmVhZF9kZWYgICAgdGhyZWFkIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NUaHJlYWQuCisqIEBwYXJhbSAgYXJndW1lbnQgICAgICBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB0aHJlYWQgZnVuY3Rpb24gYXMgc3RhcnQgYXJndW1lbnQuCisqIEByZXR2YWwgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc0tlcm5lbFN0YXJ0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1N0YXR1cyBvc0tlcm5lbFN0YXJ0ICh2b2lkKQoreworICB2VGFza1N0YXJ0U2NoZWR1bGVyKCk7CisgIAorICByZXR1cm4gb3NPSzsKK30KKworLyoqCisqIEBicmllZiAgQ2hlY2sgaWYgdGhlIFJUT1Mga2VybmVsIGlzIGFscmVhZHkgc3RhcnRlZAorKiBAcGFyYW0gIE5vbmUKKyogQHJldHZhbCAoMCkgUlRPUyBpcyBub3Qgc3RhcnRlZAorKiAgICAgICAgICgxKSBSVE9TIGlzIHN0YXJ0ZWQKKyogICAgICAgICAoLTEpIGlmIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBpbiBGcmVlUlRPU0NvbmZpZy5oIAorKiBAbm90ZSAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc0tlcm5lbFJ1bm5pbmcgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK2ludDMyX3Qgb3NLZXJuZWxSdW5uaW5nKHZvaWQpCit7CisjaWYgKCAoIElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSA9PSAxICkgfHwgKCBjb25maWdVU0VfVElNRVJTID09IDEgKSApCisgIGlmICh4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgPT0gdGFza1NDSEVEVUxFUl9OT1RfU1RBUlRFRCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiAxOworI2Vsc2UKKwlyZXR1cm4gKC0xKTsKKyNlbmRpZgkKK30KKworI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfU3lzVGljaykgICYmICAob3NGZWF0dXJlX1N5c1RpY2sgIT0gMCkpICAgICAvLyBTeXN0ZW0gVGltZXIgYXZhaWxhYmxlCisvKioKKyogQGJyaWVmICBHZXQgdGhlIHZhbHVlIG9mIHRoZSBLZXJuZWwgU3lzVGljayB0aW1lcgorKiBAcGFyYW0gIE5vbmUKKyogQHJldHZhbCBOb25lCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc0tlcm5lbFN5c1RpY2sgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK3VpbnQzMl90IG9zS2VybmVsU3lzVGljayh2b2lkKQoreworICBpZiAoaW5IYW5kbGVyTW9kZSgpKSB7CisgICAgcmV0dXJuIHhUYXNrR2V0VGlja0NvdW50RnJvbUlTUigpOworICB9CisgIGVsc2UgeworICAgIHJldHVybiB4VGFza0dldFRpY2tDb3VudCgpOworICB9Cit9CisjZW5kaWYgICAgLy8gU3lzdGVtIFRpbWVyIGF2YWlsYWJsZQorLyoqKioqKioqKioqKioqKioqKioqKioqIFRocmVhZCBNYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisqIEBicmllZiAgQ3JlYXRlIGEgdGhyZWFkIGFuZCBhZGQgaXQgdG8gQWN0aXZlIFRocmVhZHMgYW5kIHNldCBpdCB0byBzdGF0ZSBSRUFEWS4KKyogQHBhcmFtICB0aHJlYWRfZGVmICAgIHRocmVhZCBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zVGhyZWFkLgorKiBAcGFyYW0gIGFyZ3VtZW50ICAgICAgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uIGFzIHN0YXJ0IGFyZ3VtZW50LgorKiBAcmV0dmFsIHRocmVhZCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RocmVhZENyZWF0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NUaHJlYWRJZCBvc1RocmVhZENyZWF0ZSAoY29uc3Qgb3NUaHJlYWREZWZfdCAqdGhyZWFkX2RlZiwgdm9pZCAqYXJndW1lbnQpCit7CisgIFRhc2tIYW5kbGVfdCBoYW5kbGU7CisgIAorI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSAmJiAgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKyAgaWYoKHRocmVhZF9kZWYtPmJ1ZmZlciAhPSBOVUxMKSAmJiAodGhyZWFkX2RlZi0+Y29udHJvbGJsb2NrICE9IE5VTEwpKSB7CisgICAgaGFuZGxlID0geFRhc2tDcmVhdGVTdGF0aWMoKFRhc2tGdW5jdGlvbl90KXRocmVhZF9kZWYtPnB0aHJlYWQsKGNvbnN0IHBvcnRDSEFSICopdGhyZWFkX2RlZi0+bmFtZSwKKyAgICAgICAgICAgICAgdGhyZWFkX2RlZi0+c3RhY2tzaXplLCBhcmd1bWVudCwgbWFrZUZyZWVSdG9zUHJpb3JpdHkodGhyZWFkX2RlZi0+dHByaW9yaXR5KSwKKyAgICAgICAgICAgICAgdGhyZWFkX2RlZi0+YnVmZmVyLCB0aHJlYWRfZGVmLT5jb250cm9sYmxvY2spOworICB9CisgIGVsc2UgeworICAgIGlmICh4VGFza0NyZWF0ZSgoVGFza0Z1bmN0aW9uX3QpdGhyZWFkX2RlZi0+cHRocmVhZCwoY29uc3QgcG9ydENIQVIgKil0aHJlYWRfZGVmLT5uYW1lLAorICAgICAgICAgICAgICB0aHJlYWRfZGVmLT5zdGFja3NpemUsIGFyZ3VtZW50LCBtYWtlRnJlZVJ0b3NQcmlvcml0eSh0aHJlYWRfZGVmLT50cHJpb3JpdHkpLAorICAgICAgICAgICAgICAmaGFuZGxlKSAhPSBwZFBBU1MpICB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IAorICB9CisjZWxpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKworICAgIGhhbmRsZSA9IHhUYXNrQ3JlYXRlU3RhdGljKChUYXNrRnVuY3Rpb25fdCl0aHJlYWRfZGVmLT5wdGhyZWFkLChjb25zdCBwb3J0Q0hBUiAqKXRocmVhZF9kZWYtPm5hbWUsCisgICAgICAgICAgICAgIHRocmVhZF9kZWYtPnN0YWNrc2l6ZSwgYXJndW1lbnQsIG1ha2VGcmVlUnRvc1ByaW9yaXR5KHRocmVhZF9kZWYtPnRwcmlvcml0eSksCisgICAgICAgICAgICAgIHRocmVhZF9kZWYtPmJ1ZmZlciwgdGhyZWFkX2RlZi0+Y29udHJvbGJsb2NrKTsKKyNlbHNlCisgIGlmICh4VGFza0NyZWF0ZSgoVGFza0Z1bmN0aW9uX3QpdGhyZWFkX2RlZi0+cHRocmVhZCwoY29uc3QgcG9ydENIQVIgKil0aHJlYWRfZGVmLT5uYW1lLAorICAgICAgICAgICAgICAgICAgIHRocmVhZF9kZWYtPnN0YWNrc2l6ZSwgYXJndW1lbnQsIG1ha2VGcmVlUnRvc1ByaW9yaXR5KHRocmVhZF9kZWYtPnRwcmlvcml0eSksCisgICAgICAgICAgICAgICAgICAgJmhhbmRsZSkgIT0gcGRQQVNTKSAgeworICAgIHJldHVybiBOVUxMOworICB9ICAgICAKKyNlbmRpZgorICAKKyAgcmV0dXJuIGhhbmRsZTsKK30KKworLyoqCisqIEBicmllZiAgUmV0dXJuIHRoZSB0aHJlYWQgSUQgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0aHJlYWQuCisqIEByZXR2YWwgdGhyZWFkIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkR2V0SWQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK29zVGhyZWFkSWQgb3NUaHJlYWRHZXRJZCAodm9pZCkKK3sKKyNpZiAoICggSU5DTFVERV94VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlID09IDEgKSB8fCAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKSApCisgIHJldHVybiB4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCk7CisjZWxzZQorCXJldHVybiBOVUxMOworI2VuZGlmCit9CisKKy8qKgorKiBAYnJpZWYgIFRlcm1pbmF0ZSBleGVjdXRpb24gb2YgYSB0aHJlYWQgYW5kIHJlbW92ZSBpdCBmcm9tIEFjdGl2ZSBUaHJlYWRzLgorKiBAcGFyYW0gICB0aHJlYWRfaWQgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkVGVybWluYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1N0YXR1cyBvc1RocmVhZFRlcm1pbmF0ZSAob3NUaHJlYWRJZCB0aHJlYWRfaWQpCit7CisjaWYgKElOQ0xVREVfdlRhc2tEZWxldGUgPT0gMSkKKyAgdlRhc2tEZWxldGUodGhyZWFkX2lkKTsKKyAgcmV0dXJuIG9zT0s7CisjZWxzZQorICByZXR1cm4gb3NFcnJvck9TOworI2VuZGlmCit9CisKKy8qKgorKiBAYnJpZWYgIFBhc3MgY29udHJvbCB0byBuZXh0IHRocmVhZCB0aGF0IGlzIGluIHN0YXRlIFxiIFJFQURZLgorKiBAcmV0dmFsIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkWWllbGQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK29zU3RhdHVzIG9zVGhyZWFkWWllbGQgKHZvaWQpCit7CisgIHRhc2tZSUVMRCgpOworICAKKyAgcmV0dXJuIG9zT0s7Cit9CisKKy8qKgorKiBAYnJpZWYgICBDaGFuZ2UgcHJpb3JpdHkgb2YgYW4gYWN0aXZlIHRocmVhZC4KKyogQHBhcmFtICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisqIEBwYXJhbSAgIHByaW9yaXR5ICAgICAgbmV3IHByaW9yaXR5IHZhbHVlIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RocmVhZFNldFByaW9yaXR5IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1N0YXR1cyBvc1RocmVhZFNldFByaW9yaXR5IChvc1RocmVhZElkIHRocmVhZF9pZCwgb3NQcmlvcml0eSBwcmlvcml0eSkKK3sKKyNpZiAoSU5DTFVERV92VGFza1ByaW9yaXR5U2V0ID09IDEpCisgIHZUYXNrUHJpb3JpdHlTZXQodGhyZWFkX2lkLCBtYWtlRnJlZVJ0b3NQcmlvcml0eShwcmlvcml0eSkpOworICByZXR1cm4gb3NPSzsKKyNlbHNlCisgIHJldHVybiBvc0Vycm9yT1M7CisjZW5kaWYKK30KKworLyoqCisqIEBicmllZiAgIEdldCBjdXJyZW50IHByaW9yaXR5IG9mIGFuIGFjdGl2ZSB0aHJlYWQuCisqIEBwYXJhbSAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorKiBAcmV0dmFsICBjdXJyZW50IHByaW9yaXR5IHZhbHVlIG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RocmVhZEdldFByaW9yaXR5IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1ByaW9yaXR5IG9zVGhyZWFkR2V0UHJpb3JpdHkgKG9zVGhyZWFkSWQgdGhyZWFkX2lkKQoreworI2lmIChJTkNMVURFX3V4VGFza1ByaW9yaXR5R2V0ID09IDEpCisgIGlmIChpbkhhbmRsZXJNb2RlKCkpCisgIHsKKyAgICByZXR1cm4gbWFrZUNtc2lzUHJpb3JpdHkodXhUYXNrUHJpb3JpdHlHZXRGcm9tSVNSKHRocmVhZF9pZCkpOyAgCisgIH0KKyAgZWxzZQorICB7ICAKKyAgICByZXR1cm4gbWFrZUNtc2lzUHJpb3JpdHkodXhUYXNrUHJpb3JpdHlHZXQodGhyZWFkX2lkKSk7CisgIH0KKyNlbHNlCisgIHJldHVybiBvc1ByaW9yaXR5RXJyb3I7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIEdlbmVyaWMgV2FpdCBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorKiBAYnJpZWYgICBXYWl0IGZvciBUaW1lb3V0IChUaW1lIERlbGF5KQorKiBAcGFyYW0gICBtaWxsaXNlYyAgICAgIHRpbWUgZGVsYXkgdmFsdWUKKyogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKi8KK29zU3RhdHVzIG9zRGVsYXkgKHVpbnQzMl90IG1pbGxpc2VjKQoreworI2lmIElOQ0xVREVfdlRhc2tEZWxheQorICBUaWNrVHlwZV90IHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CisgIAorICB2VGFza0RlbGF5KHRpY2tzID8gdGlja3MgOiAxKTsgICAgICAgICAgLyogTWluaW11bSBkZWxheSA9IDEgdGljayAqLworICAKKyAgcmV0dXJuIG9zT0s7CisjZWxzZQorICAodm9pZCkgbWlsbGlzZWM7CisgIAorICByZXR1cm4gb3NFcnJvclJlc291cmNlOworI2VuZGlmCit9CisKKyNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX1dhaXQpICAmJiAgKG9zRmVhdHVyZV9XYWl0ICE9IDApKSAvKiBHZW5lcmljIFdhaXQgYXZhaWxhYmxlICovCisvKioKKyogQGJyaWVmICBXYWl0IGZvciBTaWduYWwsIE1lc3NhZ2UsIE1haWwsIG9yIFRpbWVvdXQKKyogQHBhcmFtICAgbWlsbGlzZWMgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0CisqIEByZXR2YWwgIGV2ZW50IHRoYXQgY29udGFpbnMgc2lnbmFsLCBtZXNzYWdlLCBvciBtYWlsIGluZm9ybWF0aW9uIG9yIGVycm9yIGNvZGUuCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1dhaXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK29zRXZlbnQgb3NXYWl0ICh1aW50MzJfdCBtaWxsaXNlYyk7CisKKyNlbmRpZiAgLyogR2VuZXJpYyBXYWl0IGF2YWlsYWJsZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogIFRpbWVyIE1hbmFnZW1lbnQgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorKiBAYnJpZWYgIENyZWF0ZSBhIHRpbWVyLgorKiBAcGFyYW0gIHRpbWVyX2RlZiAgICAgdGltZXIgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zVGltZXIuCisqIEBwYXJhbSAgdHlwZSAgICAgICAgICBvc1RpbWVyT25jZSBmb3Igb25lLXNob3Qgb3Igb3NUaW1lclBlcmlvZGljIGZvciBwZXJpb2RpYyBiZWhhdmlvci4KKyogQHBhcmFtICBhcmd1bWVudCAgICAgIGFyZ3VtZW50IHRvIHRoZSB0aW1lciBjYWxsIGJhY2sgZnVuY3Rpb24uCisqIEByZXR2YWwgIHRpbWVyIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGltZXJDcmVhdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK29zVGltZXJJZCBvc1RpbWVyQ3JlYXRlIChjb25zdCBvc1RpbWVyRGVmX3QgKnRpbWVyX2RlZiwgb3NfdGltZXJfdHlwZSB0eXBlLCB2b2lkICphcmd1bWVudCkKK3sKKyNpZiAoY29uZmlnVVNFX1RJTUVSUyA9PSAxKQorCisjaWYoICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKSAKKyAgaWYodGltZXJfZGVmLT5jb250cm9sYmxvY2sgIT0gTlVMTCkgeworICAgIHJldHVybiB4VGltZXJDcmVhdGVTdGF0aWMoKGNvbnN0IGNoYXIgKikiIiwKKyAgICAgICAgICAgICAgICAgICAgICAxLCAvLyBwZXJpb2Qgc2hvdWxkIGJlIGZpbGxlZCB3aGVuIHN0YXJ0aW5nIHRoZSBUaW1lciB1c2luZyBvc1RpbWVyU3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBvc1RpbWVyUGVyaW9kaWMpID8gcGRUUlVFIDogcGRGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAoVGFza0Z1bmN0aW9uX3QpdGltZXJfZGVmLT5wdGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgKFN0YXRpY1RpbWVyX3QgKil0aW1lcl9kZWYtPmNvbnRyb2xibG9jayk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIHhUaW1lckNyZWF0ZSgoY29uc3QgY2hhciAqKSIiLAorICAgICAgICAgICAgICAgICAgICAgIDEsIC8vIHBlcmlvZCBzaG91bGQgYmUgZmlsbGVkIHdoZW4gc3RhcnRpbmcgdGhlIFRpbWVyIHVzaW5nIG9zVGltZXJTdGFydAorICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IG9zVGltZXJQZXJpb2RpYykgPyBwZFRSVUUgOiBwZEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgIChUYXNrRnVuY3Rpb25fdCl0aW1lcl9kZWYtPnB0aW1lcik7CisgfQorI2VsaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisgIHJldHVybiB4VGltZXJDcmVhdGVTdGF0aWMoKGNvbnN0IGNoYXIgKikiIiwKKyAgICAgICAgICAgICAgICAgICAgICAxLCAvLyBwZXJpb2Qgc2hvdWxkIGJlIGZpbGxlZCB3aGVuIHN0YXJ0aW5nIHRoZSBUaW1lciB1c2luZyBvc1RpbWVyU3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBvc1RpbWVyUGVyaW9kaWMpID8gcGRUUlVFIDogcGRGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAoVGFza0Z1bmN0aW9uX3QpdGltZXJfZGVmLT5wdGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgKFN0YXRpY1RpbWVyX3QgKil0aW1lcl9kZWYtPmNvbnRyb2xibG9jayk7ICAKKyNlbHNlCisgIHJldHVybiB4VGltZXJDcmVhdGUoKGNvbnN0IGNoYXIgKikiIiwKKyAgICAgICAgICAgICAgICAgICAgICAxLCAvLyBwZXJpb2Qgc2hvdWxkIGJlIGZpbGxlZCB3aGVuIHN0YXJ0aW5nIHRoZSBUaW1lciB1c2luZyBvc1RpbWVyU3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBvc1RpbWVyUGVyaW9kaWMpID8gcGRUUlVFIDogcGRGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAoVGFza0Z1bmN0aW9uX3QpdGltZXJfZGVmLT5wdGltZXIpOworI2VuZGlmCisKKyNlbHNlIAorCXJldHVybiBOVUxMOworI2VuZGlmCit9CisKKy8qKgorKiBAYnJpZWYgIFN0YXJ0IG9yIHJlc3RhcnQgYSB0aW1lci4KKyogQHBhcmFtICB0aW1lcl9pZCAgICAgIHRpbWVyIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaW1lckNyZWF0ZS4KKyogQHBhcmFtICBtaWxsaXNlYyAgICAgIHRpbWUgZGVsYXkgdmFsdWUgb2YgdGhlIHRpbWVyLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGltZXJTdGFydCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NTdGF0dXMgb3NUaW1lclN0YXJ0IChvc1RpbWVySWQgdGltZXJfaWQsIHVpbnQzMl90IG1pbGxpc2VjKQoreworICBvc1N0YXR1cyByZXN1bHQgPSBvc09LOworI2lmIChjb25maWdVU0VfVElNRVJTID09IDEpICAKKyAgcG9ydEJBU0VfVFlQRSB0YXNrV29rZW4gPSBwZEZBTFNFOworICBUaWNrVHlwZV90IHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CisKKyAgaWYgKHRpY2tzID09IDApCisgICAgdGlja3MgPSAxOworICAgIAorICBpZiAoaW5IYW5kbGVyTW9kZSgpKSAKKyAgeworICAgIGlmICh4VGltZXJDaGFuZ2VQZXJpb2RGcm9tSVNSKHRpbWVyX2lkLCB0aWNrcywgJnRhc2tXb2tlbikgIT0gcGRQQVNTKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IG9zRXJyb3JPUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHBvcnRFTkRfU1dJVENISU5HX0lTUih0YXNrV29rZW4pOyAgICAgCisgICAgfQorICB9CisgIGVsc2UgCisgIHsKKyAgICBpZiAoeFRpbWVyQ2hhbmdlUGVyaW9kKHRpbWVyX2lkLCB0aWNrcywgMCkgIT0gcGRQQVNTKQorICAgICAgcmVzdWx0ID0gb3NFcnJvck9TOworICB9CisKKyNlbHNlIAorICByZXN1bHQgPSBvc0Vycm9yT1M7CisjZW5kaWYKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisqIEBicmllZiAgU3RvcCBhIHRpbWVyLgorKiBAcGFyYW0gIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyQ3JlYXRlCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGltZXJTdG9wIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1N0YXR1cyBvc1RpbWVyU3RvcCAob3NUaW1lcklkIHRpbWVyX2lkKQoreworICBvc1N0YXR1cyByZXN1bHQgPSBvc09LOworI2lmIChjb25maWdVU0VfVElNRVJTID09IDEpICAKKyAgcG9ydEJBU0VfVFlQRSB0YXNrV29rZW4gPSBwZEZBTFNFOworCisgIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKKyAgICBpZiAoeFRpbWVyU3RvcEZyb21JU1IodGltZXJfaWQsICZ0YXNrV29rZW4pICE9IHBkUEFTUykgeworICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKKyAgICB9CisgICAgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKHhUaW1lclN0b3AodGltZXJfaWQsIDApICE9IHBkUEFTUykgeworICAgICAgcmVzdWx0ID0gb3NFcnJvck9TOworICAgIH0KKyAgfQorI2Vsc2UgCisgIHJlc3VsdCA9IG9zRXJyb3JPUzsKKyNlbmRpZiAKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisqIEBicmllZiAgRGVsZXRlIGEgdGltZXIuCisqIEBwYXJhbSAgdGltZXJfaWQgICAgICB0aW1lciBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGltZXJDcmVhdGUKKyogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NUaW1lckRlbGV0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NTdGF0dXMgb3NUaW1lckRlbGV0ZSAob3NUaW1lcklkIHRpbWVyX2lkKQoreworb3NTdGF0dXMgcmVzdWx0ID0gb3NPSzsKKworI2lmIChjb25maWdVU0VfVElNRVJTID09IDEpCisKKyAgIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKKyAgICAgcmV0dXJuIG9zRXJyb3JJU1I7CisgIH0KKyAgZWxzZSB7IAorICAgIGlmICgoeFRpbWVyRGVsZXRlKHRpbWVyX2lkLCBvc1dhaXRGb3JldmVyICkpICE9IHBkUEFTUykgeworICAgICAgcmVzdWx0ID0gb3NFcnJvck9TOworICAgIH0KKyAgfSAKKyAgICAKKyNlbHNlIAorICByZXN1bHQgPSBvc0Vycm9yT1M7CisjZW5kaWYgCisgCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIFNpZ25hbCBNYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisqIEBicmllZiAgU2V0IHRoZSBzcGVjaWZpZWQgU2lnbmFsIEZsYWdzIG9mIGFuIGFjdGl2ZSB0aHJlYWQuCisqIEBwYXJhbSAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisqIEBwYXJhbSAgc2lnbmFscyAgICAgICBzcGVjaWZpZXMgdGhlIHNpZ25hbCBmbGFncyBvZiB0aGUgdGhyZWFkIHRoYXQgc2hvdWxkIGJlIHNldC4KKyogQHJldHZhbCBwcmV2aW91cyBzaWduYWwgZmxhZ3Mgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQgb3IgMHg4MDAwMDAwMCBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTaWduYWxTZXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK2ludDMyX3Qgb3NTaWduYWxTZXQgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBpbnQzMl90IHNpZ25hbCkKK3sKKyNpZiggY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyA9PSAxICkJCisgIEJhc2VUeXBlX3QgeEhpZ2hlclByaW9yaXR5VGFza1dva2VuID0gcGRGQUxTRTsKKyAgdWludDMyX3QgdWxQcmV2aW91c05vdGlmaWNhdGlvblZhbHVlID0gMDsKKyAgCisgIGlmIChpbkhhbmRsZXJNb2RlKCkpCisgIHsKKyAgICBpZih4VGFza0dlbmVyaWNOb3RpZnlGcm9tSVNSKCB0aHJlYWRfaWQgLCAodWludDMyX3Qpc2lnbmFsLCBlU2V0Qml0cywgJnVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZSwgJnhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApICE9IHBkUEFTUyApCisgICAgICByZXR1cm4gMHg4MDAwMDAwMDsKKyAgICAKKyAgICBwb3J0WUlFTERfRlJPTV9JU1IoIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworICB9ICAKKyAgZWxzZSBpZih4VGFza0dlbmVyaWNOb3RpZnkoIHRocmVhZF9pZCAsICh1aW50MzJfdClzaWduYWwsIGVTZXRCaXRzLCAmdWxQcmV2aW91c05vdGlmaWNhdGlvblZhbHVlKSAhPSBwZFBBU1MgKQorICAgIHJldHVybiAweDgwMDAwMDAwOworICAKKyAgcmV0dXJuIHVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZTsKKyNlbHNlCisgICh2b2lkKSB0aHJlYWRfaWQ7CisgICh2b2lkKSBzaWduYWw7CisKKyAgcmV0dXJuIDB4ODAwMDAwMDA7IC8qIFRhc2sgTm90aWZpY2F0aW9uIG5vdCBzdXBwb3J0ZWQgKi8gCQorI2VuZGlmCit9CisKKy8qKgorKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgU2lnbmFsIEZsYWdzIG9mIGFuIGFjdGl2ZSB0aHJlYWQuCisqIEBwYXJhbSAgdGhyZWFkX2lkICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisqIEBwYXJhbSAgc2lnbmFscyAgICBzcGVjaWZpZXMgdGhlIHNpZ25hbCBmbGFncyBvZiB0aGUgdGhyZWFkIHRoYXQgc2hhbGwgYmUgY2xlYXJlZC4KKyogQHJldHZhbCAgcHJldmlvdXMgc2lnbmFsIGZsYWdzIG9mIHRoZSBzcGVjaWZpZWQgdGhyZWFkIG9yIDB4ODAwMDAwMDAgaW4gY2FzZSBvZiBpbmNvcnJlY3QgcGFyYW1ldGVycy4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zU2lnbmFsQ2xlYXIgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK2ludDMyX3Qgb3NTaWduYWxDbGVhciAob3NUaHJlYWRJZCB0aHJlYWRfaWQsIGludDMyX3Qgc2lnbmFsKTsKKworLyoqCisqIEBicmllZiAgV2FpdCBmb3Igb25lIG9yIG1vcmUgU2lnbmFsIEZsYWdzIHRvIGJlY29tZSBzaWduYWxlZCBmb3IgdGhlIGN1cnJlbnQgXGIgUlVOTklORyB0aHJlYWQuCisqIEBwYXJhbSAgc2lnbmFscyAgIHdhaXQgdW50aWwgYWxsIHNwZWNpZmllZCBzaWduYWwgZmxhZ3Mgc2V0IG9yIDAgZm9yIGFueSBzaW5nbGUgc2lnbmFsIGZsYWcuCisqIEBwYXJhbSAgbWlsbGlzZWMgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgorKiBAcmV0dmFsICBldmVudCBmbGFnIGluZm9ybWF0aW9uIG9yIGVycm9yIGNvZGUuCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NpZ25hbFdhaXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK29zRXZlbnQgb3NTaWduYWxXYWl0IChpbnQzMl90IHNpZ25hbHMsIHVpbnQzMl90IG1pbGxpc2VjKQoreworICBvc0V2ZW50IHJldDsKKworI2lmKCBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TID09IDEgKQorCQorICBUaWNrVHlwZV90IHRpY2tzOworCisgIHJldC52YWx1ZS5zaWduYWxzID0gMDsgIAorICB0aWNrcyA9IDA7CisgIGlmIChtaWxsaXNlYyA9PSBvc1dhaXRGb3JldmVyKSB7CisgICAgdGlja3MgPSBwb3J0TUFYX0RFTEFZOworICB9CisgIGVsc2UgaWYgKG1pbGxpc2VjICE9IDApIHsKKyAgICB0aWNrcyA9IG1pbGxpc2VjIC8gcG9ydFRJQ0tfUEVSSU9EX01TOworICAgIGlmICh0aWNrcyA9PSAwKSB7CisgICAgICB0aWNrcyA9IDE7CisgICAgfQorICB9ICAKKyAgCisgIGlmIChpbkhhbmRsZXJNb2RlKCkpCisgIHsKKyAgICByZXQuc3RhdHVzID0gb3NFcnJvcklTUjsgIC8qTm90IGFsbG93ZWQgaW4gSVNSKi8KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZih4VGFza05vdGlmeVdhaXQoIDAsKHVpbnQzMl90KSBzaWduYWxzLCAodWludDMyX3QgKikmcmV0LnZhbHVlLnNpZ25hbHMsIHRpY2tzKSAhPSBwZFRSVUUpCisgICAgeworICAgICAgaWYodGlja3MgPT0gMCkgIHJldC5zdGF0dXMgPSBvc09LOworICAgICAgZWxzZSAgcmV0LnN0YXR1cyA9IG9zRXZlbnRUaW1lb3V0OworICAgIH0KKyAgICBlbHNlIGlmKHJldC52YWx1ZS5zaWduYWxzIDwgMCkKKyAgICB7CisgICAgICByZXQuc3RhdHVzID0gIG9zRXJyb3JWYWx1ZTsgICAgIAorICAgIH0KKyAgICBlbHNlICByZXQuc3RhdHVzID0gIG9zRXZlbnRTaWduYWw7CisgIH0KKyNlbHNlCisgICh2b2lkKSBzaWduYWxzOworICAodm9pZCkgbWlsbGlzZWM7CisJCisgIHJldC5zdGF0dXMgPSAgb3NFcnJvck9TOwkvKiBUYXNrIE5vdGlmaWNhdGlvbiBub3Qgc3VwcG9ydGVkICovCisjZW5kaWYKKyAgCisgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNdXRleCBNYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisqIEBicmllZiAgQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgTXV0ZXggb2JqZWN0CisqIEBwYXJhbSAgbXV0ZXhfZGVmICAgICBtdXRleCBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zTXV0ZXguCisqIEByZXR2YWwgIG11dGV4IElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTXV0ZXhDcmVhdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK29zTXV0ZXhJZCBvc011dGV4Q3JlYXRlIChjb25zdCBvc011dGV4RGVmX3QgKm11dGV4X2RlZikKK3sKKyNpZiAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEpCisKKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKworICBpZiAobXV0ZXhfZGVmLT5jb250cm9sYmxvY2sgIT0gTlVMTCkgeworICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlTXV0ZXhTdGF0aWMoIG11dGV4X2RlZi0+Y29udHJvbGJsb2NrICk7CisgICAgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIHhTZW1hcGhvcmVDcmVhdGVNdXRleCgpOyAKKyAgfQorI2VsaWYgKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorICByZXR1cm4geFNlbWFwaG9yZUNyZWF0ZU11dGV4U3RhdGljKCBtdXRleF9kZWYtPmNvbnRyb2xibG9jayApOworI2Vsc2UgIAorICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlTXV0ZXgoKTsgCisjZW5kaWYKKyNlbHNlCisgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKKy8qKgorKiBAYnJpZWYgV2FpdCB1bnRpbCBhIE11dGV4IGJlY29tZXMgYXZhaWxhYmxlCisqIEBwYXJhbSBtdXRleF9pZCAgICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleENyZWF0ZS4KKyogQHBhcmFtIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTXV0ZXhXYWl0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1N0YXR1cyBvc011dGV4V2FpdCAob3NNdXRleElkIG11dGV4X2lkLCB1aW50MzJfdCBtaWxsaXNlYykKK3sKKyAgVGlja1R5cGVfdCB0aWNrczsKKyAgcG9ydEJBU0VfVFlQRSB0YXNrV29rZW4gPSBwZEZBTFNFOyAgCisgIAorICAKKyAgaWYgKG11dGV4X2lkID09IE5VTEwpIHsKKyAgICByZXR1cm4gb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICAKKyAgdGlja3MgPSAwOworICBpZiAobWlsbGlzZWMgPT0gb3NXYWl0Rm9yZXZlcikgeworICAgIHRpY2tzID0gcG9ydE1BWF9ERUxBWTsKKyAgfQorICBlbHNlIGlmIChtaWxsaXNlYyAhPSAwKSB7CisgICAgdGlja3MgPSBtaWxsaXNlYyAvIHBvcnRUSUNLX1BFUklPRF9NUzsKKyAgICBpZiAodGlja3MgPT0gMCkgeworICAgICAgdGlja3MgPSAxOworICAgIH0KKyAgfQorICAKKyAgaWYgKGluSGFuZGxlck1vZGUoKSkgeworICAgIGlmICh4U2VtYXBob3JlVGFrZUZyb21JU1IobXV0ZXhfaWQsICZ0YXNrV29rZW4pICE9IHBkVFJVRSkgeworICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKKyAgICB9CisJcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CisgIH0gCisgIGVsc2UgaWYgKHhTZW1hcGhvcmVUYWtlKG11dGV4X2lkLCB0aWNrcykgIT0gcGRUUlVFKSB7CisgICAgcmV0dXJuIG9zRXJyb3JPUzsKKyAgfQorICAKKyAgcmV0dXJuIG9zT0s7Cit9CisKKy8qKgorKiBAYnJpZWYgUmVsZWFzZSBhIE11dGV4IHRoYXQgd2FzIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleFdhaXQKKyogQHBhcmFtIG11dGV4X2lkICAgICAgbXV0ZXggSUQgb2J0YWluZWQgYnkgXHJlZiBvc011dGV4Q3JlYXRlLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc011dGV4UmVsZWFzZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NTdGF0dXMgb3NNdXRleFJlbGVhc2UgKG9zTXV0ZXhJZCBtdXRleF9pZCkKK3sKKyAgb3NTdGF0dXMgcmVzdWx0ID0gb3NPSzsKKyAgcG9ydEJBU0VfVFlQRSB0YXNrV29rZW4gPSBwZEZBTFNFOworICAKKyAgaWYgKGluSGFuZGxlck1vZGUoKSkgeworICAgIGlmICh4U2VtYXBob3JlR2l2ZUZyb21JU1IobXV0ZXhfaWQsICZ0YXNrV29rZW4pICE9IHBkVFJVRSkgeworICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKKyAgICB9CisgICAgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CisgIH0KKyAgZWxzZSBpZiAoeFNlbWFwaG9yZUdpdmUobXV0ZXhfaWQpICE9IHBkVFJVRSkgCisgIHsKKyAgICByZXN1bHQgPSBvc0Vycm9yT1M7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisqIEBicmllZiBEZWxldGUgYSBNdXRleAorKiBAcGFyYW0gbXV0ZXhfaWQgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleENyZWF0ZS4KKyogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNdXRleERlbGV0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NTdGF0dXMgb3NNdXRleERlbGV0ZSAob3NNdXRleElkIG11dGV4X2lkKQoreworICBpZiAoaW5IYW5kbGVyTW9kZSgpKSB7CisgICAgcmV0dXJuIG9zRXJyb3JJU1I7CisgIH0KKworICB2UXVldWVEZWxldGUobXV0ZXhfaWQpOworCisgIHJldHVybiBvc09LOworfQorCisvKioqKioqKioqKioqKioqKioqKiogIFNlbWFwaG9yZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfU2VtYXBob3JlKSAgJiYgIChvc0ZlYXR1cmVfU2VtYXBob3JlICE9IDApKQorCisvKioKKyogQGJyaWVmIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIFNlbWFwaG9yZSBvYmplY3QgdXNlZCBmb3IgbWFuYWdpbmcgcmVzb3VyY2VzCisqIEBwYXJhbSBzZW1hcGhvcmVfZGVmIHNlbWFwaG9yZSBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlLgorKiBAcGFyYW0gY291bnQgICAgICAgICBudW1iZXIgb2YgYXZhaWxhYmxlIHJlc291cmNlcy4KKyogQHJldHZhbCAgc2VtYXBob3JlIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zU2VtYXBob3JlQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1NlbWFwaG9yZUlkIG9zU2VtYXBob3JlQ3JlYXRlIChjb25zdCBvc1NlbWFwaG9yZURlZl90ICpzZW1hcGhvcmVfZGVmLCBpbnQzMl90IGNvdW50KQoreyAKKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKworICBvc1NlbWFwaG9yZUlkIHNlbWE7CisgIAorICBpZiAoc2VtYXBob3JlX2RlZi0+Y29udHJvbGJsb2NrICE9IE5VTEwpeworICAgIGlmIChjb3VudCA9PSAxKSB7CisgICAgICByZXR1cm4geFNlbWFwaG9yZUNyZWF0ZUJpbmFyeVN0YXRpYyggc2VtYXBob3JlX2RlZi0+Y29udHJvbGJsb2NrICk7CisgICAgfQorICAgIGVsc2UgeworI2lmIChjb25maWdVU0VfQ09VTlRJTkdfU0VNQVBIT1JFUyA9PSAxICkKKyAgICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmdTdGF0aWMoIGNvdW50LCBjb3VudCwgc2VtYXBob3JlX2RlZi0+Y29udHJvbGJsb2NrICk7CisjZWxzZQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKGNvdW50ID09IDEpIHsKKyAgICAgIHZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoc2VtYSk7CisgICAgICByZXR1cm4gc2VtYTsKKyAgICB9CisgICAgZWxzZSB7CisjaWYgKGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTID09IDEgKQkKKyAgICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoY291bnQsIGNvdW50KTsKKyNlbHNlCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZiAgICAKKyAgICB9CisgIH0KKyNlbGlmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgLy8gY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMAorICBpZihjb3VudCA9PSAxKSB7CisgICAgcmV0dXJuIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnlTdGF0aWMoIHNlbWFwaG9yZV9kZWYtPmNvbnRyb2xibG9jayApOworICB9CisgIGVsc2UKKyAgeworI2lmIChjb25maWdVU0VfQ09VTlRJTkdfU0VNQVBIT1JFUyA9PSAxICkKKyAgICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmdTdGF0aWMoIGNvdW50LCBjb3VudCwgc2VtYXBob3JlX2RlZi0+Y29udHJvbGJsb2NrICk7CisjZWxzZQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYgICAgCisgIH0KKyNlbHNlICAvLyBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDAgICYmIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEKKyAgb3NTZW1hcGhvcmVJZCBzZW1hOworIAorICBpZiAoY291bnQgPT0gMSkgeworICAgIHZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoc2VtYSk7CisgICAgcmV0dXJuIHNlbWE7CisgIH0KKyAgZWxzZSB7CisjaWYgKGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTID09IDEgKQkKKyAgICByZXR1cm4geFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nKGNvdW50LCBjb3VudCk7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIH0KKyNlbmRpZgorfQorCisvKioKKyogQGJyaWVmIFdhaXQgdW50aWwgYSBTZW1hcGhvcmUgdG9rZW4gYmVjb21lcyBhdmFpbGFibGUKKyogQHBhcmFtICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmUuCisqIEBwYXJhbSAgbWlsbGlzZWMgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKyogQHJldHZhbCAgbnVtYmVyIG9mIGF2YWlsYWJsZSB0b2tlbnMsIG9yIC0xIGluIGNhc2Ugb2YgaW5jb3JyZWN0IHBhcmFtZXRlcnMuCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NlbWFwaG9yZVdhaXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK2ludDMyX3Qgb3NTZW1hcGhvcmVXYWl0IChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpCit7CisgIFRpY2tUeXBlX3QgdGlja3M7CisgIHBvcnRCQVNFX1RZUEUgdGFza1dva2VuID0gcGRGQUxTRTsgIAorICAKKyAgCisgIGlmIChzZW1hcGhvcmVfaWQgPT0gTlVMTCkgeworICAgIHJldHVybiBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIAorICB0aWNrcyA9IDA7CisgIGlmIChtaWxsaXNlYyA9PSBvc1dhaXRGb3JldmVyKSB7CisgICAgdGlja3MgPSBwb3J0TUFYX0RFTEFZOworICB9CisgIGVsc2UgaWYgKG1pbGxpc2VjICE9IDApIHsKKyAgICB0aWNrcyA9IG1pbGxpc2VjIC8gcG9ydFRJQ0tfUEVSSU9EX01TOworICAgIGlmICh0aWNrcyA9PSAwKSB7CisgICAgICB0aWNrcyA9IDE7CisgICAgfQorICB9CisgIAorICBpZiAoaW5IYW5kbGVyTW9kZSgpKSB7CisgICAgaWYgKHhTZW1hcGhvcmVUYWtlRnJvbUlTUihzZW1hcGhvcmVfaWQsICZ0YXNrV29rZW4pICE9IHBkVFJVRSkgeworICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKKyAgICB9CisJcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CisgIH0gIAorICBlbHNlIGlmICh4U2VtYXBob3JlVGFrZShzZW1hcGhvcmVfaWQsIHRpY2tzKSAhPSBwZFRSVUUpIHsKKyAgICByZXR1cm4gb3NFcnJvck9TOworICB9CisgIAorICByZXR1cm4gb3NPSzsKK30KKworLyoqCisqIEBicmllZiBSZWxlYXNlIGEgU2VtYXBob3JlIHRva2VuCisqIEBwYXJhbSAgc2VtYXBob3JlX2lkICBzZW1hcGhvcmUgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NlbWFwaG9yZVJlbGVhc2Ugc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK29zU3RhdHVzIG9zU2VtYXBob3JlUmVsZWFzZSAob3NTZW1hcGhvcmVJZCBzZW1hcGhvcmVfaWQpCit7CisgIG9zU3RhdHVzIHJlc3VsdCA9IG9zT0s7CisgIHBvcnRCQVNFX1RZUEUgdGFza1dva2VuID0gcGRGQUxTRTsKKyAgCisgIAorICBpZiAoaW5IYW5kbGVyTW9kZSgpKSB7CisgICAgaWYgKHhTZW1hcGhvcmVHaXZlRnJvbUlTUihzZW1hcGhvcmVfaWQsICZ0YXNrV29rZW4pICE9IHBkVFJVRSkgeworICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKKyAgICB9CisgICAgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKHhTZW1hcGhvcmVHaXZlKHNlbWFwaG9yZV9pZCkgIT0gcGRUUlVFKSB7CisgICAgICByZXN1bHQgPSBvc0Vycm9yT1M7CisgICAgfQorICB9CisgIAorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyogQGJyaWVmIERlbGV0ZSBhIFNlbWFwaG9yZQorKiBAcGFyYW0gIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlIG9iamVjdCByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1NlbWFwaG9yZS4KKyogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTZW1hcGhvcmVEZWxldGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK29zU3RhdHVzIG9zU2VtYXBob3JlRGVsZXRlIChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCkKK3sKKyAgaWYgKGluSGFuZGxlck1vZGUoKSkgeworICAgIHJldHVybiBvc0Vycm9ySVNSOworICB9CisKKyAgdlNlbWFwaG9yZURlbGV0ZShzZW1hcGhvcmVfaWQpOworCisgIHJldHVybiBvc09LOyAKK30KKworI2VuZGlmICAgIC8qIFVzZSBTZW1hcGhvcmVzICovCisKKy8qKioqKioqKioqKioqKioqKioqICAgTWVtb3J5IFBvb2wgTWFuYWdlbWVudCBGdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKGRlZmluZWQgKG9zRmVhdHVyZV9Qb29sKSAgJiYgIChvc0ZlYXR1cmVfUG9vbCAhPSAwKSkgCisKKy8vVE9ETworLy9UaGlzIGlzIGEgcHJpbWl0aXZlIGFuZCBpbmVmZmljaWVudCB3cmFwcGVyIGFyb3VuZCB0aGUgZXhpc3RpbmcgRnJlZVJUT1MgbWVtb3J5IG1hbmFnZW1lbnQuCisvL0EgYmV0dGVyIGltcGxlbWVudGF0aW9uIHdpbGwgaGF2ZSB0byBtb2RpZnkgaGVhcF94LmMhCisKKwordHlwZWRlZiBzdHJ1Y3Qgb3NfcG9vbF9jYiB7CisgIHZvaWQgKnBvb2w7CisgIHVpbnQ4X3QgKm1hcmtlcnM7CisgIHVpbnQzMl90IHBvb2xfc3o7CisgIHVpbnQzMl90IGl0ZW1fc3o7CisgIHVpbnQzMl90IGN1cnJlbnRJbmRleDsKK30gb3NfcG9vbF9jYl90OworCisKKy8qKgorKiBAYnJpZWYgQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgbWVtb3J5IHBvb2wKKyogQHBhcmFtICBwb29sX2RlZiAgICAgIG1lbW9yeSBwb29sIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NQb29sLgorKiBAcmV0dmFsICBtZW1vcnkgcG9vbCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1Bvb2xDcmVhdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK29zUG9vbElkIG9zUG9vbENyZWF0ZSAoY29uc3Qgb3NQb29sRGVmX3QgKnBvb2xfZGVmKQoreworI2lmIChjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxKQorICBvc1Bvb2xJZCB0aGVQb29sOworICBpbnQgaXRlbVNpemUgPSA0ICogKChwb29sX2RlZi0+aXRlbV9zeiArIDMpIC8gNCk7CisgIHVpbnQzMl90IGk7CisgIAorICAvKiBGaXJzdCBoYXZlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBvb2wgY29udHJvbCBibG9jay4gKi8KKyB0aGVQb29sID0gcHZQb3J0TWFsbG9jKHNpemVvZihvc19wb29sX2NiX3QpKTsKKworICAKKyAgaWYgKHRoZVBvb2wpIHsKKyAgICB0aGVQb29sLT5wb29sX3N6ID0gcG9vbF9kZWYtPnBvb2xfc3o7CisgICAgdGhlUG9vbC0+aXRlbV9zeiA9IGl0ZW1TaXplOworICAgIHRoZVBvb2wtPmN1cnJlbnRJbmRleCA9IDA7CisgICAgCisgICAgLyogTWVtb3J5IGZvciBtYXJrZXJzICovCisgICAgdGhlUG9vbC0+bWFya2VycyA9IHB2UG9ydE1hbGxvYyhwb29sX2RlZi0+cG9vbF9zeik7CisgICAKKyAgICBpZiAodGhlUG9vbC0+bWFya2VycykgeworICAgICAgLyogTm93IGFsbG9jYXRlIHRoZSBwb29sIGl0c2VsZi4gKi8KKyAgICAgdGhlUG9vbC0+cG9vbCA9IHB2UG9ydE1hbGxvYyhwb29sX2RlZi0+cG9vbF9zeiAqIGl0ZW1TaXplKTsKKyAgICAgIAorICAgICAgaWYgKHRoZVBvb2wtPnBvb2wpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvb2xfZGVmLT5wb29sX3N6OyBpKyspIHsKKyAgICAgICAgICB0aGVQb29sLT5tYXJrZXJzW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHZQb3J0RnJlZSh0aGVQb29sLT5tYXJrZXJzKTsKKyAgICAgICAgdlBvcnRGcmVlKHRoZVBvb2wpOworICAgICAgICB0aGVQb29sID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICB2UG9ydEZyZWUodGhlUG9vbCk7CisgICAgICB0aGVQb29sID0gTlVMTDsKKyAgICB9CisgIH0KKworICByZXR1cm4gdGhlUG9vbDsKKyAKKyNlbHNlCisgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKKy8qKgorKiBAYnJpZWYgQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1lbW9yeSBwb29sCisqIEBwYXJhbSBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCisqIEByZXR2YWwgIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb3IgTlVMTCBpbiBjYXNlIG9mIG5vIG1lbW9yeSBhdmFpbGFibGUuCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1Bvb2xBbGxvYyBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLwordm9pZCAqb3NQb29sQWxsb2MgKG9zUG9vbElkIHBvb2xfaWQpCit7CisgIGludCBkdW1teSA9IDA7CisgIHZvaWQgKnAgPSBOVUxMOworICB1aW50MzJfdCBpOworICB1aW50MzJfdCBpbmRleDsKKyAgCisgIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKKyAgICBkdW1teSA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKyAgfQorICBlbHNlIHsKKyAgICB2UG9ydEVudGVyQ3JpdGljYWwoKTsKKyAgfQorICAKKyAgZm9yIChpID0gMDsgaSA8IHBvb2xfaWQtPnBvb2xfc3o7IGkrKykgeworICAgIGluZGV4ID0gKHBvb2xfaWQtPmN1cnJlbnRJbmRleCArIGkpICUgcG9vbF9pZC0+cG9vbF9zejsKKyAgICAKKyAgICBpZiAocG9vbF9pZC0+bWFya2Vyc1tpbmRleF0gPT0gMCkgeworICAgICAgcG9vbF9pZC0+bWFya2Vyc1tpbmRleF0gPSAxOworICAgICAgcCA9ICh2b2lkICopKCh1aW50MzJfdCkocG9vbF9pZC0+cG9vbCkgKyAoaW5kZXggKiBwb29sX2lkLT5pdGVtX3N6KSk7CisgICAgICBwb29sX2lkLT5jdXJyZW50SW5kZXggPSBpbmRleDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAKKyAgaWYgKGluSGFuZGxlck1vZGUoKSkgeworICAgIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUihkdW1teSk7CisgIH0KKyAgZWxzZSB7CisgICAgdlBvcnRFeGl0Q3JpdGljYWwoKTsKKyAgfQorICAKKyAgcmV0dXJuIHA7Cit9CisKKy8qKgorKiBAYnJpZWYgQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1lbW9yeSBwb29sIGFuZCBzZXQgbWVtb3J5IGJsb2NrIHRvIHplcm8KKyogQHBhcmFtICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCisqIEByZXR2YWwgIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb3IgTlVMTCBpbiBjYXNlIG9mIG5vIG1lbW9yeSBhdmFpbGFibGUuCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1Bvb2xDQWxsb2Mgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK3ZvaWQgKm9zUG9vbENBbGxvYyAob3NQb29sSWQgcG9vbF9pZCkKK3sKKyAgdm9pZCAqcCA9IG9zUG9vbEFsbG9jKHBvb2xfaWQpOworICAKKyAgaWYgKHAgIT0gTlVMTCkKKyAgeworICAgIG1lbXNldChwLCAwLCBzaXplb2YocG9vbF9pZC0+cG9vbF9zeikpOworICB9CisgIAorICByZXR1cm4gcDsKK30KKworLyoqCisqIEBicmllZiBSZXR1cm4gYW4gYWxsb2NhdGVkIG1lbW9yeSBibG9jayBiYWNrIHRvIGEgc3BlY2lmaWMgbWVtb3J5IHBvb2wKKyogQHBhcmFtICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCisqIEBwYXJhbSAgYmxvY2sgICAgICAgICBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIHRoYXQgaXMgcmV0dXJuZWQgdG8gdGhlIG1lbW9yeSBwb29sLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqIEBub3RlICAgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1Bvb2xGcmVlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1N0YXR1cyBvc1Bvb2xGcmVlIChvc1Bvb2xJZCBwb29sX2lkLCB2b2lkICpibG9jaykKK3sKKyAgdWludDMyX3QgaW5kZXg7CisgIAorICBpZiAocG9vbF9pZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgCisgIGlmIChibG9jayA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgCisgIGlmIChibG9jayA8IHBvb2xfaWQtPnBvb2wpIHsKKyAgICByZXR1cm4gb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICAKKyAgaW5kZXggPSAodWludDMyX3QpYmxvY2sgLSAodWludDMyX3QpKHBvb2xfaWQtPnBvb2wpOworICBpZiAoaW5kZXggJSBwb29sX2lkLT5pdGVtX3N6KSB7CisgICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgaW5kZXggPSBpbmRleCAvIHBvb2xfaWQtPml0ZW1fc3o7CisgIGlmIChpbmRleCA+PSBwb29sX2lkLT5wb29sX3N6KSB7CisgICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgCisgIHBvb2xfaWQtPm1hcmtlcnNbaW5kZXhdID0gMDsKKyAgCisgIHJldHVybiBvc09LOworfQorCisKKyNlbmRpZiAgIC8qIFVzZSBNZW1vcnkgUG9vbCBNYW5hZ2VtZW50ICovCisKKy8qKioqKioqKioqKioqKioqKioqICAgTWVzc2FnZSBRdWV1ZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKGRlZmluZWQgKG9zRmVhdHVyZV9NZXNzYWdlUSkgICYmICAob3NGZWF0dXJlX01lc3NhZ2VRICE9IDApKSAvKiBVc2UgTWVzc2FnZSBRdWV1ZXMgKi8KKworLyoqCisqIEBicmllZiBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBNZXNzYWdlIFF1ZXVlCisqIEBwYXJhbSBxdWV1ZV9kZWYgICAgIHF1ZXVlIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NNZXNzYWdlUS4KKyogQHBhcmFtICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCAob2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQpIG9yIE5VTEwuCisqIEByZXR2YWwgIG1lc3NhZ2UgcXVldWUgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNZXNzYWdlQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc01lc3NhZ2VRSWQgb3NNZXNzYWdlQ3JlYXRlIChjb25zdCBvc01lc3NhZ2VRRGVmX3QgKnF1ZXVlX2RlZiwgb3NUaHJlYWRJZCB0aHJlYWRfaWQpCit7CisgICh2b2lkKSB0aHJlYWRfaWQ7CisgIAorI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCisgIGlmICgocXVldWVfZGVmLT5idWZmZXIgIT0gTlVMTCkgJiYgKHF1ZXVlX2RlZi0+Y29udHJvbGJsb2NrICE9IE5VTEwpKSB7CisgICAgcmV0dXJuIHhRdWV1ZUNyZWF0ZVN0YXRpYyhxdWV1ZV9kZWYtPnF1ZXVlX3N6LCBxdWV1ZV9kZWYtPml0ZW1fc3osIHF1ZXVlX2RlZi0+YnVmZmVyLCBxdWV1ZV9kZWYtPmNvbnRyb2xibG9jayk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIHhRdWV1ZUNyZWF0ZShxdWV1ZV9kZWYtPnF1ZXVlX3N6LCBxdWV1ZV9kZWYtPml0ZW1fc3opOworICB9CisjZWxpZiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisgIHJldHVybiB4UXVldWVDcmVhdGVTdGF0aWMocXVldWVfZGVmLT5xdWV1ZV9zeiwgcXVldWVfZGVmLT5pdGVtX3N6LCBxdWV1ZV9kZWYtPmJ1ZmZlciwgcXVldWVfZGVmLT5jb250cm9sYmxvY2spOworI2Vsc2UgIAorICByZXR1cm4geFF1ZXVlQ3JlYXRlKHF1ZXVlX2RlZi0+cXVldWVfc3osIHF1ZXVlX2RlZi0+aXRlbV9zeik7CisjZW5kaWYKK30KKworLyoqCisqIEBicmllZiBQdXQgYSBNZXNzYWdlIHRvIGEgUXVldWUuCisqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKyogQHBhcmFtICBpbmZvICAgICAgbWVzc2FnZSBpbmZvcm1hdGlvbi4KKyogQHBhcmFtICBtaWxsaXNlYyAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisqIEByZXR2YWwgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNZXNzYWdlUHV0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1N0YXR1cyBvc01lc3NhZ2VQdXQgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCwgdWludDMyX3QgaW5mbywgdWludDMyX3QgbWlsbGlzZWMpCit7CisgIHBvcnRCQVNFX1RZUEUgdGFza1dva2VuID0gcGRGQUxTRTsKKyAgVGlja1R5cGVfdCB0aWNrczsKKyAgCisgIHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CisgIGlmICh0aWNrcyA9PSAwKSB7CisgICAgdGlja3MgPSAxOworICB9CisgIAorICBpZiAoaW5IYW5kbGVyTW9kZSgpKSB7CisgICAgaWYgKHhRdWV1ZVNlbmRGcm9tSVNSKHF1ZXVlX2lkLCAmaW5mbywgJnRhc2tXb2tlbikgIT0gcGRUUlVFKSB7CisgICAgICByZXR1cm4gb3NFcnJvck9TOworICAgIH0KKyAgICBwb3J0RU5EX1NXSVRDSElOR19JU1IodGFza1dva2VuKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoeFF1ZXVlU2VuZChxdWV1ZV9pZCwgJmluZm8sIHRpY2tzKSAhPSBwZFRSVUUpIHsKKyAgICAgIHJldHVybiBvc0Vycm9yT1M7CisgICAgfQorICB9CisgIAorICByZXR1cm4gb3NPSzsKK30KKworLyoqCisqIEBicmllZiBHZXQgYSBNZXNzYWdlIG9yIFdhaXQgZm9yIGEgTWVzc2FnZSBmcm9tIGEgUXVldWUuCisqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKyogQHBhcmFtICBtaWxsaXNlYyAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisqIEByZXR2YWwgZXZlbnQgaW5mb3JtYXRpb24gdGhhdCBpbmNsdWRlcyBzdGF0dXMgY29kZS4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWVzc2FnZUdldCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NFdmVudCBvc01lc3NhZ2VHZXQgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpCit7CisgIHBvcnRCQVNFX1RZUEUgdGFza1dva2VuOworICBUaWNrVHlwZV90IHRpY2tzOworICBvc0V2ZW50IGV2ZW50OworICAKKyAgZXZlbnQuZGVmLm1lc3NhZ2VfaWQgPSBxdWV1ZV9pZDsKKyAgZXZlbnQudmFsdWUudiA9IDA7CisgIAorICBpZiAocXVldWVfaWQgPT0gTlVMTCkgeworICAgIGV2ZW50LnN0YXR1cyA9IG9zRXJyb3JQYXJhbWV0ZXI7CisgICAgcmV0dXJuIGV2ZW50OworICB9CisgIAorICB0YXNrV29rZW4gPSBwZEZBTFNFOworICAKKyAgdGlja3MgPSAwOworICBpZiAobWlsbGlzZWMgPT0gb3NXYWl0Rm9yZXZlcikgeworICAgIHRpY2tzID0gcG9ydE1BWF9ERUxBWTsKKyAgfQorICBlbHNlIGlmIChtaWxsaXNlYyAhPSAwKSB7CisgICAgdGlja3MgPSBtaWxsaXNlYyAvIHBvcnRUSUNLX1BFUklPRF9NUzsKKyAgICBpZiAodGlja3MgPT0gMCkgeworICAgICAgdGlja3MgPSAxOworICAgIH0KKyAgfQorICAKKyAgaWYgKGluSGFuZGxlck1vZGUoKSkgeworICAgIGlmICh4UXVldWVSZWNlaXZlRnJvbUlTUihxdWV1ZV9pZCwgJmV2ZW50LnZhbHVlLnYsICZ0YXNrV29rZW4pID09IHBkVFJVRSkgeworICAgICAgLyogV2UgaGF2ZSBtYWlsICovCisgICAgICBldmVudC5zdGF0dXMgPSBvc0V2ZW50TWVzc2FnZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBldmVudC5zdGF0dXMgPSBvc09LOworICAgIH0KKyAgICBwb3J0RU5EX1NXSVRDSElOR19JU1IodGFza1dva2VuKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoeFF1ZXVlUmVjZWl2ZShxdWV1ZV9pZCwgJmV2ZW50LnZhbHVlLnYsIHRpY2tzKSA9PSBwZFRSVUUpIHsKKyAgICAgIC8qIFdlIGhhdmUgbWFpbCAqLworICAgICAgZXZlbnQuc3RhdHVzID0gb3NFdmVudE1lc3NhZ2U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZXZlbnQuc3RhdHVzID0gKHRpY2tzID09IDApID8gb3NPSyA6IG9zRXZlbnRUaW1lb3V0OworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIGV2ZW50OworfQorCisjZW5kaWYgICAgIC8qIFVzZSBNZXNzYWdlIFF1ZXVlcyAqLworCisvKioqKioqKioqKioqKioqKioqKiogICBNYWlsIFF1ZXVlIE1hbmFnZW1lbnQgRnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX01haWxRKSAgJiYgIChvc0ZlYXR1cmVfTWFpbFEgIT0gMCkpICAvKiBVc2UgTWFpbCBRdWV1ZXMgKi8KKworCit0eXBlZGVmIHN0cnVjdCBvc19tYWlsUV9jYiB7CisgIGNvbnN0IG9zTWFpbFFEZWZfdCAqcXVldWVfZGVmOworICBRdWV1ZUhhbmRsZV90IGhhbmRsZTsKKyAgb3NQb29sSWQgcG9vbDsKK30gb3NfbWFpbFFfY2JfdDsKKworLyoqCisqIEBicmllZiBDcmVhdGUgYW5kIEluaXRpYWxpemUgbWFpbCBxdWV1ZQorKiBAcGFyYW0gIHF1ZXVlX2RlZiAgICAgcmVmZXJlbmNlIHRvIHRoZSBtYWlsIHF1ZXVlIGRlZmluaXRpb24gb2J0YWluIHdpdGggXHJlZiBvc01haWxRCisqIEBwYXJhbSAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIChvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZCkgb3IgTlVMTC4KKyogQHJldHZhbCBtYWlsIHF1ZXVlIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWFpbENyZWF0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NNYWlsUUlkIG9zTWFpbENyZWF0ZSAoY29uc3Qgb3NNYWlsUURlZl90ICpxdWV1ZV9kZWYsIG9zVGhyZWFkSWQgdGhyZWFkX2lkKQoreworI2lmIChjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxKQorICAodm9pZCkgdGhyZWFkX2lkOworICAKKyAgb3NQb29sRGVmX3QgcG9vbF9kZWYgPSB7cXVldWVfZGVmLT5xdWV1ZV9zeiwgcXVldWVfZGVmLT5pdGVtX3N6LCBOVUxMfTsKKyAgCisgIC8qIENyZWF0ZSBhIG1haWwgcXVldWUgY29udHJvbCBibG9jayAqLworCisgICoocXVldWVfZGVmLT5jYikgPSBwdlBvcnRNYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc19tYWlsUV9jYikpOworCisgIGlmICgqKHF1ZXVlX2RlZi0+Y2IpID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAoKihxdWV1ZV9kZWYtPmNiKSktPnF1ZXVlX2RlZiA9IHF1ZXVlX2RlZjsKKyAgCisgIC8qIENyZWF0ZSBhIHF1ZXVlIGluIEZyZWVSVE9TICovCisgICgqKHF1ZXVlX2RlZi0+Y2IpKS0+aGFuZGxlID0geFF1ZXVlQ3JlYXRlKHF1ZXVlX2RlZi0+cXVldWVfc3osIHNpemVvZih2b2lkICopKTsKKworCisgIGlmICgoKihxdWV1ZV9kZWYtPmNiKSktPmhhbmRsZSA9PSBOVUxMKSB7CisgICAgdlBvcnRGcmVlKCoocXVldWVfZGVmLT5jYikpOworICAgIHJldHVybiBOVUxMOworICB9CisgIAorICAvKiBDcmVhdGUgYSBtYWlsIHBvb2wgKi8KKyAgKCoocXVldWVfZGVmLT5jYikpLT5wb29sID0gb3NQb29sQ3JlYXRlKCZwb29sX2RlZik7CisgIGlmICgoKihxdWV1ZV9kZWYtPmNiKSktPnBvb2wgPT0gTlVMTCkgeworICAgIC8vVE9ETzogRGVsZXRlIHF1ZXVlLiBIb3cgdG8gZG8gaXQgaW4gRnJlZVJUT1M/CisgICAgdlBvcnRGcmVlKCoocXVldWVfZGVmLT5jYikpOworICAgIHJldHVybiBOVUxMOworICB9CisgIAorICByZXR1cm4gKihxdWV1ZV9kZWYtPmNiKTsKKyNlbHNlCisgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKKy8qKgorKiBAYnJpZWYgQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1haWwKKyogQHBhcmFtICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KKyogQHBhcmFtICBtaWxsaXNlYyAgICAgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgorKiBAcmV0dmFsIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRoIG1haWwgb3IgTlVMTCBpbiBjYXNlIGVycm9yLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsQWxsb2Mgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorKi8KK3ZvaWQgKm9zTWFpbEFsbG9jIChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKQoreworICAodm9pZCkgbWlsbGlzZWM7CisgIHZvaWQgKnA7CisgIAorICAKKyAgaWYgKHF1ZXVlX2lkID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAKKyAgcCA9IG9zUG9vbEFsbG9jKHF1ZXVlX2lkLT5wb29sKTsKKyAgCisgIHJldHVybiBwOworfQorCisvKioKKyogQGJyaWVmIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gYSBtYWlsIGFuZCBzZXQgbWVtb3J5IGJsb2NrIHRvIHplcm8KKyogQHBhcmFtICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KKyogQHBhcmFtICBtaWxsaXNlYyAgICAgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgorKiBAcmV0dmFsIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRoIG1haWwgb3IgTlVMTCBpbiBjYXNlIGVycm9yLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsQ0FsbG9jIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCit2b2lkICpvc01haWxDQWxsb2MgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpCit7CisgIHVpbnQzMl90IGk7CisgIHZvaWQgKnAgPSBvc01haWxBbGxvYyhxdWV1ZV9pZCwgbWlsbGlzZWMpOworICAKKyAgaWYgKHApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWVfaWQtPnF1ZXVlX2RlZi0+aXRlbV9zejsgaSsrKSB7CisgICAgICAoKHVpbnQ4X3QgKilwKVtpXSA9IDA7CisgICAgfQorICB9CisgIAorICByZXR1cm4gcDsKK30KKworLyoqCisqIEBicmllZiBQdXQgYSBtYWlsIHRvIGEgcXVldWUKKyogQHBhcmFtICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KKyogQHBhcmFtICBtYWlsICAgICAgICAgIG1lbW9yeSBibG9jayBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIFxyZWYgb3NNYWlsQWxsb2Mgb3IgXHJlZiBvc01haWxDQWxsb2MuCisqIEByZXR2YWwgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsUHV0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyovCitvc1N0YXR1cyBvc01haWxQdXQgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgdm9pZCAqbWFpbCkKK3sKKyAgcG9ydEJBU0VfVFlQRSB0YXNrV29rZW47CisgIAorICAKKyAgaWYgKHF1ZXVlX2lkID09IE5VTEwpIHsKKyAgICByZXR1cm4gb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICAKKyAgdGFza1dva2VuID0gcGRGQUxTRTsKKyAgCisgIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKKyAgICBpZiAoeFF1ZXVlU2VuZEZyb21JU1IocXVldWVfaWQtPmhhbmRsZSwgJm1haWwsICZ0YXNrV29rZW4pICE9IHBkVFJVRSkgeworICAgICAgcmV0dXJuIG9zRXJyb3JPUzsKKyAgICB9CisgICAgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKHhRdWV1ZVNlbmQocXVldWVfaWQtPmhhbmRsZSwgJm1haWwsIDApICE9IHBkVFJVRSkgeyAKKyAgICAgIHJldHVybiBvc0Vycm9yT1M7CisgICAgfQorICB9CisgIAorICByZXR1cm4gb3NPSzsKK30KKworLyoqCisqIEBicmllZiBHZXQgYSBtYWlsIGZyb20gYSBxdWV1ZQorKiBAcGFyYW0gIHF1ZXVlX2lkICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgorKiBAcGFyYW0gbWlsbGlzZWMgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQKKyogQHJldHZhbCBldmVudCB0aGF0IGNvbnRhaW5zIG1haWwgaW5mb3JtYXRpb24gb3IgZXJyb3IgY29kZS4KKyogQG5vdGUgICBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWFpbEdldCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NFdmVudCBvc01haWxHZXQgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpCit7CisgIHBvcnRCQVNFX1RZUEUgdGFza1dva2VuOworICBUaWNrVHlwZV90IHRpY2tzOworICBvc0V2ZW50IGV2ZW50OworICAKKyAgZXZlbnQuZGVmLm1haWxfaWQgPSBxdWV1ZV9pZDsKKyAgCisgIGlmIChxdWV1ZV9pZCA9PSBOVUxMKSB7CisgICAgZXZlbnQuc3RhdHVzID0gb3NFcnJvclBhcmFtZXRlcjsKKyAgICByZXR1cm4gZXZlbnQ7CisgIH0KKyAgCisgIHRhc2tXb2tlbiA9IHBkRkFMU0U7CisgIAorICB0aWNrcyA9IDA7CisgIGlmIChtaWxsaXNlYyA9PSBvc1dhaXRGb3JldmVyKSB7CisgICAgdGlja3MgPSBwb3J0TUFYX0RFTEFZOworICB9CisgIGVsc2UgaWYgKG1pbGxpc2VjICE9IDApIHsKKyAgICB0aWNrcyA9IG1pbGxpc2VjIC8gcG9ydFRJQ0tfUEVSSU9EX01TOworICAgIGlmICh0aWNrcyA9PSAwKSB7CisgICAgICB0aWNrcyA9IDE7CisgICAgfQorICB9CisgIAorICBpZiAoaW5IYW5kbGVyTW9kZSgpKSB7CisgICAgaWYgKHhRdWV1ZVJlY2VpdmVGcm9tSVNSKHF1ZXVlX2lkLT5oYW5kbGUsICZldmVudC52YWx1ZS5wLCAmdGFza1dva2VuKSA9PSBwZFRSVUUpIHsKKyAgICAgIC8qIFdlIGhhdmUgbWFpbCAqLworICAgICAgZXZlbnQuc3RhdHVzID0gb3NFdmVudE1haWw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZXZlbnQuc3RhdHVzID0gb3NPSzsKKyAgICB9CisgICAgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKHRhc2tXb2tlbik7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKHhRdWV1ZVJlY2VpdmUocXVldWVfaWQtPmhhbmRsZSwgJmV2ZW50LnZhbHVlLnAsIHRpY2tzKSA9PSBwZFRSVUUpIHsKKyAgICAgIC8qIFdlIGhhdmUgbWFpbCAqLworICAgICAgZXZlbnQuc3RhdHVzID0gb3NFdmVudE1haWw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZXZlbnQuc3RhdHVzID0gKHRpY2tzID09IDApID8gb3NPSyA6IG9zRXZlbnRUaW1lb3V0OworICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIGV2ZW50OworfQorCisvKioKKyogQGJyaWVmIEZyZWUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1haWwKKyogQHBhcmFtICBxdWV1ZV9pZCBtYWlsIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxDcmVhdGUuCisqIEBwYXJhbSAgbWFpbCAgICAgcG9pbnRlciB0byB0aGUgbWVtb3J5IGJsb2NrIHRoYXQgd2FzIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxHZXQuCisqIEByZXR2YWwgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKiBAbm90ZSAgIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsRnJlZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisqLworb3NTdGF0dXMgb3NNYWlsRnJlZSAob3NNYWlsUUlkIHF1ZXVlX2lkLCB2b2lkICptYWlsKQoreworICBpZiAocXVldWVfaWQgPT0gTlVMTCkgeworICAgIHJldHVybiBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIAorICByZXR1cm4gb3NQb29sRnJlZShxdWV1ZV9pZC0+cG9vbCwgbWFpbCk7Cit9CisjZW5kaWYgIC8qIFVzZSBNYWlsIFF1ZXVlcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFkZGl0aW9uYWwgc3BlY2lmaWMgQVBJcyB0byBGcmVlIFJUT1MgKioqKioqKioqKioqLworLyoqCisqIEBicmllZiAgSGFuZGxlcyB0aGUgdGljayBpbmNyZW1lbnQKKyogQHBhcmFtICBub25lLgorKiBAcmV0dmFsIG5vbmUuCisqLwordm9pZCBvc1N5c3RpY2tIYW5kbGVyKHZvaWQpCit7CisKKyNpZiAoSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlICA9PSAxICkKKyAgaWYgKHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSAhPSB0YXNrU0NIRURVTEVSX05PVF9TVEFSVEVEKQorICB7CisjZW5kaWYgIC8qIElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSAqLyAgCisgICAgeFBvcnRTeXNUaWNrSGFuZGxlcigpOworI2lmIChJTkNMVURFX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUgID09IDEgKQorICB9CisjZW5kaWYgIC8qIElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSAqLyAgCit9CisKKyNpZiAoIElOQ0xVREVfZVRhc2tHZXRTdGF0ZSA9PSAxICkKKy8qKgorKiBAYnJpZWYgIE9idGFpbiB0aGUgc3RhdGUgb2YgYW55IHRocmVhZC4KKyogQHBhcmFtICAgdGhyZWFkX2lkICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorKiBAcmV0dmFsICB0aGUgc3RhZSBvZiB0aGUgdGhyZWFkLCBzdGF0ZXMgYXJlIGVuY29kZWQgYnkgdGhlIG9zVGhyZWFkU3RhdGUgZW51bWVyYXRlZCB0eXBlLgorKi8KK29zVGhyZWFkU3RhdGUgb3NUaHJlYWRHZXRTdGF0ZShvc1RocmVhZElkIHRocmVhZF9pZCkKK3sKKyAgZVRhc2tTdGF0ZSBUaHJlYWRTdGF0ZTsKKyAgb3NUaHJlYWRTdGF0ZSByZXN1bHQ7CisgIAorICBUaHJlYWRTdGF0ZSA9IGVUYXNrR2V0U3RhdGUodGhyZWFkX2lkKTsKKyAgCisgIHN3aXRjaCAoVGhyZWFkU3RhdGUpCisgIHsKKyAgY2FzZSBlUnVubmluZyA6CisgICAgcmVzdWx0ID0gb3NUaHJlYWRSdW5uaW5nOworICAgIGJyZWFrOworICBjYXNlIGVSZWFkeSA6CisgICAgcmVzdWx0ID0gb3NUaHJlYWRSZWFkeTsKKyAgICBicmVhazsKKyAgY2FzZSBlQmxvY2tlZCA6CisgICAgcmVzdWx0ID0gb3NUaHJlYWRCbG9ja2VkOworICAgIGJyZWFrOworICBjYXNlIGVTdXNwZW5kZWQgOgorICAgIHJlc3VsdCA9IG9zVGhyZWFkU3VzcGVuZGVkOworICAgIGJyZWFrOworICBjYXNlIGVEZWxldGVkIDoKKyAgICByZXN1bHQgPSBvc1RocmVhZERlbGV0ZWQ7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmVzdWx0ID0gb3NUaHJlYWRFcnJvcjsKKyAgfSAKKyAgCisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYgLyogSU5DTFVERV9lVGFza0dldFN0YXRlICovCisKKyNpZiAoSU5DTFVERV9lVGFza0dldFN0YXRlID09IDEpCisvKioKKyogQGJyaWVmIENoZWNrIGlmIGEgdGhyZWFkIGlzIGFscmVhZHkgc3VzcGVuZGVkIG9yIG5vdC4KKyogQHBhcmFtIHRocmVhZF9pZCB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisqIEByZXR2YWwgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKi8KK29zU3RhdHVzIG9zVGhyZWFkSXNTdXNwZW5kZWQob3NUaHJlYWRJZCB0aHJlYWRfaWQpCit7CisgIGlmIChlVGFza0dldFN0YXRlKHRocmVhZF9pZCkgPT0gZVN1c3BlbmRlZCkKKyAgICByZXR1cm4gb3NPSzsKKyAgZWxzZQorICAgIHJldHVybiBvc0Vycm9yT1M7Cit9CisjZW5kaWYgLyogSU5DTFVERV9lVGFza0dldFN0YXRlICovCisvKioKKyogQGJyaWVmICBTdXNwZW5kIGV4ZWN1dGlvbiBvZiBhIHRocmVhZC4KKyogQHBhcmFtICAgdGhyZWFkX2lkICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqLworb3NTdGF0dXMgb3NUaHJlYWRTdXNwZW5kIChvc1RocmVhZElkIHRocmVhZF9pZCkKK3sKKyNpZiAoSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSkKKyAgICB2VGFza1N1c3BlbmQodGhyZWFkX2lkKTsKKyAgCisgIHJldHVybiBvc09LOworI2Vsc2UKKyAgcmV0dXJuIG9zRXJyb3JSZXNvdXJjZTsKKyNlbmRpZgorfQorCisvKioKKyogQGJyaWVmICBSZXN1bWUgZXhlY3V0aW9uIG9mIGEgc3VzcGVuZGVkIHRocmVhZC4KKyogQHBhcmFtICAgdGhyZWFkX2lkICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqLworb3NTdGF0dXMgb3NUaHJlYWRSZXN1bWUgKG9zVGhyZWFkSWQgdGhyZWFkX2lkKQoreworI2lmIChJTkNMVURFX3ZUYXNrU3VzcGVuZCA9PSAxKSAgCisgIGlmKGluSGFuZGxlck1vZGUoKSkKKyAgeworICAgIGlmICh4VGFza1Jlc3VtZUZyb21JU1IodGhyZWFkX2lkKSA9PSBwZFRSVUUpCisgICAgeworICAgICAgcG9ydFlJRUxEX0ZST01fSVNSKHBkVFJVRSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHZUYXNrUmVzdW1lKHRocmVhZF9pZCk7CisgIH0KKyAgcmV0dXJuIG9zT0s7CisjZWxzZQorICByZXR1cm4gb3NFcnJvclJlc291cmNlOworI2VuZGlmCit9CisKKy8qKgorKiBAYnJpZWYgIFN1c3BlbmQgZXhlY3V0aW9uIG9mIGEgYWxsIGFjdGl2ZSB0aHJlYWRzLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqLworb3NTdGF0dXMgb3NUaHJlYWRTdXNwZW5kQWxsICh2b2lkKQoreworICB2VGFza1N1c3BlbmRBbGwoKTsKKyAgCisgIHJldHVybiBvc09LOworfQorCisvKioKKyogQGJyaWVmICBSZXN1bWUgZXhlY3V0aW9uIG9mIGEgYWxsIHN1c3BlbmRlZCB0aHJlYWRzLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqLworb3NTdGF0dXMgb3NUaHJlYWRSZXN1bWVBbGwgKHZvaWQpCit7CisgIGlmICh4VGFza1Jlc3VtZUFsbCgpID09IHBkVFJVRSkKKyAgICByZXR1cm4gb3NPSzsKKyAgZWxzZQorICAgIHJldHVybiBvc0Vycm9yT1M7CisgIAorfQorCisvKioKKyogQGJyaWVmICBEZWxheSBhIHRhc2sgdW50aWwgYSBzcGVjaWZpZWQgdGltZQorKiBAcGFyYW0gICBQcmV2aW91c1dha2VUaW1lICAgUG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgaG9sZHMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIAorKiAgICAgICAgICB0YXNrIHdhcyBsYXN0IHVuYmxvY2tlZC4gUHJldmlvdXNXYWtlVGltZSBtdXN0IGJlIGluaXRpYWxpc2VkIHdpdGggdGhlIGN1cnJlbnQgdGltZQorKiAgICAgICAgICBwcmlvciB0byBpdHMgZmlyc3QgdXNlIChQcmV2aW91c1dha2VUaW1lID0gb3NLZXJuZWxTeXNUaWNrKCkgKQorKiBAcGFyYW0gICBtaWxsaXNlYyAgICB0aW1lIGRlbGF5IHZhbHVlCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyovCitvc1N0YXR1cyBvc0RlbGF5VW50aWwgKHVpbnQzMl90ICpQcmV2aW91c1dha2VUaW1lLCB1aW50MzJfdCBtaWxsaXNlYykKK3sKKyNpZiBJTkNMVURFX3ZUYXNrRGVsYXlVbnRpbAorICBUaWNrVHlwZV90IHRpY2tzID0gKG1pbGxpc2VjIC8gcG9ydFRJQ0tfUEVSSU9EX01TKTsKKyAgdlRhc2tEZWxheVVudGlsKChUaWNrVHlwZV90ICopIFByZXZpb3VzV2FrZVRpbWUsIHRpY2tzID8gdGlja3MgOiAxKTsKKyAgCisgIHJldHVybiBvc09LOworI2Vsc2UKKyAgKHZvaWQpIG1pbGxpc2VjOworICAodm9pZCkgUHJldmlvdXNXYWtlVGltZTsKKyAgCisgIHJldHVybiBvc0Vycm9yUmVzb3VyY2U7CisjZW5kaWYKK30KKworLyoqCisqIEBicmllZiAgIEFib3J0IHRoZSBkZWxheSBmb3IgYSBzcGVjaWZpYyB0aHJlYWQKKyogQHBhcmFtICAgdGhyZWFkX2lkICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkICAgCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyovCitvc1N0YXR1cyBvc0Fib3J0RGVsYXkob3NUaHJlYWRJZCB0aHJlYWRfaWQpCit7CisjaWYgSU5DTFVERV94VGFza0Fib3J0RGVsYXkKKyAgCisgIHhUYXNrQWJvcnREZWxheSh0aHJlYWRfaWQpOworICAKKyAgcmV0dXJuIG9zT0s7CisjZWxzZQorICAodm9pZCkgdGhyZWFkX2lkOworICAKKyAgcmV0dXJuIG9zRXJyb3JSZXNvdXJjZTsKKyNlbmRpZgorfQorCisvKioKKyogQGJyaWVmICAgTGlzdHMgYWxsIHRoZSBjdXJyZW50IHRocmVhZHMsIGFsb25nIHdpdGggdGhlaXIgY3VycmVudCBzdGF0ZSAKKyogICAgICAgICAgYW5kIHN0YWNrIHVzYWdlIGhpZ2ggd2F0ZXIgbWFyay4KKyogQHBhcmFtICAgYnVmZmVyICAgQSBidWZmZXIgaW50byB3aGljaCB0aGUgYWJvdmUgbWVudGlvbmVkIGRldGFpbHMKKyogICAgICAgICAgd2lsbCBiZSB3cml0dGVuCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyovCitvc1N0YXR1cyBvc1RocmVhZExpc3QgKHVpbnQ4X3QgKmJ1ZmZlcikKK3sKKyNpZiAoICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSAmJiAoIGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUyA9PSAxICkgKQorICB2VGFza0xpc3QoKGNoYXIgKilidWZmZXIpOworI2VuZGlmCisgIHJldHVybiBvc09LOworfQorCisvKioKKyogQGJyaWVmICBSZWNlaXZlIGFuIGl0ZW0gZnJvbSBhIHF1ZXVlIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIGl0ZW0gZnJvbSB0aGUgcXVldWUuCisqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKyogQHBhcmFtICBtaWxsaXNlYyAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisqIEByZXR2YWwgZXZlbnQgaW5mb3JtYXRpb24gdGhhdCBpbmNsdWRlcyBzdGF0dXMgY29kZS4KKyovCitvc0V2ZW50IG9zTWVzc2FnZVBlZWsgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpCit7CisgIFRpY2tUeXBlX3QgdGlja3M7CisgIG9zRXZlbnQgZXZlbnQ7CisgIAorICBldmVudC5kZWYubWVzc2FnZV9pZCA9IHF1ZXVlX2lkOworICAKKyAgaWYgKHF1ZXVlX2lkID09IE5VTEwpIHsKKyAgICBldmVudC5zdGF0dXMgPSBvc0Vycm9yUGFyYW1ldGVyOworICAgIHJldHVybiBldmVudDsKKyAgfQorICAKKyAgdGlja3MgPSAwOworICBpZiAobWlsbGlzZWMgPT0gb3NXYWl0Rm9yZXZlcikgeworICAgIHRpY2tzID0gcG9ydE1BWF9ERUxBWTsKKyAgfQorICBlbHNlIGlmIChtaWxsaXNlYyAhPSAwKSB7CisgICAgdGlja3MgPSBtaWxsaXNlYyAvIHBvcnRUSUNLX1BFUklPRF9NUzsKKyAgICBpZiAodGlja3MgPT0gMCkgeworICAgICAgdGlja3MgPSAxOworICAgIH0KKyAgfQorICAKKyAgaWYgKHhRdWV1ZVBlZWsocXVldWVfaWQsICZldmVudC52YWx1ZS52LCB0aWNrcykgPT0gcGRUUlVFKSAKKyAgeworICAgIC8qIFdlIGhhdmUgbWFpbCAqLworICAgIGV2ZW50LnN0YXR1cyA9IG9zRXZlbnRNZXNzYWdlOworICB9CisgIGVsc2UgCisgIHsKKyAgICBldmVudC5zdGF0dXMgPSAodGlja3MgPT0gMCkgPyBvc09LIDogb3NFdmVudFRpbWVvdXQ7CisgIH0KKyAgCisgIHJldHVybiBldmVudDsKK30KKworLyoqCisqIEBicmllZiAgR2V0IHRoZSBudW1iZXIgb2YgbWVzc2FnZWQgc3RvcmVkIGluIGEgcXVldWUuCisqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKyogQHJldHZhbCBudW1iZXIgb2YgbWVzc2FnZXMgc3RvcmVkIGluIGEgcXVldWUuCisqLwordWludDMyX3Qgb3NNZXNzYWdlV2FpdGluZyhvc01lc3NhZ2VRSWQgcXVldWVfaWQpCit7CisgIGlmIChpbkhhbmRsZXJNb2RlKCkpIHsKKyAgICByZXR1cm4gdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZ0Zyb21JU1IocXVldWVfaWQpOworICB9CisgIGVsc2UKKyAgeworICAgIHJldHVybiB1eFF1ZXVlTWVzc2FnZXNXYWl0aW5nKHF1ZXVlX2lkKTsKKyAgfQorfQorCisvKioKKyogQGJyaWVmICBHZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiBhIG1lc3NhZ2UgcXVldWUuCisqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKyogQHJldHZhbCBhdmFpbGFibGUgc3BhY2UgaW4gYSBtZXNzYWdlIHF1ZXVlLgorKi8KK3VpbnQzMl90IG9zTWVzc2FnZUF2YWlsYWJsZVNwYWNlKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCkgIAoreworICByZXR1cm4gdXhRdWV1ZVNwYWNlc0F2YWlsYWJsZShxdWV1ZV9pZCk7Cit9CisKKy8qKgorKiBAYnJpZWYgRGVsZXRlIGEgTWVzc2FnZSBRdWV1ZQorKiBAcGFyYW0gIHF1ZXVlX2lkICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01lc3NhZ2VDcmVhdGUuCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyovCitvc1N0YXR1cyBvc01lc3NhZ2VEZWxldGUgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCkKK3sKKyAgaWYgKGluSGFuZGxlck1vZGUoKSkgeworICAgIHJldHVybiBvc0Vycm9ySVNSOworICB9CisKKyAgdlF1ZXVlRGVsZXRlKHF1ZXVlX2lkKTsKKworICByZXR1cm4gb3NPSzsgCit9CisKKy8qKgorKiBAYnJpZWYgIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIFJlY3Vyc2l2ZSBNdXRleAorKiBAcGFyYW0gIG11dGV4X2RlZiAgICAgbXV0ZXggZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc011dGV4LgorKiBAcmV0dmFsICBtdXRleCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuLgorKi8KK29zTXV0ZXhJZCBvc1JlY3Vyc2l2ZU11dGV4Q3JlYXRlIChjb25zdCBvc011dGV4RGVmX3QgKm11dGV4X2RlZikKK3sKKyNpZiAoY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTID09IDEpCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisKKyAgaWYgKG11dGV4X2RlZi0+Y29udHJvbGJsb2NrICE9IE5VTEwpeworICAgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXhTdGF0aWMoIG11dGV4X2RlZi0+Y29udHJvbGJsb2NrICk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIHhTZW1hcGhvcmVDcmVhdGVSZWN1cnNpdmVNdXRleCgpOworICB9CisjZWxpZiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisgIHJldHVybiB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXhTdGF0aWMoIG11dGV4X2RlZi0+Y29udHJvbGJsb2NrICk7CisjZWxzZSAKKyAgcmV0dXJuIHhTZW1hcGhvcmVDcmVhdGVSZWN1cnNpdmVNdXRleCgpOworI2VuZGlmCisjZWxzZQorICByZXR1cm4gTlVMTDsKKyNlbmRpZgkKK30KKworLyoqCisqIEBicmllZiAgUmVsZWFzZSBhIFJlY3Vyc2l2ZSBNdXRleAorKiBAcGFyYW0gICBtdXRleF9pZCAgICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NSZWN1cnNpdmVNdXRleENyZWF0ZS4KKyogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKi8KK29zU3RhdHVzIG9zUmVjdXJzaXZlTXV0ZXhSZWxlYXNlIChvc011dGV4SWQgbXV0ZXhfaWQpCit7CisjaWYgKGNvbmZpZ1VTRV9SRUNVUlNJVkVfTVVURVhFUyA9PSAxKQorICBvc1N0YXR1cyByZXN1bHQgPSBvc09LOworIAorICBpZiAoeFNlbWFwaG9yZUdpdmVSZWN1cnNpdmUobXV0ZXhfaWQpICE9IHBkVFJVRSkgCisgIHsKKyAgICByZXN1bHQgPSBvc0Vycm9yT1M7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisJcmV0dXJuIG9zRXJyb3JSZXNvdXJjZTsKKyNlbmRpZgorfQorCisvKioKKyogQGJyaWVmICBSZWxlYXNlIGEgUmVjdXJzaXZlIE11dGV4CisqIEBwYXJhbSAgIG11dGV4X2lkICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NSZWN1cnNpdmVNdXRleENyZWF0ZS4KKyogQHBhcmFtIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyovCitvc1N0YXR1cyBvc1JlY3Vyc2l2ZU11dGV4V2FpdCAob3NNdXRleElkIG11dGV4X2lkLCB1aW50MzJfdCBtaWxsaXNlYykKK3sKKyNpZiAoY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTID09IDEpCisgIFRpY2tUeXBlX3QgdGlja3M7CisgIAorICBpZiAobXV0ZXhfaWQgPT0gTlVMTCkKKyAgeworICAgIHJldHVybiBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIAorICB0aWNrcyA9IDA7CisgIGlmIChtaWxsaXNlYyA9PSBvc1dhaXRGb3JldmVyKSAKKyAgeworICAgIHRpY2tzID0gcG9ydE1BWF9ERUxBWTsKKyAgfQorICBlbHNlIGlmIChtaWxsaXNlYyAhPSAwKSAKKyAgeworICAgIHRpY2tzID0gbWlsbGlzZWMgLyBwb3J0VElDS19QRVJJT0RfTVM7CisgICAgaWYgKHRpY2tzID09IDApIAorICAgIHsKKyAgICAgIHRpY2tzID0gMTsKKyAgICB9CisgIH0KKyAgCisgIGlmICh4U2VtYXBob3JlVGFrZVJlY3Vyc2l2ZShtdXRleF9pZCwgdGlja3MpICE9IHBkVFJVRSkgCisgIHsKKyAgICByZXR1cm4gb3NFcnJvck9TOworICB9CisgIHJldHVybiBvc09LOworI2Vsc2UKKwlyZXR1cm4gb3NFcnJvclJlc291cmNlOworI2VuZGlmCit9CisKKy8qKgorKiBAYnJpZWYgIFJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgdmFsdWUgb2YgYSBjb3VudGluZyBzZW1hcGhvcmUKKyogQHBhcmFtICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZV9pZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zU2VtYXBob3JlQ3JlYXRlLgorKiBAcmV0dmFsICBjb3VudCB2YWx1ZQorKi8KK3VpbnQzMl90IG9zU2VtYXBob3JlR2V0Q291bnQob3NTZW1hcGhvcmVJZCBzZW1hcGhvcmVfaWQpCit7CisgIHJldHVybiB1eFNlbWFwaG9yZUdldENvdW50KHNlbWFwaG9yZV9pZCk7Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvQ01TSVNfUlRPUy9jbXNpc19vcy5oIGIvU291cmNlL0NNU0lTX1JUT1MvY21zaXNfb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTNhMTMyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL0NNU0lTX1JUT1MvY21zaXNfb3MuaApAQCAtMCwwICsxLDEwMjYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICREYXRlOiAgICAgICAgNS4gRmVicnVhcnkgMjAxMworICogJFJldmlzaW9uOiAgICBWMS4wMgorICoKKyAqIFByb2plY3Q6ICAgICAgQ01TSVMtUlRPUyBBUEkKKyAqIFRpdGxlOiAgICAgICAgY21zaXNfb3MuaCBoZWFkZXIgZmlsZQorICoKKyAqIFZlcnNpb24gMC4wMgorICogICAgSW5pdGlhbCBQcm9wb3NhbCBQaGFzZQorICogVmVyc2lvbiAwLjAzCisgKiAgICBvc0tlcm5lbFN0YXJ0IGFkZGVkLCBvcHRpb25hbCBmZWF0dXJlOiBtYWluIHN0YXJ0ZWQgYXMgdGhyZWFkCisgKiAgICBvc1NlbWFwaG9yZXMgaGF2ZSBzdGFuZGFyZCBiZWhhdmlvcgorICogICAgb3NUaW1lckNyZWF0ZSBkb2VzIG5vdCBzdGFydCB0aGUgdGltZXIsIGFkZGVkIG9zVGltZXJTdGFydAorICogICAgb3NUaHJlYWRQYXNzIGlzIHJlbmFtZWQgdG8gb3NUaHJlYWRZaWVsZAorICogVmVyc2lvbiAxLjAxCisgKiAgICBTdXBwb3J0IGZvciBDKysgaW50ZXJmYWNlCisgKiAgICAgLSBjb25zdCBhdHRyaWJ1dGUgcmVtb3ZlZCBmcm9tIHRoZSBvc1h4eHhEZWZfdCB0eXBlZGVmJ3MKKyAqICAgICAtIGNvbnN0IGF0dHJpYnV0ZSBhZGRlZCB0byB0aGUgb3NYeHh4RGVmIG1hY3JvcworICogICAgQWRkZWQ6IG9zVGltZXJEZWxldGUsIG9zTXV0ZXhEZWxldGUsIG9zU2VtYXBob3JlRGVsZXRlCisgKiAgICBBZGRlZDogb3NLZXJuZWxJbml0aWFsaXplCisgKiBWZXJzaW9uIDEuMDIKKyAqICAgIENvbnRyb2wgZnVuY3Rpb25zIGZvciBzaG9ydCB0aW1lb3V0cyBpbiBtaWNyb3NlY29uZCByZXNvbHV0aW9uOgorICogICAgQWRkZWQ6IG9zS2VybmVsU3lzVGljaywgb3NLZXJuZWxTeXNUaWNrRnJlcXVlbmN5LCBvc0tlcm5lbFN5c1RpY2tNaWNyb1NlYworICogICAgUmVtb3ZlZDogb3NTaWduYWxHZXQgCisgKiAgICAKKyAqICAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCCpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzIEludGVybmF0aW9uYWwgTi5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEzIEFSTSBMSU1JVEVECisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQVJNICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAidGltZXJzLmgiCisjaW5jbHVkZSAicXVldWUuaCIKKyNpbmNsdWRlICJzZW1waHIuaCIKKyNpbmNsdWRlICJldmVudF9ncm91cHMuaCIKKworLyoqCitccGFnZSBjbXNpc19vc19oIEhlYWRlciBGaWxlIFRlbXBsYXRlOiBjbXNpc19vcy5oCisKK1RoZSBmaWxlIFxiIGNtc2lzX29zLmggaXMgYSB0ZW1wbGF0ZSBoZWFkZXIgZmlsZSBmb3IgYSBDTVNJUy1SVE9TIGNvbXBsaWFudCBSZWFsLVRpbWUgT3BlcmF0aW5nIFN5c3RlbSAoUlRPUykuCitFYWNoIFJUT1MgdGhhdCBpcyBjb21wbGlhbnQgd2l0aCBDTVNJUy1SVE9TIHNoYWxsIHByb3ZpZGUgYSBzcGVjaWZpYyBcYiBjbXNpc19vcy5oIGhlYWRlciBmaWxlIHRoYXQgcmVwcmVzZW50cworaXRzIGltcGxlbWVudGF0aW9uLgorCitUaGUgZmlsZSBjbXNpc19vcy5oIGNvbnRhaW5zOgorIC0gQ01TSVMtUlRPUyBBUEkgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyAtIHN0cnVjdCBkZWZpbml0aW9ucyBmb3IgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzCisgLSBzdGF0dXMgYW5kIHByaW9yaXR5IHZhbHVlcyB1c2VkIGJ5IENNU0lTLVJUT1MgQVBJIGZ1bmN0aW9ucworIC0gbWFjcm9zIGZvciBkZWZpbmluZyB0aHJlYWRzIGFuZCBvdGhlciBrZXJuZWwgb2JqZWN0cworCisKKzxiPk5hbWUgY29udmVudGlvbnMgYW5kIGhlYWRlciBmaWxlIG1vZGlmaWNhdGlvbnM8L2I+CisKK0FsbCBkZWZpbml0aW9ucyBhcmUgcHJlZml4ZWQgd2l0aCBcYiBvcyB0byBnaXZlIGFuIHVuaXF1ZSBuYW1lIHNwYWNlIGZvciBDTVNJUy1SVE9TIGZ1bmN0aW9ucy4KK0RlZmluaXRpb25zIHRoYXQgYXJlIHByZWZpeGVkIFxiIG9zXyBhcmUgbm90IHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNvZGUgYnV0IGxvY2FsIHRvIHRoaXMgaGVhZGVyIGZpbGUuCitBbGwgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9ucyB0aGF0IGJlbG9uZyB0byBhIG1vZHVsZSBhcmUgZ3JvdXBlZCBhbmQgaGF2ZSBhIGNvbW1vbiBwcmVmaXgsIGkuZS4gXGIgb3NUaHJlYWQuCisKK0RlZmluaXRpb25zIHRoYXQgYXJlIG1hcmtlZCB3aXRoIDxiPkNBTiBCRSBDSEFOR0VEPC9iPiBjYW4gYmUgYWRhcHRlZCB0b3dhcmRzIHRoZSBuZWVkcyBvZiB0aGUgYWN0dWFsIENNU0lTLVJUT1MgaW1wbGVtZW50YXRpb24uCitUaGVzZSBkZWZpbml0aW9ucyBjYW4gYmUgc3BlY2lmaWMgdG8gdGhlIHVuZGVybHlpbmcgUlRPUyBrZXJuZWwuCisKK0RlZmluaXRpb25zIHRoYXQgYXJlIG1hcmtlZCB3aXRoIDxiPk1VU1QgUkVNQUlOIFVOQ0hBTkdFRDwvYj4gY2Fubm90IGJlIGFsdGVyZWQuIE90aGVyd2lzZSB0aGUgQ01TSVMtUlRPUyBpbXBsZW1lbnRhdGlvbiBpcyBubyBsb25nZXIKK2NvbXBsaWFudCB0byB0aGUgc3RhbmRhcmQuIE5vdGUgdGhhdCBzb21lIGZ1bmN0aW9ucyBhcmUgb3B0aW9uYWwgYW5kIG5lZWQgbm90IHRvIGJlIHByb3ZpZGVkIGJ5IGV2ZXJ5IENNU0lTLVJUT1MgaW1wbGVtZW50YXRpb24uCisKKworPGI+RnVuY3Rpb24gY2FsbHMgZnJvbSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lczwvYj4KKworVGhlIGZvbGxvd2luZyBDTVNJUy1SVE9TIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGZyb20gdGhyZWFkcyBhbmQgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMgKElTUik6CisgIC0gXHJlZiBvc1NpZ25hbFNldAorICAtIFxyZWYgb3NTZW1hcGhvcmVSZWxlYXNlCisgIC0gXHJlZiBvc1Bvb2xBbGxvYywgXHJlZiBvc1Bvb2xDQWxsb2MsIFxyZWYgb3NQb29sRnJlZQorICAtIFxyZWYgb3NNZXNzYWdlUHV0LCBccmVmIG9zTWVzc2FnZUdldAorICAtIFxyZWYgb3NNYWlsQWxsb2MsIFxyZWYgb3NNYWlsQ0FsbG9jLCBccmVmIG9zTWFpbEdldCwgXHJlZiBvc01haWxQdXQsIFxyZWYgb3NNYWlsRnJlZQorCitGdW5jdGlvbnMgdGhhdCBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4gSVNSIGFyZSB2ZXJpZnlpbmcgdGhlIGludGVycnVwdCBzdGF0dXMgYW5kIHJldHVybiBpbiBjYXNlIHRoYXQgdGhleSBhcmUgY2FsbGVkCitmcm9tIGFuIElTUiBjb250ZXh0IHRoZSBzdGF0dXMgY29kZSBcYiBvc0Vycm9ySVNSLiBJbiBzb21lIGltcGxlbWVudGF0aW9ucyB0aGlzIGNvbmRpdGlvbiBtaWdodCBiZSBjYXVnaHQgdXNpbmcgdGhlIEhBUkQgRkFVTFQgdmVjdG9yLgorCitTb21lIENNU0lTLVJUT1MgaW1wbGVtZW50YXRpb25zIHN1cHBvcnQgQ01TSVMtUlRPUyBmdW5jdGlvbiBjYWxscyBmcm9tIG11bHRpcGxlIElTUiBhdCB0aGUgc2FtZSB0aW1lLgorSWYgdGhpcyBpcyBpbXBvc3NpYmxlLCB0aGUgQ01TSVMtUlRPUyByZWplY3RzIGNhbGxzIGJ5IG5lc3RlZCBJU1IgZnVuY3Rpb25zIHdpdGggdGhlIHN0YXR1cyBjb2RlIFxiIG9zRXJyb3JJU1JSZWN1cnNpdmUuCisKKworPGI+RGVmaW5lIGFuZCByZWZlcmVuY2Ugb2JqZWN0IGRlZmluaXRpb25zPC9iPgorCitXaXRoIDxiPlwjZGVmaW5lIG9zT2JqZWN0c0V4dGVybmFsPC9iPiBvYmplY3RzIGFyZSBkZWZpbmVkIGFzIGV4dGVybmFsIHN5bWJvbHMuIFRoaXMgYWxsb3dzIHRvIGNyZWF0ZSBhIGNvbnNpc3RlbnQgaGVhZGVyIGZpbGUKK3RoYXQgaXMgdXNlZCB0aHJvdWdob3V0IGEgcHJvamVjdCBhcyBzaG93biBiZWxvdzoKKworPGk+SGVhZGVyIEZpbGU8L2k+CitcY29kZQorI2luY2x1ZGUgPGNtc2lzX29zLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDTVNJUyBSVE9TIGhlYWRlciBmaWxlCisKKy8vIFRocmVhZCBkZWZpbml0aW9uCitleHRlcm4gdm9pZCB0aHJlYWRfc2FtcGxlICh2b2lkIGNvbnN0ICphcmd1bWVudCk7ICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHByb3RvdHlwZQorb3NUaHJlYWREZWYgKHRocmVhZF9zYW1wbGUsIG9zUHJpb3JpdHlCZWxvd05vcm1hbCwgMSwgMTAwKTsKKworLy8gUG9vbCBkZWZpbml0aW9uCitvc1Bvb2xEZWYoTXlQb29sLCAxMCwgbG9uZyk7CitcZW5kY29kZQorCisKK1RoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBhbGwgb2JqZWN0cyB3aGVuIGluY2x1ZGVkIGluIGEgQy9DKysgc291cmNlIGZpbGUuIFdoZW4gPGI+XCNkZWZpbmUgb3NPYmplY3RzRXh0ZXJuYWw8L2I+IGlzCitwcmVzZW50IGJlZm9yZSB0aGUgaGVhZGVyIGZpbGUsIHRoZSBvYmplY3RzIGFyZSBkZWZpbmVkIGFzIGV4dGVybmFsIHN5bWJvbHMuIEEgc2luZ2xlIGNvbnNpc3RlbnQgaGVhZGVyIGZpbGUgY2FuIHRoZXJlZm9yZSBiZQordXNlZCB0aHJvdWdob3V0IHRoZSB3aG9sZSBwcm9qZWN0LgorCis8aT5FeGFtcGxlPC9pPgorXGNvZGUKKyNpbmNsdWRlICJvc09iamVjdHMuaCIgICAgIC8vIERlZmluaXRpb24gb2YgdGhlIENNU0lTLVJUT1Mgb2JqZWN0cworXGVuZGNvZGUKKworXGNvZGUKKyNkZWZpbmUgb3NPYmplY3RFeHRlcm5hbCAgIC8vIE9iamVjdHMgd2lsbCBiZSBkZWZpbmVkIGFzIGV4dGVybmFsIHN5bWJvbHMKKyNpbmNsdWRlICJvc09iamVjdHMuaCIgICAgIC8vIFJlZmVyZW5jZSB0byB0aGUgQ01TSVMtUlRPUyBvYmplY3RzCitcZW5kY29kZQorCisqLworCisjaWZuZGVmIF9DTVNJU19PU19ICisjZGVmaW5lIF9DTVNJU19PU19ICisKKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zQ01TSVMgaWRlbnRpZmllcyB0aGUgQ01TSVMtUlRPUyBBUEkgdmVyc2lvbi4KKyNkZWZpbmUgb3NDTVNJUyAgICAgICAgICAgMHgxMDAwMiAgICAgIC8vLzwgQVBJIHZlcnNpb24gKG1haW4gWzMxOjE2XSAuc3ViIFsxNTowXSkKKworLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc0NNU0lTX0tFUk5FTCBpZGVudGlmaWVzIHRoZSB1bmRlcmx5aW5nIFJUT1Mga2VybmVsIGFuZCB2ZXJzaW9uIG51bWJlci4KKyNkZWZpbmUgb3NDTVNJU19LRVJORUwgICAgMHgxMDAwMAkgICAvLy88IFJUT1MgaWRlbnRpZmljYXRpb24gYW5kIHZlcnNpb24gKG1haW4gWzMxOjE2XSAuc3ViIFsxNTowXSkKKworLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NLZXJuZWxTeXN0ZW1JZCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisjZGVmaW5lIG9zS2VybmVsU3lzdGVtSWQgIktFUk5FTCBWMS4wMCIgICAvLy88IFJUT1MgaWRlbnRpZmljYXRpb24gc3RyaW5nCisKKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zRmVhdHVyZV94eHggc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorI2RlZmluZSBvc0ZlYXR1cmVfTWFpblRocmVhZCAgIDEgICAgICAgLy8vPCBtYWluIHRocmVhZCAgICAgIDE9bWFpbiBjYW4gYmUgdGhyZWFkLCAwPW5vdCBhdmFpbGFibGUKKyNkZWZpbmUgb3NGZWF0dXJlX1Bvb2wgICAgICAgICAxICAgICAgIC8vLzwgTWVtb3J5IFBvb2xzOiAgICAxPWF2YWlsYWJsZSwgMD1ub3QgYXZhaWxhYmxlCisjZGVmaW5lIG9zRmVhdHVyZV9NYWlsUSAgICAgICAgMSAgICAgICAvLy88IE1haWwgUXVldWVzOiAgICAgMT1hdmFpbGFibGUsIDA9bm90IGF2YWlsYWJsZQorI2RlZmluZSBvc0ZlYXR1cmVfTWVzc2FnZVEgICAgIDEgICAgICAgLy8vPCBNZXNzYWdlIFF1ZXVlczogIDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKKyNkZWZpbmUgb3NGZWF0dXJlX1NpZ25hbHMgICAgICA4ICAgICAgIC8vLzwgbWF4aW11bSBudW1iZXIgb2YgU2lnbmFsIEZsYWdzIGF2YWlsYWJsZSBwZXIgdGhyZWFkCisjZGVmaW5lIG9zRmVhdHVyZV9TZW1hcGhvcmUgICAgMSAgICAgIC8vLzwgb3NGZWF0dXJlX1NlbWFwaG9yZSBmdW5jdGlvbjogMT1hdmFpbGFibGUsIDA9bm90IGF2YWlsYWJsZQorI2RlZmluZSBvc0ZlYXR1cmVfV2FpdCAgICAgICAgIDAgICAgICAgLy8vPCBvc1dhaXQgZnVuY3Rpb246IDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKKyNkZWZpbmUgb3NGZWF0dXJlX1N5c1RpY2sgICAgICAxICAgICAgIC8vLzwgb3NLZXJuZWxTeXNUaWNrIGZ1bmN0aW9uczogMT1hdmFpbGFibGUsIDA9bm90IGF2YWlsYWJsZQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworCisvLyA9PT09IEVudW1lcmF0aW9uLCBzdHJ1Y3R1cmVzLCBkZWZpbmVzID09PT0KKworLy8vIFByaW9yaXR5IHVzZWQgZm9yIHRocmVhZCBjb250cm9sLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NQcmlvcml0eSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCit0eXBlZGVmIGVudW0gIHsKKyAgb3NQcmlvcml0eUlkbGUgICAgICAgICAgPSAtMywgICAgICAgICAgLy8vPCBwcmlvcml0eTogaWRsZSAobG93ZXN0KQorICBvc1ByaW9yaXR5TG93ICAgICAgICAgICA9IC0yLCAgICAgICAgICAvLy88IHByaW9yaXR5OiBsb3cKKyAgb3NQcmlvcml0eUJlbG93Tm9ybWFsICAgPSAtMSwgICAgICAgICAgLy8vPCBwcmlvcml0eTogYmVsb3cgbm9ybWFsCisgIG9zUHJpb3JpdHlOb3JtYWwgICAgICAgID0gIDAsICAgICAgICAgIC8vLzwgcHJpb3JpdHk6IG5vcm1hbCAoZGVmYXVsdCkKKyAgb3NQcmlvcml0eUFib3ZlTm9ybWFsICAgPSArMSwgICAgICAgICAgLy8vPCBwcmlvcml0eTogYWJvdmUgbm9ybWFsCisgIG9zUHJpb3JpdHlIaWdoICAgICAgICAgID0gKzIsICAgICAgICAgIC8vLzwgcHJpb3JpdHk6IGhpZ2gKKyAgb3NQcmlvcml0eVJlYWx0aW1lICAgICAgPSArMywgICAgICAgICAgLy8vPCBwcmlvcml0eTogcmVhbHRpbWUgKGhpZ2hlc3QpCisgIG9zUHJpb3JpdHlFcnJvciAgICAgICAgID0gIDB4ODQgICAgICAgIC8vLzwgc3lzdGVtIGNhbm5vdCBkZXRlcm1pbmUgcHJpb3JpdHkgb3IgdGhyZWFkIGhhcyBpbGxlZ2FsIHByaW9yaXR5Cit9IG9zUHJpb3JpdHk7CisKKy8vLyBUaW1lb3V0IHZhbHVlLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NXYWl0Rm9yZXZlciBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCisjZGVmaW5lIG9zV2FpdEZvcmV2ZXIgICAgIDB4RkZGRkZGRkYgICAgIC8vLzwgd2FpdCBmb3JldmVyIHRpbWVvdXQgdmFsdWUKKworLy8vIFN0YXR1cyBjb2RlIHZhbHVlcyByZXR1cm5lZCBieSBDTVNJUy1SVE9TIGZ1bmN0aW9ucy4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zU3RhdHVzIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK3R5cGVkZWYgZW51bSAgeworICBvc09LICAgICAgICAgICAgICAgICAgICA9ICAgICAwLCAgICAgICAvLy88IGZ1bmN0aW9uIGNvbXBsZXRlZDsgbm8gZXJyb3Igb3IgZXZlbnQgb2NjdXJyZWQuCisgIG9zRXZlbnRTaWduYWwgICAgICAgICAgID0gIDB4MDgsICAgICAgIC8vLzwgZnVuY3Rpb24gY29tcGxldGVkOyBzaWduYWwgZXZlbnQgb2NjdXJyZWQuCisgIG9zRXZlbnRNZXNzYWdlICAgICAgICAgID0gIDB4MTAsICAgICAgIC8vLzwgZnVuY3Rpb24gY29tcGxldGVkOyBtZXNzYWdlIGV2ZW50IG9jY3VycmVkLgorICBvc0V2ZW50TWFpbCAgICAgICAgICAgICA9ICAweDIwLCAgICAgICAvLy88IGZ1bmN0aW9uIGNvbXBsZXRlZDsgbWFpbCBldmVudCBvY2N1cnJlZC4KKyAgb3NFdmVudFRpbWVvdXQgICAgICAgICAgPSAgMHg0MCwgICAgICAgLy8vPCBmdW5jdGlvbiBjb21wbGV0ZWQ7IHRpbWVvdXQgb2NjdXJyZWQuCisgIG9zRXJyb3JQYXJhbWV0ZXIgICAgICAgID0gIDB4ODAsICAgICAgIC8vLzwgcGFyYW1ldGVyIGVycm9yOiBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgd2FzIG1pc3Npbmcgb3Igc3BlY2lmaWVkIGFuIGluY29ycmVjdCBvYmplY3QuCisgIG9zRXJyb3JSZXNvdXJjZSAgICAgICAgID0gIDB4ODEsICAgICAgIC8vLzwgcmVzb3VyY2Ugbm90IGF2YWlsYWJsZTogYSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2FzIG5vdCBhdmFpbGFibGUuCisgIG9zRXJyb3JUaW1lb3V0UmVzb3VyY2UgID0gIDB4QzEsICAgICAgIC8vLzwgcmVzb3VyY2Ugbm90IGF2YWlsYWJsZSB3aXRoaW4gZ2l2ZW4gdGltZTogYSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2FzIG5vdCBhdmFpbGFibGUgd2l0aGluIHRoZSB0aW1lb3V0IHBlcmlvZC4KKyAgb3NFcnJvcklTUiAgICAgICAgICAgICAgPSAgMHg4MiwgICAgICAgLy8vPCBub3QgYWxsb3dlZCBpbiBJU1IgY29udGV4dDogdGhlIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcy4KKyAgb3NFcnJvcklTUlJlY3Vyc2l2ZSAgICAgPSAgMHg4MywgICAgICAgLy8vPCBmdW5jdGlvbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZnJvbSBJU1Igd2l0aCBzYW1lIG9iamVjdC4KKyAgb3NFcnJvclByaW9yaXR5ICAgICAgICAgPSAgMHg4NCwgICAgICAgLy8vPCBzeXN0ZW0gY2Fubm90IGRldGVybWluZSBwcmlvcml0eSBvciB0aHJlYWQgaGFzIGlsbGVnYWwgcHJpb3JpdHkuCisgIG9zRXJyb3JOb01lbW9yeSAgICAgICAgID0gIDB4ODUsICAgICAgIC8vLzwgc3lzdGVtIGlzIG91dCBvZiBtZW1vcnk6IGl0IHdhcyBpbXBvc3NpYmxlIHRvIGFsbG9jYXRlIG9yIHJlc2VydmUgbWVtb3J5IGZvciB0aGUgb3BlcmF0aW9uLgorICBvc0Vycm9yVmFsdWUgICAgICAgICAgICA9ICAweDg2LCAgICAgICAvLy88IHZhbHVlIG9mIGEgcGFyYW1ldGVyIGlzIG91dCBvZiByYW5nZS4KKyAgb3NFcnJvck9TICAgICAgICAgICAgICAgPSAgMHhGRiwgICAgICAgLy8vPCB1bnNwZWNpZmllZCBSVE9TIGVycm9yOiBydW4tdGltZSBlcnJvciBidXQgbm8gb3RoZXIgZXJyb3IgbWVzc2FnZSBmaXRzLgorICBvc19zdGF0dXNfcmVzZXJ2ZWQgICAgICA9ICAweDdGRkZGRkZGICAvLy88IHByZXZlbnQgZnJvbSBlbnVtIGRvd24tc2l6ZSBjb21waWxlciBvcHRpbWl6YXRpb24uCit9IG9zU3RhdHVzOworCisjaWYgKCBJTkNMVURFX2VUYXNrR2V0U3RhdGUgPT0gMSApCisvKiBUaHJlYWQgc3RhdGUgcmV0dXJuZWQgYnkgb3NUaHJlYWRHZXRTdGF0ZSAqLwordHlwZWRlZiBlbnVtIHsKKwlvc1RocmVhZFJ1bm5pbmcgICA9IDB4MCwJICAgICAgLyogQSB0aHJlYWQgaXMgcXVlcnlpbmcgdGhlIHN0YXRlIG9mIGl0c2VsZiwgc28gbXVzdCBiZSBydW5uaW5nLiAqLworCW9zVGhyZWFkUmVhZHkgICAgID0gMHgxICwJCQkgICAgICAgIC8qIFRoZSB0aHJlYWQgYmVpbmcgcXVlcmllZCBpcyBpbiBhIHJlYWQgb3IgcGVuZGluZyByZWFkeSBsaXN0LiAqLworCW9zVGhyZWFkQmxvY2tlZCAgID0gMHgyLAkJICAgICAgICAvKiBUaGUgdGhyZWFkIGJlaW5nIHF1ZXJpZWQgaXMgaW4gdGhlIEJsb2NrZWQgc3RhdGUuICovCisJb3NUaHJlYWRTdXNwZW5kZWQgPSAweDMsCSAgICAgIC8qIFRoZSB0aHJlYWQgYmVpbmcgcXVlcmllZCBpcyBpbiB0aGUgU3VzcGVuZGVkIHN0YXRlLCBvciBpcyBpbiB0aGUgQmxvY2tlZCBzdGF0ZSB3aXRoIGFuIGluZmluaXRlIHRpbWUgb3V0LiAqLworCW9zVGhyZWFkRGVsZXRlZCAgID0gMHg0LAkJICAgICAgICAgIC8qIFRoZSB0aHJlYWQgYmVpbmcgcXVlcmllZCBoYXMgYmVlbiBkZWxldGVkLCBidXQgaXRzIFRDQiBoYXMgbm90IHlldCBiZWVuIGZyZWVkLiAqLyAgIAorICBvc1RocmVhZEVycm9yICAgICA9IDB4N0ZGRkZGRkYKK30gb3NUaHJlYWRTdGF0ZTsKKyNlbmRpZiAvKiBJTkNMVURFX2VUYXNrR2V0U3RhdGUgKi8KKworLy8vIFRpbWVyIHR5cGUgdmFsdWUgZm9yIHRoZSB0aW1lciBkZWZpbml0aW9uLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NfdGltZXJfdHlwZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCit0eXBlZGVmIGVudW0gIHsKKyAgb3NUaW1lck9uY2UgICAgICAgICAgICAgPSAgICAgMCwgICAgICAgLy8vPCBvbmUtc2hvdCB0aW1lcgorICBvc1RpbWVyUGVyaW9kaWMgICAgICAgICA9ICAgICAxICAgICAgICAvLy88IHJlcGVhdGluZyB0aW1lcgorfSBvc190aW1lcl90eXBlOworCisvLy8gRW50cnkgcG9pbnQgb2YgYSB0aHJlYWQuCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc19wdGhyZWFkIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK3R5cGVkZWYgdm9pZCAoKm9zX3B0aHJlYWQpICh2b2lkIGNvbnN0ICphcmd1bWVudCk7CisKKy8vLyBFbnRyeSBwb2ludCBvZiBhIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zX3B0aW1lciBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCit0eXBlZGVmIHZvaWQgKCpvc19wdGltZXIpICh2b2lkIGNvbnN0ICphcmd1bWVudCk7CisKKy8vID4+PiB0aGUgZm9sbG93aW5nIGRhdGEgdHlwZSBkZWZpbml0aW9ucyBtYXkgc2hhbGwgYWRhcHRlZCB0b3dhcmRzIGEgc3BlY2lmaWMgUlRPUworCisvLy8gVGhyZWFkIElEIGlkZW50aWZpZXMgdGhlIHRocmVhZCAocG9pbnRlciB0byBhIHRocmVhZCBjb250cm9sIGJsb2NrKS4KKy8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogXGIgb3NfdGhyZWFkX2NiIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCit0eXBlZGVmIFRhc2tIYW5kbGVfdCBvc1RocmVhZElkOworCisvLy8gVGltZXIgSUQgaWRlbnRpZmllcyB0aGUgdGltZXIgKHBvaW50ZXIgdG8gYSB0aW1lciBjb250cm9sIGJsb2NrKS4KKy8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogXGIgb3NfdGltZXJfY2IgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK3R5cGVkZWYgVGltZXJIYW5kbGVfdCBvc1RpbWVySWQ7CisKKy8vLyBNdXRleCBJRCBpZGVudGlmaWVzIHRoZSBtdXRleCAocG9pbnRlciB0byBhIG11dGV4IGNvbnRyb2wgYmxvY2spLgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc19tdXRleF9jYiBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgordHlwZWRlZiBTZW1hcGhvcmVIYW5kbGVfdCBvc011dGV4SWQ7CisKKy8vLyBTZW1hcGhvcmUgSUQgaWRlbnRpZmllcyB0aGUgc2VtYXBob3JlIChwb2ludGVyIHRvIGEgc2VtYXBob3JlIGNvbnRyb2wgYmxvY2spLgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc19zZW1hcGhvcmVfY2IgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK3R5cGVkZWYgU2VtYXBob3JlSGFuZGxlX3Qgb3NTZW1hcGhvcmVJZDsKKworLy8vIFBvb2wgSUQgaWRlbnRpZmllcyB0aGUgbWVtb3J5IHBvb2wgKHBvaW50ZXIgdG8gYSBtZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrKS4KKy8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogXGIgb3NfcG9vbF9jYiBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgordHlwZWRlZiBzdHJ1Y3Qgb3NfcG9vbF9jYiAqb3NQb29sSWQ7CisKKy8vLyBNZXNzYWdlIElEIGlkZW50aWZpZXMgdGhlIG1lc3NhZ2UgcXVldWUgKHBvaW50ZXIgdG8gYSBtZXNzYWdlIHF1ZXVlIGNvbnRyb2wgYmxvY2spLgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc19tZXNzYWdlUV9jYiBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgordHlwZWRlZiBRdWV1ZUhhbmRsZV90IG9zTWVzc2FnZVFJZDsKKworLy8vIE1haWwgSUQgaWRlbnRpZmllcyB0aGUgbWFpbCBxdWV1ZSAocG9pbnRlciB0byBhIG1haWwgcXVldWUgY29udHJvbCBibG9jaykuCisvLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFxiIG9zX21haWxRX2NiIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCit0eXBlZGVmIHN0cnVjdCBvc19tYWlsUV9jYiAqb3NNYWlsUUlkOworCisKKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKwordHlwZWRlZiBTdGF0aWNUYXNrX3QgICAgICAgICAgICAgICBvc1N0YXRpY1RocmVhZERlZl90OwordHlwZWRlZiBTdGF0aWNUaW1lcl90ICAgICAgICAgICAgICBvc1N0YXRpY1RpbWVyRGVmX3Q7Cit0eXBlZGVmIFN0YXRpY1NlbWFwaG9yZV90ICAgICAgICAgIG9zU3RhdGljTXV0ZXhEZWZfdDsgICAgICAgICAKK3R5cGVkZWYgU3RhdGljU2VtYXBob3JlX3QgICAgICAgICAgb3NTdGF0aWNTZW1hcGhvcmVEZWZfdDsKK3R5cGVkZWYgU3RhdGljUXVldWVfdCAgICAgICAgICAgICAgb3NTdGF0aWNNZXNzYWdlUURlZl90OworCisjZW5kaWYKKworCisKKworLy8vIFRocmVhZCBEZWZpbml0aW9uIHN0cnVjdHVyZSBjb250YWlucyBzdGFydHVwIGluZm9ybWF0aW9uIG9mIGEgdGhyZWFkLgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc190aHJlYWRfZGVmIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCit0eXBlZGVmIHN0cnVjdCBvc190aHJlYWRfZGVmICB7CisgIGNoYXIgICAgICAgICAgICAgICAgICAgKm5hbWU7ICAgICAgICAvLy88IFRocmVhZCBuYW1lIAorICBvc19wdGhyZWFkICAgICAgICAgICAgIHB0aHJlYWQ7ICAgICAgLy8vPCBzdGFydCBhZGRyZXNzIG9mIHRocmVhZCBmdW5jdGlvbgorICBvc1ByaW9yaXR5ICAgICAgICAgICAgIHRwcmlvcml0eTsgICAgLy8vPCBpbml0aWFsIHRocmVhZCBwcmlvcml0eQorICB1aW50MzJfdCAgICAgICAgICAgICAgIGluc3RhbmNlczsgICAgLy8vPCBtYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMgb2YgdGhhdCB0aHJlYWQgZnVuY3Rpb24KKyAgdWludDMyX3QgICAgICAgICAgICAgICBzdGFja3NpemU7ICAgIC8vLzwgc3RhY2sgc2l6ZSByZXF1aXJlbWVudHMgaW4gYnl0ZXM7IDAgaXMgZGVmYXVsdCBzdGFjayBzaXplCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgKmJ1ZmZlcjsgICAgICAvLy88IHN0YWNrIGJ1ZmZlciBmb3Igc3RhdGljIGFsbG9jYXRpb247IE5VTEwgZm9yIGR5bmFtaWMgYWxsb2NhdGlvbgorICBvc1N0YXRpY1RocmVhZERlZl90ICAgICpjb250cm9sYmxvY2s7ICAgICAvLy88IGNvbnRyb2wgYmxvY2sgdG8gaG9sZCB0aHJlYWQncyBkYXRhIGZvciBzdGF0aWMgYWxsb2NhdGlvbjsgTlVMTCBmb3IgZHluYW1pYyBhbGxvY2F0aW9uCisjZW5kaWYKK30gb3NUaHJlYWREZWZfdDsKKworLy8vIFRpbWVyIERlZmluaXRpb24gc3RydWN0dXJlIGNvbnRhaW5zIHRpbWVyIHBhcmFtZXRlcnMuCisvLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFxiIG9zX3RpbWVyX2RlZiBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgordHlwZWRlZiBzdHJ1Y3Qgb3NfdGltZXJfZGVmICB7CisgIG9zX3B0aW1lciAgICAgICAgICAgICAgICAgcHRpbWVyOyAgICAvLy88IHN0YXJ0IGFkZHJlc3Mgb2YgYSB0aW1lciBmdW5jdGlvbgorI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorICBvc1N0YXRpY1RpbWVyRGVmX3QgICAgICAgICpjb250cm9sYmxvY2s7ICAgICAgLy8vPCBjb250cm9sIGJsb2NrIHRvIGhvbGQgdGltZXIncyBkYXRhIGZvciBzdGF0aWMgYWxsb2NhdGlvbjsgTlVMTCBmb3IgZHluYW1pYyBhbGxvY2F0aW9uCisjZW5kaWYKK30gb3NUaW1lckRlZl90OworCisvLy8gTXV0ZXggRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgY29udGFpbnMgc2V0dXAgaW5mb3JtYXRpb24gZm9yIGEgbXV0ZXguCisvLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFxiIG9zX211dGV4X2RlZiBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgordHlwZWRlZiBzdHJ1Y3Qgb3NfbXV0ZXhfZGVmICB7CisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIGR1bW15OyAgICAvLy88IGR1bW15IHZhbHVlLgorI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorICBvc1N0YXRpY011dGV4RGVmX3QgICAgICAgICAqY29udHJvbGJsb2NrOyAgICAgIC8vLzwgY29udHJvbCBibG9jayBmb3Igc3RhdGljIGFsbG9jYXRpb247IE5VTEwgZm9yIGR5bmFtaWMgYWxsb2NhdGlvbgorI2VuZGlmCit9IG9zTXV0ZXhEZWZfdDsKKworLy8vIFNlbWFwaG9yZSBEZWZpbml0aW9uIHN0cnVjdHVyZSBjb250YWlucyBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgYSBzZW1hcGhvcmUuCisvLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFxiIG9zX3NlbWFwaG9yZV9kZWYgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK3R5cGVkZWYgc3RydWN0IG9zX3NlbWFwaG9yZV9kZWYgIHsKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgZHVtbXk7ICAgIC8vLzwgZHVtbXkgdmFsdWUuCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisgIG9zU3RhdGljU2VtYXBob3JlRGVmX3QgICAgICpjb250cm9sYmxvY2s7ICAgICAgLy8vPCBjb250cm9sIGJsb2NrIGZvciBzdGF0aWMgYWxsb2NhdGlvbjsgTlVMTCBmb3IgZHluYW1pYyBhbGxvY2F0aW9uCisjZW5kaWYKK30gb3NTZW1hcGhvcmVEZWZfdDsKKworLy8vIERlZmluaXRpb24gc3RydWN0dXJlIGZvciBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbi4KKy8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogXGIgb3NfcG9vbF9kZWYgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK3R5cGVkZWYgc3RydWN0IG9zX3Bvb2xfZGVmICB7CisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBwb29sX3N6OyAgICAvLy88IG51bWJlciBvZiBpdGVtcyAoZWxlbWVudHMpIGluIHRoZSBwb29sCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBpdGVtX3N6OyAgICAvLy88IHNpemUgb2YgYW4gaXRlbQorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqcG9vbDsgICAgLy8vPCBwb2ludGVyIHRvIG1lbW9yeSBmb3IgcG9vbAorfSBvc1Bvb2xEZWZfdDsKKworLy8vIERlZmluaXRpb24gc3RydWN0dXJlIGZvciBtZXNzYWdlIHF1ZXVlLgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc19tZXNzYWdlUV9kZWYgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK3R5cGVkZWYgc3RydWN0IG9zX21lc3NhZ2VRX2RlZiAgeworICB1aW50MzJfdCAgICAgICAgICAgICAgICBxdWV1ZV9zejsgICAgLy8vPCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgIGl0ZW1fc3o7ICAgIC8vLzwgc2l6ZSBvZiBhbiBpdGVtCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICpidWZmZXI7ICAgICAgLy8vPCBidWZmZXIgZm9yIHN0YXRpYyBhbGxvY2F0aW9uOyBOVUxMIGZvciBkeW5hbWljIGFsbG9jYXRpb24KKyAgb3NTdGF0aWNNZXNzYWdlUURlZl90ICAgKmNvbnRyb2xibG9jazsgICAgIC8vLzwgY29udHJvbCBibG9jayB0byBob2xkIHF1ZXVlJ3MgZGF0YSBmb3Igc3RhdGljIGFsbG9jYXRpb247IE5VTEwgZm9yIGR5bmFtaWMgYWxsb2NhdGlvbgorI2VuZGlmCisgIC8vdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBvb2w7ICAgIC8vLzwgbWVtb3J5IGFycmF5IGZvciBtZXNzYWdlcworfSBvc01lc3NhZ2VRRGVmX3Q7CisKKy8vLyBEZWZpbml0aW9uIHN0cnVjdHVyZSBmb3IgbWFpbCBxdWV1ZS4KKy8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogXGIgb3NfbWFpbFFfZGVmIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCit0eXBlZGVmIHN0cnVjdCBvc19tYWlsUV9kZWYgIHsKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgcXVldWVfc3o7ICAgIC8vLzwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBxdWV1ZQorICB1aW50MzJfdCAgICAgICAgICAgICAgICAgaXRlbV9zejsgICAgLy8vPCBzaXplIG9mIGFuIGl0ZW0KKyAgc3RydWN0IG9zX21haWxRX2NiICoqY2I7Cit9IG9zTWFpbFFEZWZfdDsKKworLy8vIEV2ZW50IHN0cnVjdHVyZSBjb250YWlucyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBldmVudC4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zX2V2ZW50IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKy8vLyAgICAgICBIb3dldmVyIHRoZSBzdHJ1Y3QgbWF5IGJlIGV4dGVuZGVkIGF0IHRoZSBlbmQuCit0eXBlZGVmIHN0cnVjdCAgeworICBvc1N0YXR1cyAgICAgICAgICAgICAgICAgc3RhdHVzOyAgICAgLy8vPCBzdGF0dXMgY29kZTogZXZlbnQgb3IgZXJyb3IgaW5mb3JtYXRpb24KKyAgdW5pb24gIHsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgdjsgICAgIC8vLzwgbWVzc2FnZSBhcyAzMi1iaXQgdmFsdWUKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqcDsgICAgIC8vLzwgbWVzc2FnZSBvciBtYWlsIGFzIHZvaWQgcG9pbnRlcgorICAgIGludDMyX3QgICAgICAgICAgICAgICBzaWduYWxzOyAgICAgLy8vPCBzaWduYWwgZmxhZ3MKKyAgfSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZXZlbnQgdmFsdWUKKyAgdW5pb24gIHsKKyAgICBvc01haWxRSWQgICAgICAgICAgICAgbWFpbF9pZDsgICAgIC8vLzwgbWFpbCBpZCBvYnRhaW5lZCBieSBccmVmIG9zTWFpbENyZWF0ZQorICAgIG9zTWVzc2FnZVFJZCAgICAgICBtZXNzYWdlX2lkOyAgICAgLy8vPCBtZXNzYWdlIGlkIG9idGFpbmVkIGJ5IFxyZWYgb3NNZXNzYWdlQ3JlYXRlCisgIH0gZGVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGV2ZW50IGRlZmluaXRpb24KK30gb3NFdmVudDsKKworCisvLyAgPT09PSBLZXJuZWwgQ29udHJvbCBGdW5jdGlvbnMgPT09PQorCisvLy8gSW5pdGlhbGl6ZSB0aGUgUlRPUyBLZXJuZWwgZm9yIGNyZWF0aW5nIG9iamVjdHMuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc0tlcm5lbEluaXRpYWxpemUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NLZXJuZWxJbml0aWFsaXplICh2b2lkKTsKKworLy8vIFN0YXJ0IHRoZSBSVE9TIEtlcm5lbC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zS2VybmVsU3RhcnQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NLZXJuZWxTdGFydCAodm9pZCk7CisKKy8vLyBDaGVjayBpZiB0aGUgUlRPUyBrZXJuZWwgaXMgYWxyZWFkeSBzdGFydGVkLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NLZXJuZWxSdW5uaW5nIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKy8vLyBccmV0dXJuIDAgUlRPUyBpcyBub3Qgc3RhcnRlZCwgMSBSVE9TIGlzIHN0YXJ0ZWQuCitpbnQzMl90IG9zS2VybmVsUnVubmluZyh2b2lkKTsKKworI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfU3lzVGljaykgICYmICAob3NGZWF0dXJlX1N5c1RpY2sgIT0gMCkpICAgICAvLyBTeXN0ZW0gVGltZXIgYXZhaWxhYmxlCisKKy8vLyBHZXQgdGhlIFJUT1Mga2VybmVsIHN5c3RlbSB0aW1lciBjb3VudGVyIAorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NLZXJuZWxTeXNUaWNrIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKy8vLyBccmV0dXJuIFJUT1Mga2VybmVsIHN5c3RlbSB0aW1lciBhcyAzMi1iaXQgdmFsdWUgCit1aW50MzJfdCBvc0tlcm5lbFN5c1RpY2sgKHZvaWQpOworCisvLy8gVGhlIFJUT1Mga2VybmVsIHN5c3RlbSB0aW1lciBmcmVxdWVuY3kgaW4gSHoKKy8vLyBcbm90ZSBSZWZsZWN0cyB0aGUgc3lzdGVtIHRpbWVyIHNldHRpbmcgYW5kIGlzIHR5cGljYWxseSBkZWZpbmVkIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLgorI2RlZmluZSBvc0tlcm5lbFN5c1RpY2tGcmVxdWVuY3kgICAgICAoY29uZmlnVElDS19SQVRFX0haKQorCisvLy8gQ29udmVydCBhIG1pY3Jvc2Vjb25kcyB2YWx1ZSB0byBhIFJUT1Mga2VybmVsIHN5c3RlbSB0aW1lciB2YWx1ZS4KKy8vLyBccGFyYW0gICAgICAgICBtaWNyb3NlYyAgICAgdGltZSB2YWx1ZSBpbiBtaWNyb3NlY29uZHMuCisvLy8gXHJldHVybiB0aW1lIHZhbHVlIG5vcm1hbGl6ZWQgdG8gdGhlIFxyZWYgb3NLZXJuZWxTeXNUaWNrRnJlcXVlbmN5CisjZGVmaW5lIG9zS2VybmVsU3lzVGlja01pY3JvU2VjKG1pY3Jvc2VjKSAoKCh1aW50NjRfdCltaWNyb3NlYyAqIChvc0tlcm5lbFN5c1RpY2tGcmVxdWVuY3kpKSAvIDEwMDAwMDApCisKKyNlbmRpZiAgICAvLyBTeXN0ZW0gVGltZXIgYXZhaWxhYmxlCisKKy8vICA9PT09IFRocmVhZCBNYW5hZ2VtZW50ID09PT0KKworLy8vIENyZWF0ZSBhIFRocmVhZCBEZWZpbml0aW9uIHdpdGggZnVuY3Rpb24sIHByaW9yaXR5LCBhbmQgc3RhY2sgcmVxdWlyZW1lbnRzLgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICBuYW1lIG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisvLy8gXHBhcmFtICAgICAgICAgcHJpb3JpdHkgICAgIGluaXRpYWwgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KKy8vLyBccGFyYW0gICAgICAgICBpbnN0YW5jZXMgICAgbnVtYmVyIG9mIHBvc3NpYmxlIHRocmVhZCBpbnN0YW5jZXMuCisvLy8gXHBhcmFtICAgICAgICAgc3RhY2tzeiAgICAgIHN0YWNrIHNpemUgKGluIGJ5dGVzKSByZXF1aXJlbWVudHMgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisvLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFRoZSBwYXJhbWV0ZXJzIHRvIFxiIG9zVGhyZWFkRGVmIHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQorLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyNpZiBkZWZpbmVkIChvc09iamVjdHNFeHRlcm5hbCkgIC8vIG9iamVjdCBpcyBleHRlcm5hbAorI2RlZmluZSBvc1RocmVhZERlZihuYW1lLCB0aHJlYWQsIHByaW9yaXR5LCBpbnN0YW5jZXMsIHN0YWNrc3opICBcCitleHRlcm4gY29uc3Qgb3NUaHJlYWREZWZfdCBvc190aHJlYWRfZGVmXyMjbmFtZQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSBvYmplY3QKKworI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorI2RlZmluZSBvc1RocmVhZERlZihuYW1lLCB0aHJlYWQsIHByaW9yaXR5LCBpbnN0YW5jZXMsIHN0YWNrc3opICBcCitjb25zdCBvc1RocmVhZERlZl90IG9zX3RocmVhZF9kZWZfIyNuYW1lID0gXAoreyAjbmFtZSwgKHRocmVhZCksIChwcmlvcml0eSksIChpbnN0YW5jZXMpLCAoc3RhY2tzeiksIE5VTEwsIE5VTEwgfQorCisjZGVmaW5lIG9zVGhyZWFkU3RhdGljRGVmKG5hbWUsIHRocmVhZCwgcHJpb3JpdHksIGluc3RhbmNlcywgc3RhY2tzeiwgYnVmZmVyLCBjb250cm9sKSAgXAorY29uc3Qgb3NUaHJlYWREZWZfdCBvc190aHJlYWRfZGVmXyMjbmFtZSA9IFwKK3sgI25hbWUsICh0aHJlYWQpLCAocHJpb3JpdHkpLCAoaW5zdGFuY2VzKSwgKHN0YWNrc3opLCAoYnVmZmVyKSwgKGNvbnRyb2wpIH0KKyNlbHNlIC8vY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAwCisKKyNkZWZpbmUgb3NUaHJlYWREZWYobmFtZSwgdGhyZWFkLCBwcmlvcml0eSwgaW5zdGFuY2VzLCBzdGFja3N6KSAgXAorY29uc3Qgb3NUaHJlYWREZWZfdCBvc190aHJlYWRfZGVmXyMjbmFtZSA9IFwKK3sgI25hbWUsICh0aHJlYWQpLCAocHJpb3JpdHkpLCAoaW5zdGFuY2VzKSwgKHN0YWNrc3opfQorI2VuZGlmCisjZW5kaWYKKworLy8vIEFjY2VzcyBhIFRocmVhZCBkZWZpbml0aW9uLgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgdGhyZWFkIGRlZmluaXRpb24gb2JqZWN0LgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zVGhyZWFkIHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQorLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyNkZWZpbmUgb3NUaHJlYWQobmFtZSkgIFwKKyZvc190aHJlYWRfZGVmXyMjbmFtZQorCisvLy8gQ3JlYXRlIGEgdGhyZWFkIGFuZCBhZGQgaXQgdG8gQWN0aXZlIFRocmVhZHMgYW5kIHNldCBpdCB0byBzdGF0ZSBSRUFEWS4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfZGVmICAgIHRocmVhZCBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zVGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIGFyZ3VtZW50ICAgICAgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uIGFzIHN0YXJ0IGFyZ3VtZW50LgorLy8vIFxyZXR1cm4gdGhyZWFkIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK29zVGhyZWFkSWQgb3NUaHJlYWRDcmVhdGUgKGNvbnN0IG9zVGhyZWFkRGVmX3QgKnRocmVhZF9kZWYsIHZvaWQgKmFyZ3VtZW50KTsKKworLy8vIFJldHVybiB0aGUgdGhyZWFkIElEIG9mIHRoZSBjdXJyZW50IHJ1bm5pbmcgdGhyZWFkLgorLy8vIFxyZXR1cm4gdGhyZWFkIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkR2V0SWQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NUaHJlYWRJZCBvc1RocmVhZEdldElkICh2b2lkKTsKKworLy8vIFRlcm1pbmF0ZSBleGVjdXRpb24gb2YgYSB0aHJlYWQgYW5kIHJlbW92ZSBpdCBmcm9tIEFjdGl2ZSBUaHJlYWRzLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkVGVybWluYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK29zU3RhdHVzIG9zVGhyZWFkVGVybWluYXRlIChvc1RocmVhZElkIHRocmVhZF9pZCk7CisKKy8vLyBQYXNzIGNvbnRyb2wgdG8gbmV4dCB0aHJlYWQgdGhhdCBpcyBpbiBzdGF0ZSBcYiBSRUFEWS4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkWWllbGQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NUaHJlYWRZaWVsZCAodm9pZCk7CisKKy8vLyBDaGFuZ2UgcHJpb3JpdHkgb2YgYW4gYWN0aXZlIHRocmVhZC4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccGFyYW1baW5dICAgICBwcmlvcml0eSAgICAgIG5ldyBwcmlvcml0eSB2YWx1ZSBmb3IgdGhlIHRocmVhZCBmdW5jdGlvbi4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkU2V0UHJpb3JpdHkgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NUaHJlYWRTZXRQcmlvcml0eSAob3NUaHJlYWRJZCB0aHJlYWRfaWQsIG9zUHJpb3JpdHkgcHJpb3JpdHkpOworCisvLy8gR2V0IGN1cnJlbnQgcHJpb3JpdHkgb2YgYW4gYWN0aXZlIHRocmVhZC4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccmV0dXJuIGN1cnJlbnQgcHJpb3JpdHkgdmFsdWUgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkR2V0UHJpb3JpdHkgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NQcmlvcml0eSBvc1RocmVhZEdldFByaW9yaXR5IChvc1RocmVhZElkIHRocmVhZF9pZCk7CisKKworLy8gID09PT0gR2VuZXJpYyBXYWl0IEZ1bmN0aW9ucyA9PT09CisKKy8vLyBXYWl0IGZvciBUaW1lb3V0IChUaW1lIERlbGF5KS4KKy8vLyBccGFyYW1baW5dICAgICBtaWxsaXNlYyAgICAgIHRpbWUgZGVsYXkgdmFsdWUKKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzIG9zRGVsYXkgKHVpbnQzMl90IG1pbGxpc2VjKTsKKworI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfV2FpdCkgICYmICAob3NGZWF0dXJlX1dhaXQgIT0gMCkpICAgICAvLyBHZW5lcmljIFdhaXQgYXZhaWxhYmxlCisKKy8vLyBXYWl0IGZvciBTaWduYWwsIE1lc3NhZ2UsIE1haWwsIG9yIFRpbWVvdXQuCisvLy8gXHBhcmFtW2luXSBtaWxsaXNlYyAgICAgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dAorLy8vIFxyZXR1cm4gZXZlbnQgdGhhdCBjb250YWlucyBzaWduYWwsIG1lc3NhZ2UsIG9yIG1haWwgaW5mb3JtYXRpb24gb3IgZXJyb3IgY29kZS4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zV2FpdCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCitvc0V2ZW50IG9zV2FpdCAodWludDMyX3QgbWlsbGlzZWMpOworCisjZW5kaWYgIC8vIEdlbmVyaWMgV2FpdCBhdmFpbGFibGUKKworCisvLyAgPT09PSBUaW1lciBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CisvLy8gRGVmaW5lIGEgVGltZXIgb2JqZWN0LgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgdGltZXIgb2JqZWN0LgorLy8vIFxwYXJhbSAgICAgICAgIGZ1bmN0aW9uICAgICAgbmFtZSBvZiB0aGUgdGltZXIgY2FsbCBiYWNrIGZ1bmN0aW9uLgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zVGltZXJEZWYgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCisvLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgorI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCisjZGVmaW5lIG9zVGltZXJEZWYobmFtZSwgZnVuY3Rpb24pICBcCitleHRlcm4gY29uc3Qgb3NUaW1lckRlZl90IG9zX3RpbWVyX2RlZl8jI25hbWUKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CisKKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgCisjZGVmaW5lIG9zVGltZXJEZWYobmFtZSwgZnVuY3Rpb24pICBcCitjb25zdCBvc1RpbWVyRGVmX3Qgb3NfdGltZXJfZGVmXyMjbmFtZSA9IFwKK3sgKGZ1bmN0aW9uKSwgTlVMTCB9CisKKyNkZWZpbmUgb3NUaW1lclN0YXRpY0RlZihuYW1lLCBmdW5jdGlvbiwgY29udHJvbCkgIFwKK2NvbnN0IG9zVGltZXJEZWZfdCBvc190aW1lcl9kZWZfIyNuYW1lID0gXAoreyAoZnVuY3Rpb24pLCAoY29udHJvbCkgfQorI2Vsc2UgLy9jb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDAKKyNkZWZpbmUgb3NUaW1lckRlZihuYW1lLCBmdW5jdGlvbikgIFwKK2NvbnN0IG9zVGltZXJEZWZfdCBvc190aW1lcl9kZWZfIyNuYW1lID0gXAoreyAoZnVuY3Rpb24pIH0KKyNlbmRpZgorI2VuZGlmCisKKy8vLyBBY2Nlc3MgYSBUaW1lciBkZWZpbml0aW9uLgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgdGltZXIgb2JqZWN0LgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zVGltZXIgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCisvLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgorI2RlZmluZSBvc1RpbWVyKG5hbWUpIFwKKyZvc190aW1lcl9kZWZfIyNuYW1lCisKKy8vLyBDcmVhdGUgYSB0aW1lci4KKy8vLyBccGFyYW1baW5dICAgICB0aW1lcl9kZWYgICAgIHRpbWVyIG9iamVjdCByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1RpbWVyLgorLy8vIFxwYXJhbVtpbl0gICAgIHR5cGUgICAgICAgICAgb3NUaW1lck9uY2UgZm9yIG9uZS1zaG90IG9yIG9zVGltZXJQZXJpb2RpYyBmb3IgcGVyaW9kaWMgYmVoYXZpb3IuCisvLy8gXHBhcmFtW2luXSAgICAgYXJndW1lbnQgICAgICBhcmd1bWVudCB0byB0aGUgdGltZXIgY2FsbCBiYWNrIGZ1bmN0aW9uLgorLy8vIFxyZXR1cm4gdGltZXIgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NUaW1lckNyZWF0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCitvc1RpbWVySWQgb3NUaW1lckNyZWF0ZSAoY29uc3Qgb3NUaW1lckRlZl90ICp0aW1lcl9kZWYsIG9zX3RpbWVyX3R5cGUgdHlwZSwgdm9pZCAqYXJndW1lbnQpOworCisvLy8gU3RhcnQgb3IgcmVzdGFydCBhIHRpbWVyLgorLy8vIFxwYXJhbVtpbl0gICAgIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZSBkZWxheSB2YWx1ZSBvZiB0aGUgdGltZXIuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RpbWVyU3RhcnQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NUaW1lclN0YXJ0IChvc1RpbWVySWQgdGltZXJfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKKworLy8vIFN0b3AgdGhlIHRpbWVyLgorLy8vIFxwYXJhbVtpbl0gICAgIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyQ3JlYXRlLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NUaW1lclN0b3Agc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NUaW1lclN0b3AgKG9zVGltZXJJZCB0aW1lcl9pZCk7CisKKy8vLyBEZWxldGUgYSB0aW1lciB0aGF0IHdhcyBjcmVhdGVkIGJ5IFxyZWYgb3NUaW1lckNyZWF0ZS4KKy8vLyBccGFyYW1baW5dICAgICB0aW1lcl9pZCAgICAgIHRpbWVyIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaW1lckNyZWF0ZS4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGltZXJEZWxldGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NUaW1lckRlbGV0ZSAob3NUaW1lcklkIHRpbWVyX2lkKTsKKworCisvLyAgPT09PSBTaWduYWwgTWFuYWdlbWVudCA9PT09CisKKy8vLyBTZXQgdGhlIHNwZWNpZmllZCBTaWduYWwgRmxhZ3Mgb2YgYW4gYWN0aXZlIHRocmVhZC4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccGFyYW1baW5dICAgICBzaWduYWxzICAgICAgIHNwZWNpZmllcyB0aGUgc2lnbmFsIGZsYWdzIG9mIHRoZSB0aHJlYWQgdGhhdCBzaG91bGQgYmUgc2V0LgorLy8vIFxyZXR1cm4gb3NPSyBpZiBzdWNjZXNzZnVsLCBvc0Vycm9yT1MgaWYgZmFpbGVkLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTaWduYWxTZXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgoraW50MzJfdCBvc1NpZ25hbFNldCAob3NUaHJlYWRJZCB0aHJlYWRfaWQsIGludDMyX3Qgc2lnbmFscyk7CisKKy8vLyBDbGVhciB0aGUgc3BlY2lmaWVkIFNpZ25hbCBGbGFncyBvZiBhbiBhY3RpdmUgdGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorLy8vIFxwYXJhbVtpbl0gICAgIHNpZ25hbHMgICAgICAgc3BlY2lmaWVzIHRoZSBzaWduYWwgZmxhZ3Mgb2YgdGhlIHRocmVhZCB0aGF0IHNoYWxsIGJlIGNsZWFyZWQuCisvLy8gXHJldHVybiBwcmV2aW91cyBzaWduYWwgZmxhZ3Mgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQgb3IgMHg4MDAwMDAwMCBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTaWduYWxDbGVhciBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCitpbnQzMl90IG9zU2lnbmFsQ2xlYXIgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBpbnQzMl90IHNpZ25hbHMpOworCisvLy8gV2FpdCBmb3Igb25lIG9yIG1vcmUgU2lnbmFsIEZsYWdzIHRvIGJlY29tZSBzaWduYWxlZCBmb3IgdGhlIGN1cnJlbnQgXGIgUlVOTklORyB0aHJlYWQuCisvLy8gXHBhcmFtW2luXSAgICAgc2lnbmFscyAgICAgICB3YWl0IHVudGlsIGFsbCBzcGVjaWZpZWQgc2lnbmFsIGZsYWdzIHNldCBvciAwIGZvciBhbnkgc2luZ2xlIHNpZ25hbCBmbGFnLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisvLy8gXHJldHVybiBldmVudCBmbGFnIGluZm9ybWF0aW9uIG9yIGVycm9yIGNvZGUuCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NpZ25hbFdhaXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NFdmVudCBvc1NpZ25hbFdhaXQgKGludDMyX3Qgc2lnbmFscywgdWludDMyX3QgbWlsbGlzZWMpOworCisKKy8vICA9PT09IE11dGV4IE1hbmFnZW1lbnQgPT09PQorCisvLy8gRGVmaW5lIGEgTXV0ZXguCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBtdXRleCBvYmplY3QuCisvLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFRoZSBwYXJhbWV0ZXIgdG8gXGIgb3NNdXRleERlZiBzaGFsbCBiZSBjb25zaXN0ZW50IGJ1dCB0aGUKKy8vLyAgICAgICBtYWNybyBib2R5IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCisjaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKKyNkZWZpbmUgb3NNdXRleERlZihuYW1lKSAgXAorZXh0ZXJuIGNvbnN0IG9zTXV0ZXhEZWZfdCBvc19tdXRleF9kZWZfIyNuYW1lCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAorCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisjZGVmaW5lIG9zTXV0ZXhEZWYobmFtZSkgIFwKK2NvbnN0IG9zTXV0ZXhEZWZfdCBvc19tdXRleF9kZWZfIyNuYW1lID0geyAwLCBOVUxMIH0KKworI2RlZmluZSBvc011dGV4U3RhdGljRGVmKG5hbWUsIGNvbnRyb2wpICBcCitjb25zdCBvc011dGV4RGVmX3Qgb3NfbXV0ZXhfZGVmXyMjbmFtZSA9IHsgMCwgKGNvbnRyb2wpIH0KKyNlbHNlIC8vY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAwCisjZGVmaW5lIG9zTXV0ZXhEZWYobmFtZSkgIFwKK2NvbnN0IG9zTXV0ZXhEZWZfdCBvc19tdXRleF9kZWZfIyNuYW1lID0geyAwIH0KKworI2VuZGlmCisKKyNlbmRpZgorCisvLy8gQWNjZXNzIGEgTXV0ZXggZGVmaW5pdGlvbi4KKy8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIG11dGV4IG9iamVjdC4KKy8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogVGhlIHBhcmFtZXRlciB0byBcYiBvc011dGV4IHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQorLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyNkZWZpbmUgb3NNdXRleChuYW1lKSAgXAorJm9zX211dGV4X2RlZl8jI25hbWUKKworLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIE11dGV4IG9iamVjdC4KKy8vLyBccGFyYW1baW5dICAgICBtdXRleF9kZWYgICAgIG11dGV4IGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NNdXRleC4KKy8vLyBccmV0dXJuIG11dGV4IElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTXV0ZXhDcmVhdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NNdXRleElkIG9zTXV0ZXhDcmVhdGUgKGNvbnN0IG9zTXV0ZXhEZWZfdCAqbXV0ZXhfZGVmKTsKKworLy8vIFdhaXQgdW50aWwgYSBNdXRleCBiZWNvbWVzIGF2YWlsYWJsZS4KKy8vLyBccGFyYW1baW5dICAgICBtdXRleF9pZCAgICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleENyZWF0ZS4KKy8vLyBccGFyYW1baW5dICAgICBtaWxsaXNlYyAgICAgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNdXRleFdhaXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NNdXRleFdhaXQgKG9zTXV0ZXhJZCBtdXRleF9pZCwgdWludDMyX3QgbWlsbGlzZWMpOworCisvLy8gUmVsZWFzZSBhIE11dGV4IHRoYXQgd2FzIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleFdhaXQuCisvLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhDcmVhdGUuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc011dGV4UmVsZWFzZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCitvc1N0YXR1cyBvc011dGV4UmVsZWFzZSAob3NNdXRleElkIG11dGV4X2lkKTsKKworLy8vIERlbGV0ZSBhIE11dGV4IHRoYXQgd2FzIGNyZWF0ZWQgYnkgXHJlZiBvc011dGV4Q3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG11dGV4X2lkICAgICAgbXV0ZXggSUQgb2J0YWluZWQgYnkgXHJlZiBvc011dGV4Q3JlYXRlLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNdXRleERlbGV0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCitvc1N0YXR1cyBvc011dGV4RGVsZXRlIChvc011dGV4SWQgbXV0ZXhfaWQpOworCisKKy8vICA9PT09IFNlbWFwaG9yZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CisKKyNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX1NlbWFwaG9yZSkgICYmICAob3NGZWF0dXJlX1NlbWFwaG9yZSAhPSAwKSkgICAgIC8vIFNlbWFwaG9yZSBhdmFpbGFibGUKKworLy8vIERlZmluZSBhIFNlbWFwaG9yZSBvYmplY3QuCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBzZW1hcGhvcmUgb2JqZWN0LgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zU2VtYXBob3JlRGVmIHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQorLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyNpZiBkZWZpbmVkIChvc09iamVjdHNFeHRlcm5hbCkgIC8vIG9iamVjdCBpcyBleHRlcm5hbAorI2RlZmluZSBvc1NlbWFwaG9yZURlZihuYW1lKSAgXAorZXh0ZXJuIGNvbnN0IG9zU2VtYXBob3JlRGVmX3Qgb3Nfc2VtYXBob3JlX2RlZl8jI25hbWUKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CisKKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKyNkZWZpbmUgb3NTZW1hcGhvcmVEZWYobmFtZSkgIFwKK2NvbnN0IG9zU2VtYXBob3JlRGVmX3Qgb3Nfc2VtYXBob3JlX2RlZl8jI25hbWUgPSB7IDAsIE5VTEwgfQorCisjZGVmaW5lIG9zU2VtYXBob3JlU3RhdGljRGVmKG5hbWUsIGNvbnRyb2wpICBcCitjb25zdCBvc1NlbWFwaG9yZURlZl90IG9zX3NlbWFwaG9yZV9kZWZfIyNuYW1lID0geyAwLCAoY29udHJvbCkgfQorCisjZWxzZSAvL2NvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMAorI2RlZmluZSBvc1NlbWFwaG9yZURlZihuYW1lKSAgXAorY29uc3Qgb3NTZW1hcGhvcmVEZWZfdCBvc19zZW1hcGhvcmVfZGVmXyMjbmFtZSA9IHsgMCB9CisjZW5kaWYKKyNlbmRpZgorCisvLy8gQWNjZXNzIGEgU2VtYXBob3JlIGRlZmluaXRpb24uCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBzZW1hcGhvcmUgb2JqZWN0LgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zU2VtYXBob3JlIHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQorLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyNkZWZpbmUgb3NTZW1hcGhvcmUobmFtZSkgIFwKKyZvc19zZW1hcGhvcmVfZGVmXyMjbmFtZQorCisvLy8gQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgU2VtYXBob3JlIG9iamVjdCB1c2VkIGZvciBtYW5hZ2luZyByZXNvdXJjZXMuCisvLy8gXHBhcmFtW2luXSAgICAgc2VtYXBob3JlX2RlZiBzZW1hcGhvcmUgZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1NlbWFwaG9yZS4KKy8vLyBccGFyYW1baW5dICAgICBjb3VudCAgICAgICAgIG51bWJlciBvZiBhdmFpbGFibGUgcmVzb3VyY2VzLgorLy8vIFxyZXR1cm4gc2VtYXBob3JlIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zU2VtYXBob3JlQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK29zU2VtYXBob3JlSWQgb3NTZW1hcGhvcmVDcmVhdGUgKGNvbnN0IG9zU2VtYXBob3JlRGVmX3QgKnNlbWFwaG9yZV9kZWYsIGludDMyX3QgY291bnQpOworCisvLy8gV2FpdCB1bnRpbCBhIFNlbWFwaG9yZSB0b2tlbiBiZWNvbWVzIGF2YWlsYWJsZS4KKy8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUuCisvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKy8vLyBccmV0dXJuIG51bWJlciBvZiBhdmFpbGFibGUgdG9rZW5zLCBvciAtMSBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTZW1hcGhvcmVXYWl0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK2ludDMyX3Qgb3NTZW1hcGhvcmVXYWl0IChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpOworCisvLy8gUmVsZWFzZSBhIFNlbWFwaG9yZSB0b2tlbi4KKy8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NlbWFwaG9yZVJlbGVhc2Ugc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NTZW1hcGhvcmVSZWxlYXNlIChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCk7CisKKy8vLyBEZWxldGUgYSBTZW1hcGhvcmUgdGhhdCB3YXMgY3JlYXRlZCBieSBccmVmIG9zU2VtYXBob3JlQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlIG9iamVjdCByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1NlbWFwaG9yZUNyZWF0ZS4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zU2VtYXBob3JlRGVsZXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK29zU3RhdHVzIG9zU2VtYXBob3JlRGVsZXRlIChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCk7CisKKyNlbmRpZiAgICAgLy8gU2VtYXBob3JlIGF2YWlsYWJsZQorCisKKy8vICA9PT09IE1lbW9yeSBQb29sIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KKworI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfUG9vbCkgICYmICAob3NGZWF0dXJlX1Bvb2wgIT0gMCkpICAvLyBNZW1vcnkgUG9vbCBNYW5hZ2VtZW50IGF2YWlsYWJsZQorCisvLy8gXGJyaWVmIERlZmluZSBhIE1lbW9yeSBQb29sLgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgbWVtb3J5IHBvb2wuCisvLy8gXHBhcmFtICAgICAgICAgbm8gICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBibG9ja3MgKG9iamVjdHMpIGluIHRoZSBtZW1vcnkgcG9vbC4KKy8vLyBccGFyYW0gICAgICAgICB0eXBlICAgICAgICAgIGRhdGEgdHlwZSBvZiBhIHNpbmdsZSBibG9jayAob2JqZWN0KS4KKy8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogVGhlIHBhcmFtZXRlciB0byBcYiBvc1Bvb2xEZWYgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCisvLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgorI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCisjZGVmaW5lIG9zUG9vbERlZihuYW1lLCBubywgdHlwZSkgICBcCitleHRlcm4gY29uc3Qgb3NQb29sRGVmX3Qgb3NfcG9vbF9kZWZfIyNuYW1lCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAorI2RlZmluZSBvc1Bvb2xEZWYobmFtZSwgbm8sIHR5cGUpICAgXAorY29uc3Qgb3NQb29sRGVmX3Qgb3NfcG9vbF9kZWZfIyNuYW1lID0gXAoreyAobm8pLCBzaXplb2YodHlwZSksIE5VTEwgfQorI2VuZGlmCisKKy8vLyBcYnJpZWYgQWNjZXNzIGEgTWVtb3J5IFBvb2wgZGVmaW5pdGlvbi4KKy8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIG1lbW9yeSBwb29sCisvLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFRoZSBwYXJhbWV0ZXIgdG8gXGIgb3NQb29sIHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQorLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KKyNkZWZpbmUgb3NQb29sKG5hbWUpIFwKKyZvc19wb29sX2RlZl8jI25hbWUKKworLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIG1lbW9yeSBwb29sLgorLy8vIFxwYXJhbVtpbl0gICAgIHBvb2xfZGVmICAgICAgbWVtb3J5IHBvb2wgZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2wuCisvLy8gXHJldHVybiBtZW1vcnkgcG9vbCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1Bvb2xDcmVhdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NQb29sSWQgb3NQb29sQ3JlYXRlIChjb25zdCBvc1Bvb2xEZWZfdCAqcG9vbF9kZWYpOworCisvLy8gQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1lbW9yeSBwb29sLgorLy8vIFxwYXJhbVtpbl0gICAgIHBvb2xfaWQgICAgICAgbWVtb3J5IHBvb2wgSUQgb2J0YWluIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zUG9vbENyZWF0ZS4KKy8vLyBccmV0dXJuIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb3IgTlVMTCBpbiBjYXNlIG9mIG5vIG1lbW9yeSBhdmFpbGFibGUuCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1Bvb2xBbGxvYyBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCit2b2lkICpvc1Bvb2xBbGxvYyAob3NQb29sSWQgcG9vbF9pZCk7CisKKy8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgbWVtb3J5IHBvb2wgYW5kIHNldCBtZW1vcnkgYmxvY2sgdG8gemVyby4KKy8vLyBccGFyYW1baW5dICAgICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCisvLy8gXHJldHVybiBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIG9yIE5VTEwgaW4gY2FzZSBvZiBubyBtZW1vcnkgYXZhaWxhYmxlLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NQb29sQ0FsbG9jIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK3ZvaWQgKm9zUG9vbENBbGxvYyAob3NQb29sSWQgcG9vbF9pZCk7CisKKy8vLyBSZXR1cm4gYW4gYWxsb2NhdGVkIG1lbW9yeSBibG9jayBiYWNrIHRvIGEgc3BlY2lmaWMgbWVtb3J5IHBvb2wuCisvLy8gXHBhcmFtW2luXSAgICAgcG9vbF9pZCAgICAgICBtZW1vcnkgcG9vbCBJRCBvYnRhaW4gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NQb29sQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIGJsb2NrICAgICAgICAgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jayB0aGF0IGlzIHJldHVybmVkIHRvIHRoZSBtZW1vcnkgcG9vbC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zUG9vbEZyZWUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NQb29sRnJlZSAob3NQb29sSWQgcG9vbF9pZCwgdm9pZCAqYmxvY2spOworCisjZW5kaWYgICAvLyBNZW1vcnkgUG9vbCBNYW5hZ2VtZW50IGF2YWlsYWJsZQorCisKKy8vICA9PT09IE1lc3NhZ2UgUXVldWUgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQorCisjaWYgKGRlZmluZWQgKG9zRmVhdHVyZV9NZXNzYWdlUSkgICYmICAob3NGZWF0dXJlX01lc3NhZ2VRICE9IDApKSAgICAgLy8gTWVzc2FnZSBRdWV1ZXMgYXZhaWxhYmxlCisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgTWVzc2FnZSBRdWV1ZSBEZWZpbml0aW9uLgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgcXVldWUuCisvLy8gXHBhcmFtICAgICAgICAgcXVldWVfc3ogICAgICBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgcXVldWUuCisvLy8gXHBhcmFtICAgICAgICAgdHlwZSAgICAgICAgICBkYXRhIHR5cGUgb2YgYSBzaW5nbGUgbWVzc2FnZSBlbGVtZW50IChmb3IgZGVidWdnZXIpLgorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zTWVzc2FnZVFEZWYgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCisvLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgorI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCisjZGVmaW5lIG9zTWVzc2FnZVFEZWYobmFtZSwgcXVldWVfc3osIHR5cGUpICAgXAorZXh0ZXJuIGNvbnN0IG9zTWVzc2FnZVFEZWZfdCBvc19tZXNzYWdlUV9kZWZfIyNuYW1lCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAorI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorI2RlZmluZSBvc01lc3NhZ2VRRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlKSAgIFwKK2NvbnN0IG9zTWVzc2FnZVFEZWZfdCBvc19tZXNzYWdlUV9kZWZfIyNuYW1lID0gXAoreyAocXVldWVfc3opLCBzaXplb2YgKHR5cGUpLCBOVUxMLCBOVUxMICB9CisKKyNkZWZpbmUgb3NNZXNzYWdlUVN0YXRpY0RlZihuYW1lLCBxdWV1ZV9zeiwgdHlwZSwgYnVmZmVyLCBjb250cm9sKSAgIFwKK2NvbnN0IG9zTWVzc2FnZVFEZWZfdCBvc19tZXNzYWdlUV9kZWZfIyNuYW1lID0gXAoreyAocXVldWVfc3opLCBzaXplb2YgKHR5cGUpICwgKGJ1ZmZlciksIChjb250cm9sKX0KKyNlbHNlIC8vY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxCisjZGVmaW5lIG9zTWVzc2FnZVFEZWYobmFtZSwgcXVldWVfc3osIHR5cGUpICAgXAorY29uc3Qgb3NNZXNzYWdlUURlZl90IG9zX21lc3NhZ2VRX2RlZl8jI25hbWUgPSBcCit7IChxdWV1ZV9zeiksIHNpemVvZiAodHlwZSkgfQorCisjZW5kaWYKKyNlbmRpZgorCisvLy8gXGJyaWVmIEFjY2VzcyBhIE1lc3NhZ2UgUXVldWUgRGVmaW5pdGlvbi4KKy8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHF1ZXVlCisvLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFRoZSBwYXJhbWV0ZXIgdG8gXGIgb3NNZXNzYWdlUSBzaGFsbCBiZSBjb25zaXN0ZW50IGJ1dCB0aGUKKy8vLyAgICAgICBtYWNybyBib2R5IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCisjZGVmaW5lIG9zTWVzc2FnZVEobmFtZSkgXAorJm9zX21lc3NhZ2VRX2RlZl8jI25hbWUKKworLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIE1lc3NhZ2UgUXVldWUuCisvLy8gXHBhcmFtW2luXSAgICAgcXVldWVfZGVmICAgICBxdWV1ZSBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zTWVzc2FnZVEuCisvLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgKG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkKSBvciBOVUxMLgorLy8vIFxyZXR1cm4gbWVzc2FnZSBxdWV1ZSBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc01lc3NhZ2VDcmVhdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NNZXNzYWdlUUlkIG9zTWVzc2FnZUNyZWF0ZSAoY29uc3Qgb3NNZXNzYWdlUURlZl90ICpxdWV1ZV9kZWYsIG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKKworLy8vIFB1dCBhIE1lc3NhZ2UgdG8gYSBRdWV1ZS4KKy8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKy8vLyBccGFyYW1baW5dICAgICBpbmZvICAgICAgICAgIG1lc3NhZ2UgaW5mb3JtYXRpb24uCisvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWVzc2FnZVB1dCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCitvc1N0YXR1cyBvc01lc3NhZ2VQdXQgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCwgdWludDMyX3QgaW5mbywgdWludDMyX3QgbWlsbGlzZWMpOworCisvLy8gR2V0IGEgTWVzc2FnZSBvciBXYWl0IGZvciBhIE1lc3NhZ2UgZnJvbSBhIFF1ZXVlLgorLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWVzc2FnZSBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNZXNzYWdlQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisvLy8gXHJldHVybiBldmVudCBpbmZvcm1hdGlvbiB0aGF0IGluY2x1ZGVzIHN0YXR1cyBjb2RlLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNZXNzYWdlR2V0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK29zRXZlbnQgb3NNZXNzYWdlR2V0IChvc01lc3NhZ2VRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKKworI2VuZGlmICAgICAvLyBNZXNzYWdlIFF1ZXVlcyBhdmFpbGFibGUKKworCisvLyAgPT09PSBNYWlsIFF1ZXVlIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KKworI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfTWFpbFEpICAmJiAgKG9zRmVhdHVyZV9NYWlsUSAhPSAwKSkgICAgIC8vIE1haWwgUXVldWVzIGF2YWlsYWJsZQorCisvLy8gXGJyaWVmIENyZWF0ZSBhIE1haWwgUXVldWUgRGVmaW5pdGlvbi4KKy8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHF1ZXVlCisvLy8gXHBhcmFtICAgICAgICAgcXVldWVfc3ogICAgICBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyBpbiBxdWV1ZQorLy8vIFxwYXJhbSAgICAgICAgIHR5cGUgICAgICAgICAgZGF0YSB0eXBlIG9mIGEgc2luZ2xlIG1lc3NhZ2UgZWxlbWVudAorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zTWFpbFFEZWYgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCisvLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgorI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCisjZGVmaW5lIG9zTWFpbFFEZWYobmFtZSwgcXVldWVfc3osIHR5cGUpIFwKK2V4dGVybiBzdHJ1Y3Qgb3NfbWFpbFFfY2IgKm9zX21haWxRX2NiXyMjbmFtZSBcCitleHRlcm4gb3NNYWlsUURlZl90IG9zX21haWxRX2RlZl8jI25hbWUKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CisjZGVmaW5lIG9zTWFpbFFEZWYobmFtZSwgcXVldWVfc3osIHR5cGUpIFwKK3N0cnVjdCBvc19tYWlsUV9jYiAqb3NfbWFpbFFfY2JfIyNuYW1lOyBcCitjb25zdCBvc01haWxRRGVmX3Qgb3NfbWFpbFFfZGVmXyMjbmFtZSA9ICBcCit7IChxdWV1ZV9zeiksIHNpemVvZiAodHlwZSksICgmb3NfbWFpbFFfY2JfIyNuYW1lKSB9CisjZW5kaWYKKworLy8vIFxicmllZiBBY2Nlc3MgYSBNYWlsIFF1ZXVlIERlZmluaXRpb24uCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBxdWV1ZQorLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zTWFpbFEgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCisvLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgorI2RlZmluZSBvc01haWxRKG5hbWUpICBcCismb3NfbWFpbFFfZGVmXyMjbmFtZQorCisvLy8gQ3JlYXRlIGFuZCBJbml0aWFsaXplIG1haWwgcXVldWUuCisvLy8gXHBhcmFtW2luXSAgICAgcXVldWVfZGVmICAgICByZWZlcmVuY2UgdG8gdGhlIG1haWwgcXVldWUgZGVmaW5pdGlvbiBvYnRhaW4gd2l0aCBccmVmIG9zTWFpbFEKKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCAob2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQpIG9yIE5VTEwuCisvLy8gXHJldHVybiBtYWlsIHF1ZXVlIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWFpbENyZWF0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCitvc01haWxRSWQgb3NNYWlsQ3JlYXRlIChjb25zdCBvc01haWxRRGVmX3QgKnF1ZXVlX2RlZiwgb3NUaHJlYWRJZCB0aHJlYWRfaWQpOworCisvLy8gQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1haWwuCisvLy8gXHBhcmFtW2luXSAgICAgcXVldWVfaWQgICAgICBtYWlsIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxDcmVhdGUuCisvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dAorLy8vIFxyZXR1cm4gcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgdGhhdCBjYW4gYmUgZmlsbGVkIHdpdGggbWFpbCBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisvLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc01haWxBbGxvYyBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCit2b2lkICpvc01haWxBbGxvYyAob3NNYWlsUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CisKKy8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgbWFpbCBhbmQgc2V0IG1lbW9yeSBibG9jayB0byB6ZXJvLgorLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQKKy8vLyBccmV0dXJuIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRoIG1haWwgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsQ0FsbG9jIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK3ZvaWQgKm9zTWFpbENBbGxvYyAob3NNYWlsUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CisKKy8vLyBQdXQgYSBtYWlsIHRvIGEgcXVldWUuCisvLy8gXHBhcmFtW2luXSAgICAgcXVldWVfaWQgICAgICBtYWlsIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxDcmVhdGUuCisvLy8gXHBhcmFtW2luXSAgICAgbWFpbCAgICAgICAgICBtZW1vcnkgYmxvY2sgcHJldmlvdXNseSBhbGxvY2F0ZWQgd2l0aCBccmVmIG9zTWFpbEFsbG9jIG9yIFxyZWYgb3NNYWlsQ0FsbG9jLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsUHV0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK29zU3RhdHVzIG9zTWFpbFB1dCAob3NNYWlsUUlkIHF1ZXVlX2lkLCB2b2lkICptYWlsKTsKKworLy8vIEdldCBhIG1haWwgZnJvbSBhIHF1ZXVlLgorLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQKKy8vLyBccmV0dXJuIGV2ZW50IHRoYXQgY29udGFpbnMgbWFpbCBpbmZvcm1hdGlvbiBvciBlcnJvciBjb2RlLgorLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsR2V0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KK29zRXZlbnQgb3NNYWlsR2V0IChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKKworLy8vIEZyZWUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1haWwuCisvLy8gXHBhcmFtW2luXSAgICAgcXVldWVfaWQgICAgICBtYWlsIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxDcmVhdGUuCisvLy8gXHBhcmFtW2luXSAgICAgbWFpbCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtZW1vcnkgYmxvY2sgdGhhdCB3YXMgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbEdldC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKy8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWFpbEZyZWUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgorb3NTdGF0dXMgb3NNYWlsRnJlZSAob3NNYWlsUUlkIHF1ZXVlX2lkLCB2b2lkICptYWlsKTsKKworI2VuZGlmICAvLyBNYWlsIFF1ZXVlcyBhdmFpbGFibGUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBBZGRpdGlvbmFsIHNwZWNpZmljIEFQSXMgdG8gRnJlZSBSVE9TICoqKioqKioqKioqKi8KKy8qKgorKiBAYnJpZWYgIEhhbmRsZXMgdGhlIHRpY2sgaW5jcmVtZW50CisqIEBwYXJhbSAgbm9uZS4KKyogQHJldHZhbCBub25lLgorKi8KK3ZvaWQgb3NTeXN0aWNrSGFuZGxlcih2b2lkKTsKKworI2lmICggSU5DTFVERV9lVGFza0dldFN0YXRlID09IDEgKQorLyoqCisqIEBicmllZiAgT2J0YWluIHRoZSBzdGF0ZSBvZiBhbnkgdGhyZWFkLgorKiBAcGFyYW0gICB0aHJlYWRfaWQgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisqIEByZXR2YWwgIHRoZSBzdGFlIG9mIHRoZSB0aHJlYWQsIHN0YXRlcyBhcmUgZW5jb2RlZCBieSB0aGUgb3NUaHJlYWRTdGF0ZSBlbnVtZXJhdGVkIHR5cGUuCisqLworb3NUaHJlYWRTdGF0ZSBvc1RocmVhZEdldFN0YXRlKG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKKyNlbmRpZiAvKiBJTkNMVURFX2VUYXNrR2V0U3RhdGUgKi8KKworI2lmICggSU5DTFVERV9lVGFza0dldFN0YXRlID09IDEgKQorLyoqCisqIEBicmllZiBDaGVjayBpZiBhIHRocmVhZCBpcyBhbHJlYWR5IHN1c3BlbmRlZCBvciBub3QuCisqIEBwYXJhbSB0aHJlYWRfaWQgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorKiBAcmV0dmFsIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyovCisKK29zU3RhdHVzIG9zVGhyZWFkSXNTdXNwZW5kZWQob3NUaHJlYWRJZCB0aHJlYWRfaWQpOworCisjZW5kaWYgLyogSU5DTFVERV9lVGFza0dldFN0YXRlICovCisKKy8qKgorKiBAYnJpZWYgIFN1c3BlbmQgZXhlY3V0aW9uIG9mIGEgdGhyZWFkLgorKiBAcGFyYW0gICB0aHJlYWRfaWQgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyovCitvc1N0YXR1cyBvc1RocmVhZFN1c3BlbmQgKG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKKworLyoqCisqIEBicmllZiAgUmVzdW1lIGV4ZWN1dGlvbiBvZiBhIHN1c3BlbmRlZCB0aHJlYWQuCisqIEBwYXJhbSAgIHRocmVhZF9pZCAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKyogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKi8KK29zU3RhdHVzIG9zVGhyZWFkUmVzdW1lIChvc1RocmVhZElkIHRocmVhZF9pZCk7CisKKy8qKgorKiBAYnJpZWYgIFN1c3BlbmQgZXhlY3V0aW9uIG9mIGEgYWxsIGFjdGl2ZSB0aHJlYWRzLgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqLworb3NTdGF0dXMgb3NUaHJlYWRTdXNwZW5kQWxsICh2b2lkKTsKKworLyoqCisqIEBicmllZiAgUmVzdW1lIGV4ZWN1dGlvbiBvZiBhIGFsbCBzdXNwZW5kZWQgdGhyZWFkcy4KKyogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKi8KK29zU3RhdHVzIG9zVGhyZWFkUmVzdW1lQWxsICh2b2lkKTsKKworLyoqCisqIEBicmllZiAgRGVsYXkgYSB0YXNrIHVudGlsIGEgc3BlY2lmaWVkIHRpbWUKKyogQHBhcmFtICAgUHJldmlvdXNXYWtlVGltZSAgIFBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0aGF0IGhvbGRzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSAKKyogICAgICAgICAgdGFzayB3YXMgbGFzdCB1bmJsb2NrZWQuIFByZXZpb3VzV2FrZVRpbWUgbXVzdCBiZSBpbml0aWFsaXNlZCB3aXRoIHRoZSBjdXJyZW50IHRpbWUKKyogICAgICAgICAgcHJpb3IgdG8gaXRzIGZpcnN0IHVzZSAoUHJldmlvdXNXYWtlVGltZSA9IG9zS2VybmVsU3lzVGljaygpICkKKyogQHBhcmFtICAgbWlsbGlzZWMgICAgdGltZSBkZWxheSB2YWx1ZQorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqLworb3NTdGF0dXMgb3NEZWxheVVudGlsICh1aW50MzJfdCAqUHJldmlvdXNXYWtlVGltZSwgdWludDMyX3QgbWlsbGlzZWMpOworCisvKioKKyogQGJyaWVmICAgQWJvcnQgdGhlIGRlbGF5IGZvciBhIHNwZWNpZmljIHRocmVhZAorKiBAcGFyYW0gICB0aHJlYWRfaWQgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQgICAKKyogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKi8KK29zU3RhdHVzIG9zQWJvcnREZWxheShvc1RocmVhZElkIHRocmVhZF9pZCk7CisKKy8qKgorKiBAYnJpZWYgICBMaXN0cyBhbGwgdGhlIGN1cnJlbnQgdGhyZWFkcywgYWxvbmcgd2l0aCB0aGVpciBjdXJyZW50IHN0YXRlIAorKiAgICAgICAgICBhbmQgc3RhY2sgdXNhZ2UgaGlnaCB3YXRlciBtYXJrLgorKiBAcGFyYW0gICBidWZmZXIgICBBIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBhYm92ZSBtZW50aW9uZWQgZGV0YWlscworKiAgICAgICAgICB3aWxsIGJlIHdyaXR0ZW4KKyogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorKi8KK29zU3RhdHVzIG9zVGhyZWFkTGlzdCAodWludDhfdCAqYnVmZmVyKTsKKworLyoqCisqIEBicmllZiAgUmVjZWl2ZSBhbiBpdGVtIGZyb20gYSBxdWV1ZSB3aXRob3V0IHJlbW92aW5nIHRoZSBpdGVtIGZyb20gdGhlIHF1ZXVlLgorKiBAcGFyYW0gIHF1ZXVlX2lkICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01lc3NhZ2VDcmVhdGUuCisqIEBwYXJhbSAgbWlsbGlzZWMgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgorKiBAcmV0dmFsIGV2ZW50IGluZm9ybWF0aW9uIHRoYXQgaW5jbHVkZXMgc3RhdHVzIGNvZGUuCisqLworb3NFdmVudCBvc01lc3NhZ2VQZWVrIChvc01lc3NhZ2VRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKKworLyoqCisqIEBicmllZiAgR2V0IHRoZSBudW1iZXIgb2YgbWVzc2FnZWQgc3RvcmVkIGluIGEgcXVldWUuCisqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKyogQHJldHZhbCBudW1iZXIgb2YgbWVzc2FnZXMgc3RvcmVkIGluIGEgcXVldWUuCisqLwordWludDMyX3Qgb3NNZXNzYWdlV2FpdGluZyhvc01lc3NhZ2VRSWQgcXVldWVfaWQpOworCisvKioKKyogQGJyaWVmICBHZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiBhIG1lc3NhZ2UgcXVldWUuCisqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKyogQHJldHZhbCBhdmFpbGFibGUgc3BhY2UgaW4gYSBtZXNzYWdlIHF1ZXVlLgorKi8KK3VpbnQzMl90IG9zTWVzc2FnZUF2YWlsYWJsZVNwYWNlKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCk7CisKKy8qKgorKiBAYnJpZWYgRGVsZXRlIGEgTWVzc2FnZSBRdWV1ZQorKiBAcGFyYW0gIHF1ZXVlX2lkICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01lc3NhZ2VDcmVhdGUuCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyovCitvc1N0YXR1cyBvc01lc3NhZ2VEZWxldGUgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCk7CisKKy8qKgorKiBAYnJpZWYgIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIFJlY3Vyc2l2ZSBNdXRleAorKiBAcGFyYW0gIG11dGV4X2RlZiAgICAgbXV0ZXggZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc011dGV4LgorKiBAcmV0dmFsICBtdXRleCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuLgorKi8KK29zTXV0ZXhJZCBvc1JlY3Vyc2l2ZU11dGV4Q3JlYXRlIChjb25zdCBvc011dGV4RGVmX3QgKm11dGV4X2RlZik7CisKKy8qKgorKiBAYnJpZWYgIFJlbGVhc2UgYSBSZWN1cnNpdmUgTXV0ZXgKKyogQHBhcmFtICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUuCisqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyovCitvc1N0YXR1cyBvc1JlY3Vyc2l2ZU11dGV4UmVsZWFzZSAob3NNdXRleElkIG11dGV4X2lkKTsKKworLyoqCisqIEBicmllZiAgUmVsZWFzZSBhIFJlY3Vyc2l2ZSBNdXRleAorKiBAcGFyYW0gICBtdXRleF9pZCAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUuCisqIEBwYXJhbSBtaWxsaXNlYyAgICAgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgorKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisqLworb3NTdGF0dXMgb3NSZWN1cnNpdmVNdXRleFdhaXQgKG9zTXV0ZXhJZCBtdXRleF9pZCwgdWludDMyX3QgbWlsbGlzZWMpOworCisvKioKKyogQGJyaWVmICBSZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IHZhbHVlIG9mIGEgY291bnRpbmcgc2VtYXBob3JlCisqIEBwYXJhbSAgIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlX2lkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUuCisqIEByZXR2YWwgIGNvdW50IHZhbHVlCisqLwordWludDMyX3Qgb3NTZW1hcGhvcmVHZXRDb3VudChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIF9DTVNJU19PU19ICmRpZmYgLS1naXQgYS9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vcy5oIGIvU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg4NWJiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MuaApAQCAtMCwwICsxLDgzNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnRpb25zIENvcHlyaWdodCCpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzIEludGVybmF0aW9uYWwgTi5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgQVJNIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpOyB5b3UgbWF5CisgKiBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogUHJvamVjdDogICAgICBDTVNJUy1SVE9TIEFQSQorICogVGl0bGU6ICAgICAgICBjbXNpc19vcy5oIGhlYWRlciBmaWxlCisgKgorICogVmVyc2lvbiAwLjAyCisgKiAgICBJbml0aWFsIFByb3Bvc2FsIFBoYXNlCisgKiBWZXJzaW9uIDAuMDMKKyAqICAgIG9zS2VybmVsU3RhcnQgYWRkZWQsIG9wdGlvbmFsIGZlYXR1cmU6IG1haW4gc3RhcnRlZCBhcyB0aHJlYWQKKyAqICAgIG9zU2VtYXBob3JlcyBoYXZlIHN0YW5kYXJkIGJlaGF2aW9yCisgKiAgICBvc1RpbWVyQ3JlYXRlIGRvZXMgbm90IHN0YXJ0IHRoZSB0aW1lciwgYWRkZWQgb3NUaW1lclN0YXJ0CisgKiAgICBvc1RocmVhZFBhc3MgaXMgcmVuYW1lZCB0byBvc1RocmVhZFlpZWxkCisgKiBWZXJzaW9uIDEuMDEKKyAqICAgIFN1cHBvcnQgZm9yIEMrKyBpbnRlcmZhY2UKKyAqICAgICAtIGNvbnN0IGF0dHJpYnV0ZSByZW1vdmVkIGZyb20gdGhlIG9zWHh4eERlZl90IHR5cGVkZWZzCisgKiAgICAgLSBjb25zdCBhdHRyaWJ1dGUgYWRkZWQgdG8gdGhlIG9zWHh4eERlZiBtYWNyb3MKKyAqICAgIEFkZGVkOiBvc1RpbWVyRGVsZXRlLCBvc011dGV4RGVsZXRlLCBvc1NlbWFwaG9yZURlbGV0ZQorICogICAgQWRkZWQ6IG9zS2VybmVsSW5pdGlhbGl6ZQorICogVmVyc2lvbiAxLjAyCisgKiAgICBDb250cm9sIGZ1bmN0aW9ucyBmb3Igc2hvcnQgdGltZW91dHMgaW4gbWljcm9zZWNvbmQgcmVzb2x1dGlvbjoKKyAqICAgIEFkZGVkOiBvc0tlcm5lbFN5c1RpY2ssIG9zS2VybmVsU3lzVGlja0ZyZXF1ZW5jeSwgb3NLZXJuZWxTeXNUaWNrTWljcm9TZWMKKyAqICAgIFJlbW92ZWQ6IG9zU2lnbmFsR2V0CisgKiBWZXJzaW9uIDIuMC4wCisgKiAgICBPUyBvYmplY3RzIGNyZWF0aW9uIHdpdGhvdXQgbWFjcm9zIChkeW5hbWljIGNyZWF0aW9uIGFuZCByZXNvdXJjZSBhbGxvY2F0aW9uKToKKyAqICAgICAtIGFkZGVkOiBvc1h4eHhOZXcgZnVuY3Rpb25zIHdoaWNoIHJlcGxhY2Ugb3NYeHh4Q3JlYXRlCisgKiAgICAgLSBhZGRlZDogb3NYeHh4QXR0cl90IHN0cnVjdHVyZXMKKyAqICAgICAtIGRlcHJlY2F0ZWQ6IG9zWHh4eENyZWF0ZSBmdW5jdGlvbnMsIG9zWHh4eERlZl90IHN0cnVjdHVyZXMKKyAqICAgICAtIGRlcHJlY2F0ZWQ6IG9zWHh4eERlZiBhbmQgb3NYeHh4IG1hY3JvcworICogICAgb3NTdGF0dXMgY29kZXMgc2ltcGxpZmllZCBhbmQgcmVuYW1lZCB0byBvc1N0YXR1c190CisgKiAgICBvc0V2ZW50IHJldHVybiBzdHJ1Y3R1cmUgZGVwcmVjYXRlZAorICogICAgS2VybmVsOgorICogICAgIC0gYWRkZWQ6IG9zS2VybmVsSW5mb190IGFuZCBvc0tlcm5lbEdldEluZm8KKyAqICAgICAtIGFkZGVkOiBvc0tlcm5lbFN0YXRlX3QgYW5kIG9zS2VybmVsR2V0U3RhdGUgKHJlcGxhY2VzIG9zS2VybmVsUnVubmluZykKKyAqICAgICAtIGFkZGVkOiBvc0tlcm5lbExvY2ssIG9zS2VybmVsVW5sb2NrCisgKiAgICAgLSBhZGRlZDogb3NLZXJuZWxTdXNwZW5kLCBvc0tlcm5lbFJlc3VtZQorICogICAgIC0gYWRkZWQ6IG9zS2VybmVsR2V0VGlja0NvdW50LCBvc0tlcm5lbEdldFRpY2tGcmVxCisgKiAgICAgLSByZW5hbWVkIG9zS2VybmVsU3lzVGljayB0byBvc0tlcm5lbEdldFN5c1RpbWVyQ291bnQKKyAqICAgICAtIHJlcGxhY2VkIG9zS2VybmVsU3lzVGlja0ZyZXF1ZW5jeSB3aXRoIG9zS2VybmVsR2V0U3lzVGltZXJGcmVxCisgKiAgICAgLSBkZXByZWNhdGVkIG9zS2VybmVsU3lzVGlja01pY3JvU2VjCisgKiAgICBUaHJlYWQ6CisgKiAgICAgLSBleHRlbmRlZCBudW1iZXIgb2YgdGhyZWFkIHByaW9yaXRpZXMKKyAqICAgICAtIHJlbmFtZWQgb3NQcmlvcmlyeSB0byBvc1ByaW9yaXJ5X3QKKyAqICAgICAtIHJlcGxhY2VkIG9zVGhyZWFkQ3JlYXRlIHdpdGggb3NUaHJlYWROZXcKKyAqICAgICAtIGFkZGVkOiBvc1RocmVhZEdldE5hbWUKKyAqICAgICAtIGFkZGVkOiBvc1RocmVhZFN0YXRlX3QgYW5kIG9zVGhyZWFkR2V0U3RhdGUKKyAqICAgICAtIGFkZGVkOiBvc1RocmVhZEdldFN0YWNrU2l6ZSwgb3NUaHJlYWRHZXRTdGFja1NwYWNlCisgKiAgICAgLSBhZGRlZDogb3NUaHJlYWRTdXNwZW5kLCBvc1RocmVhZFJlc3VtZQorICogICAgIC0gYWRkZWQ6IG9zVGhyZWFkSm9pbiwgb3NUaHJlYWREZXRhY2gsIG9zVGhyZWFkRXhpdAorICogICAgIC0gYWRkZWQ6IG9zVGhyZWFkR2V0Q291bnQsIG9zVGhyZWFkRW51bWVyYXRlCisgKiAgICAgLSBhZGRlZDogVGhyZWFkIEZsYWdzIChtb3ZlZCBmcm9tIFNpZ25hbHMpCisgKiAgICBTaWduYWxzOgorICogICAgIC0gcmVuYW1lZCBvc1NpZ25hbHMgdG8gb3NUaHJlYWRGbGFncyAobW92ZWQgdG8gVGhyZWFkIEZsYWdzKQorICogICAgIC0gY2hhbmdlZCByZXR1cm4gdmFsdWUgb2YgU2V0L0NsZWFyL1dhaXQgZnVuY3Rpb25zCisgKiAgICAgLSBDbGVhciBmdW5jdGlvbiBsaW1pdGVkIHRvIGN1cnJlbnQgcnVubmluZyB0aHJlYWQKKyAqICAgICAtIGV4dGVuZGVkIFdhaXQgZnVuY3Rpb24gKG9wdGlvbnMpCisgKiAgICAgLSBhZGRlZDogb3NUaHJlYWRGbGFnc0dldAorICogICAgRXZlbnQgRmxhZ3M6CisgKiAgICAgLSBhZGRlZCBuZXcgaW5kZXBlbmRlbnQgb2JqZWN0IGZvciBoYW5kbGluZyBFdmVudCBGbGFncworICogICAgRGVsYXkgYW5kIFdhaXQgZnVuY3Rpb25zOgorICogICAgIC0gYWRkZWQ6IG9zRGVsYXlVbnRpbAorICogICAgIC0gZGVwcmVjYXRlZDogb3NXYWl0CisgKiAgICBUaW1lcjoKKyAqICAgICAtIHJlcGxhY2VkIG9zVGltZXJDcmVhdGUgd2l0aCBvc1RpbWVyTmV3CisgKiAgICAgLSBhZGRlZDogb3NUaW1lckdldE5hbWUsIG9zVGltZXJJc1J1bm5pbmcKKyAqICAgIE11dGV4OgorICogICAgIC0gZXh0ZW5kZWQ6IGF0dHJpYnV0ZXMgKFJlY3Vyc2l2ZSwgUHJpb3JpdHkgSW5oZXJpdCwgUm9idXN0KQorICogICAgIC0gcmVwbGFjZWQgb3NNdXRleENyZWF0ZSB3aXRoIG9zTXV0ZXhOZXcKKyAqICAgICAtIHJlbmFtZWQgb3NNdXRleFdhaXQgdG8gb3NNdXRleEFjcXVpcmUKKyAqICAgICAtIGFkZGVkOiBvc011dGV4R2V0TmFtZSwgb3NNdXRleEdldE93bmVyCisgKiAgICBTZW1hcGhvcmU6CisgKiAgICAgLSBleHRlbmRlZDogbWF4aW11bSBhbmQgaW5pdGlhbCB0b2tlbiBjb3VudAorICogICAgIC0gcmVwbGFjZWQgb3NTZW1hcGhvcmVDcmVhdGUgd2l0aCBvc1NlbWFwaG9yZU5ldworICogICAgIC0gcmVuYW1lZCBvc1NlbWFwaG9yZVdhaXQgdG8gb3NTZW1hcGhvcmVBY3F1aXJlIChjaGFuZ2VkIHJldHVybiB2YWx1ZSkKKyAqICAgICAtIGFkZGVkOiBvc1NlbWFwaG9yZUdldE5hbWUsIG9zU2VtYXBob3JlR2V0Q291bnQKKyAqICAgIE1lbW9yeSBQb29sOgorICogICAgIC0gdXNpbmcgb3NNZW1vcnlQb29sIHByZWZpeCBpbnN0ZWFkIG9mIG9zUG9vbAorICogICAgIC0gcmVwbGFjZWQgb3NQb29sQ3JlYXRlIHdpdGggb3NNZW1vcnlQb29sTmV3CisgKiAgICAgLSBleHRlbmRlZCBvc01lbW9yeVBvb2xBbGxvYyAodGltZW91dCkKKyAqICAgICAtIGFkZGVkOiBvc01lbW9yeVBvb2xHZXROYW1lCisgKiAgICAgLSBhZGRlZDogb3NNZW1vcnlQb29sR2V0Q2FwYWNpdHksIG9zTWVtb3J5UG9vbEdldEJsb2NrU2l6ZQorICogICAgIC0gYWRkZWQ6IG9zTWVtb3J5UG9vbEdldENvdW50LCBvc01lbW9yeVBvb2xHZXRTcGFjZQorICogICAgIC0gYWRkZWQ6IG9zTWVtb3J5UG9vbERlbGV0ZQorICogICAgIC0gZGVwcmVjYXRlZDogb3NQb29sQ0FsbG9jCisgKiAgICBNZXNzYWdlIFF1ZXVlOgorICogICAgIC0gZXh0ZW5kZWQ6IGZpeGVkIHNpemUgbWVzc2FnZSBpbnN0ZWFkIG9mIGEgc2luZ2xlIDMyLWJpdCB2YWx1ZQorICogICAgIC0gdXNpbmcgb3NNZXNzYWdlUXVldWUgcHJlZml4IGluc3RlYWQgb2Ygb3NNZXNzYWdlCisgKiAgICAgLSByZXBsYWNlZCBvc01lc3NhZ2VDcmVhdGUgd2l0aCBvc01lc3NhZ2VRdWV1ZU5ldworICogICAgIC0gdXBkYXRlZDogb3NNZXNzYWdlUXVldWVQdXQsIG9zTWVzc2FnZVF1ZXVlR2V0CisgKiAgICAgLSBhZGRlZDogb3NNZXNzYWdlUXVldWVHZXROYW1lCisgKiAgICAgLSBhZGRlZDogb3NNZXNzYWdlUXVldWVHZXRDYXBhY2l0eSwgb3NNZXNzYWdlUXVldWVHZXRNc2dTaXplCisgKiAgICAgLSBhZGRlZDogb3NNZXNzYWdlUXVldWVHZXRDb3VudCwgb3NNZXNzYWdlUXVldWVHZXRTcGFjZQorICogICAgIC0gYWRkZWQ6IG9zTWVzc2FnZVF1ZXVlUmVzZXQsIG9zTWVzc2FnZVF1ZXVlRGVsZXRlCisgKiAgICBNYWlsIFF1ZXVlOgorICogICAgIC0gZGVwcmVjYXRlZCAoc3VwZXJzZWRlZCBieSBleHRlbmRlZCBNZXNzYWdlIFF1ZXVlIGZ1bmN0aW9uYWxpdHkpCisgKiBWZXJzaW9uIDIuMS4wCisgKiAgICBTdXBwb3J0IGZvciBjcml0aWNhbCBhbmQgdW5jcml0aWNhbCBzZWN0aW9ucyAobmVzdGluZyBzYWZlKToKKyAqICAgIC0gdXBkYXRlZDogb3NLZXJuZWxMb2NrLCBvc0tlcm5lbFVubG9jaworICogICAgLSBhZGRlZDogb3NLZXJuZWxSZXN0b3JlTG9jaworICogICAgVXBkYXRlZCBUaHJlYWQgYW5kIEV2ZW50IEZsYWdzOgorICogICAgLSBjaGFuZ2VkIGZsYWdzIHBhcmFtZXRlciBhbmQgcmV0dXJuIHR5cGUgZnJvbSBpbnQzMl90IHRvIHVpbnQzMl90CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgQ01TSVNfT1NfSF8KKyNkZWZpbmUgQ01TSVNfT1NfSF8KKworI2RlZmluZSBvc0NNU0lTICAgICAgICAgICAgIDB4MjAwMDFVICAgIC8vLzwgQVBJIHZlcnNpb24gKG1haW5bMzE6MTZdLnN1YlsxNTowXSkKKworI2RlZmluZSBvc0NNU0lTX0ZyZWVSVE9TICAgIDB4QTAwMDFVICAgIC8vLzwgUlRPUyBpZGVudGlmaWNhdGlvbiBhbmQgdmVyc2lvbiAobWFpblszMToxNl0uc3ViWzE1OjBdKQorCisjZGVmaW5lIG9zS2VybmVsU3lzdGVtSWQgICAgIkZyZWVSVE9TIFYxMC4wLjEiIC8vLzwgUlRPUyBpZGVudGlmaWNhdGlvbiBzdHJpbmcKKworI2RlZmluZSBvc0ZlYXR1cmVfTWFpblRocmVhZCAgMCAgICAgICAgIC8vLzwgbWFpbiB0aHJlYWQgICAgICAxPW1haW4gY2FuIGJlIHRocmVhZCwgMD1ub3QgYXZhaWxhYmxlCisjZGVmaW5lIG9zRmVhdHVyZV9TaWduYWxzICAgICAyNFUgICAgICAgLy8vPCBtYXhpbXVtIG51bWJlciBvZiBTaWduYWwgRmxhZ3MgYXZhaWxhYmxlIHBlciB0aHJlYWQKKyNkZWZpbmUgb3NGZWF0dXJlX1NlbWFwaG9yZSAgIDY1NTM1VSAgICAvLy88IG1heGltdW0gY291bnQgZm9yIFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUgZnVuY3Rpb24KKyNkZWZpbmUgb3NGZWF0dXJlX1dhaXQgICAgICAgIDAgICAgICAgICAvLy88IG9zV2FpdCBmdW5jdGlvbjogMT1hdmFpbGFibGUsIDA9bm90IGF2YWlsYWJsZQorI2RlZmluZSBvc0ZlYXR1cmVfU3lzVGljayAgICAgMSAgICAgICAgIC8vLzwgb3NLZXJuZWxTeXNUaWNrIGZ1bmN0aW9uczogMT1hdmFpbGFibGUsIDA9bm90IGF2YWlsYWJsZQorI2RlZmluZSBvc0ZlYXR1cmVfUG9vbCAgICAgICAgMCAgICAgICAgIC8vLzwgTWVtb3J5IFBvb2xzOiAgICAxPWF2YWlsYWJsZSwgMD1ub3QgYXZhaWxhYmxlCisjZGVmaW5lIG9zRmVhdHVyZV9NZXNzYWdlUSAgICAxICAgICAgICAgLy8vPCBNZXNzYWdlIFF1ZXVlczogIDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKKyNkZWZpbmUgb3NGZWF0dXJlX01haWxRICAgICAgIDAgICAgICAgICAvLy88IE1haWwgUXVldWVzOiAgICAgMT1hdmFpbGFibGUsIDA9bm90IGF2YWlsYWJsZQorCisjaWYgICBkZWZpbmVkKF9fQ0NfQVJNKQorI2RlZmluZSBvc19JblJlZ3MgX192YWx1ZV9pbl9yZWdzCisjZWxpZiBkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgJiYgKF9fQVJNQ0NfVkVSU0lPTiA+PSA2MDEwMDUwKQorI2RlZmluZSBvc19JblJlZ3MgX19hdHRyaWJ1dGVfXygodmFsdWVfaW5fcmVncykpCisjZWxzZQorI2RlZmluZSBvc19JblJlZ3MKKyNlbmRpZgorCisjaW5jbHVkZSAiY21zaXNfb3MyLmgiCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKworLy8gPT09PSBFbnVtZXJhdGlvbnMsIHN0cnVjdHVyZXMsIGRlZmluZXMgPT09PQorCisvLy8gUHJpb3JpdHkgdmFsdWVzLgorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCit0eXBlZGVmIGVudW0geworICBvc1ByaW9yaXR5SWRsZSAgICAgICAgICA9IC0zLCAgICAgICAgIC8vLzwgUHJpb3JpdHk6IGlkbGUgKGxvd2VzdCkKKyAgb3NQcmlvcml0eUxvdyAgICAgICAgICAgPSAtMiwgICAgICAgICAvLy88IFByaW9yaXR5OiBsb3cKKyAgb3NQcmlvcml0eUJlbG93Tm9ybWFsICAgPSAtMSwgICAgICAgICAvLy88IFByaW9yaXR5OiBiZWxvdyBub3JtYWwKKyAgb3NQcmlvcml0eU5vcm1hbCAgICAgICAgPSAgMCwgICAgICAgICAvLy88IFByaW9yaXR5OiBub3JtYWwgKGRlZmF1bHQpCisgIG9zUHJpb3JpdHlBYm92ZU5vcm1hbCAgID0gKzEsICAgICAgICAgLy8vPCBQcmlvcml0eTogYWJvdmUgbm9ybWFsCisgIG9zUHJpb3JpdHlIaWdoICAgICAgICAgID0gKzIsICAgICAgICAgLy8vPCBQcmlvcml0eTogaGlnaAorICBvc1ByaW9yaXR5UmVhbHRpbWUgICAgICA9ICszLCAgICAgICAgIC8vLzwgUHJpb3JpdHk6IHJlYWx0aW1lIChoaWdoZXN0KQorICBvc1ByaW9yaXR5RXJyb3IgICAgICAgICA9IDB4ODQsICAgICAgIC8vLzwgU3lzdGVtIGNhbm5vdCBkZXRlcm1pbmUgcHJpb3JpdHkgb3IgaWxsZWdhbCBwcmlvcml0eS4KKyAgb3NQcmlvcml0eVJlc2VydmVkICAgICAgPSAweDdGRkZGRkZGICAvLy88IFByZXZlbnRzIGVudW0gZG93bi1zaXplIGNvbXBpbGVyIG9wdGltaXphdGlvbi4KK30gb3NQcmlvcml0eTsKKyNlbHNlCisjZGVmaW5lIG9zUHJpb3JpdHkgb3NQcmlvcml0eV90CisjZW5kaWYKKworLy8vIEVudHJ5IHBvaW50IG9mIGEgdGhyZWFkLgordHlwZWRlZiB2b2lkICgqb3NfcHRocmVhZCkgKHZvaWQgY29uc3QgKmFyZ3VtZW50KTsKKworLy8vIEVudHJ5IHBvaW50IG9mIGEgdGltZXIgY2FsbCBiYWNrIGZ1bmN0aW9uLgordHlwZWRlZiB2b2lkICgqb3NfcHRpbWVyKSAodm9pZCBjb25zdCAqYXJndW1lbnQpOworCisvLy8gVGltZXIgdHlwZS4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQordHlwZWRlZiBlbnVtIHsKKyAgb3NUaW1lck9uY2UgICAgICAgICAgICAgPSAwLCAgICAgICAgICAvLy88IE9uZS1zaG90IHRpbWVyLgorICBvc1RpbWVyUGVyaW9kaWMgICAgICAgICA9IDEgICAgICAgICAgIC8vLzwgUmVwZWF0aW5nIHRpbWVyLgorfSBvc190aW1lcl90eXBlOworI2Vsc2UKKyNkZWZpbmUgb3NfdGltZXJfdHlwZSBvc1RpbWVyVHlwZV90CisjZW5kaWYKKworLy8vIFRpbWVvdXQgdmFsdWUuCisjZGVmaW5lIG9zV2FpdEZvcmV2ZXIgICAgICAgMHhGRkZGRkZGRlUgLy8vPCBXYWl0IGZvcmV2ZXIgdGltZW91dCB2YWx1ZS4KKworLy8vIFN0YXR1cyBjb2RlIHZhbHVlcyByZXR1cm5lZCBieSBDTVNJUy1SVE9TIGZ1bmN0aW9ucy4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQordHlwZWRlZiBlbnVtIHsKKyAgb3NPSyAgICAgICAgICAgICAgICAgICAgPSAgICAwLCAgICAgICAvLy88IEZ1bmN0aW9uIGNvbXBsZXRlZDsgbm8gZXJyb3Igb3IgZXZlbnQgb2NjdXJyZWQuCisgIG9zRXZlbnRTaWduYWwgICAgICAgICAgID0gMHgwOCwgICAgICAgLy8vPCBGdW5jdGlvbiBjb21wbGV0ZWQ7IHNpZ25hbCBldmVudCBvY2N1cnJlZC4KKyAgb3NFdmVudE1lc3NhZ2UgICAgICAgICAgPSAweDEwLCAgICAgICAvLy88IEZ1bmN0aW9uIGNvbXBsZXRlZDsgbWVzc2FnZSBldmVudCBvY2N1cnJlZC4KKyAgb3NFdmVudE1haWwgICAgICAgICAgICAgPSAweDIwLCAgICAgICAvLy88IEZ1bmN0aW9uIGNvbXBsZXRlZDsgbWFpbCBldmVudCBvY2N1cnJlZC4KKyAgb3NFdmVudFRpbWVvdXQgICAgICAgICAgPSAweDQwLCAgICAgICAvLy88IEZ1bmN0aW9uIGNvbXBsZXRlZDsgdGltZW91dCBvY2N1cnJlZC4KKyAgb3NFcnJvclBhcmFtZXRlciAgICAgICAgPSAweDgwLCAgICAgICAvLy88IFBhcmFtZXRlciBlcnJvcjogYSBtYW5kYXRvcnkgcGFyYW1ldGVyIHdhcyBtaXNzaW5nIG9yIHNwZWNpZmllZCBhbiBpbmNvcnJlY3Qgb2JqZWN0LgorICBvc0Vycm9yUmVzb3VyY2UgICAgICAgICA9IDB4ODEsICAgICAgIC8vLzwgUmVzb3VyY2Ugbm90IGF2YWlsYWJsZTogYSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2FzIG5vdCBhdmFpbGFibGUuCisgIG9zRXJyb3JUaW1lb3V0UmVzb3VyY2UgID0gMHhDMSwgICAgICAgLy8vPCBSZXNvdXJjZSBub3QgYXZhaWxhYmxlIHdpdGhpbiBnaXZlbiB0aW1lOiBhIHNwZWNpZmllZCByZXNvdXJjZSB3YXMgbm90IGF2YWlsYWJsZSB3aXRoaW4gdGhlIHRpbWVvdXQgcGVyaW9kLgorICBvc0Vycm9ySVNSICAgICAgICAgICAgICA9IDB4ODIsICAgICAgIC8vLzwgTm90IGFsbG93ZWQgaW4gSVNSIGNvbnRleHQ6IHRoZSBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMuCisgIG9zRXJyb3JJU1JSZWN1cnNpdmUgICAgID0gMHg4MywgICAgICAgLy8vPCBGdW5jdGlvbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZnJvbSBJU1Igd2l0aCBzYW1lIG9iamVjdC4KKyAgb3NFcnJvclByaW9yaXR5ICAgICAgICAgPSAweDg0LCAgICAgICAvLy88IFN5c3RlbSBjYW5ub3QgZGV0ZXJtaW5lIHByaW9yaXR5IG9yIHRocmVhZCBoYXMgaWxsZWdhbCBwcmlvcml0eS4KKyAgb3NFcnJvck5vTWVtb3J5ICAgICAgICAgPSAweDg1LCAgICAgICAvLy88IFN5c3RlbSBpcyBvdXQgb2YgbWVtb3J5OiBpdCB3YXMgaW1wb3NzaWJsZSB0byBhbGxvY2F0ZSBvciByZXNlcnZlIG1lbW9yeSBmb3IgdGhlIG9wZXJhdGlvbi4KKyAgb3NFcnJvclZhbHVlICAgICAgICAgICAgPSAweDg2LCAgICAgICAvLy88IFZhbHVlIG9mIGEgcGFyYW1ldGVyIGlzIG91dCBvZiByYW5nZS4KKyAgb3NFcnJvck9TICAgICAgICAgICAgICAgPSAweEZGLCAgICAgICAvLy88IFVuc3BlY2lmaWVkIFJUT1MgZXJyb3I6IHJ1bi10aW1lIGVycm9yIGJ1dCBubyBvdGhlciBlcnJvciBtZXNzYWdlIGZpdHMuCisgIG9zU3RhdHVzUmVzZXJ2ZWQgICAgICAgID0gMHg3RkZGRkZGRiAgLy8vPCBQcmV2ZW50cyBlbnVtIGRvd24tc2l6ZSBjb21waWxlciBvcHRpbWl6YXRpb24uCit9IG9zU3RhdHVzOworI2Vsc2UKK3R5cGVkZWYgaW50MzJfdCAgICAgICAgICAgICAgICAgIG9zU3RhdHVzOworI2RlZmluZSBvc0V2ZW50U2lnbmFsICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgb3NFdmVudE1lc3NhZ2UgICAgICAgICAgKDB4MTApCisjZGVmaW5lIG9zRXZlbnRNYWlsICAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBvc0V2ZW50VGltZW91dCAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgb3NFcnJvck9TICAgICAgICAgICAgICAgb3NFcnJvcgorI2RlZmluZSBvc0Vycm9yVGltZW91dFJlc291cmNlICBvc0Vycm9yVGltZW91dAorI2RlZmluZSBvc0Vycm9ySVNSUmVjdXJzaXZlICAgICAoLTEyNikKKyNkZWZpbmUgb3NFcnJvclZhbHVlICAgICAgICAgICAgKC0xMjcpCisjZGVmaW5lIG9zRXJyb3JQcmlvcml0eSAgICAgICAgICgtMTI4KQorI2VuZGlmCisKKworLy8gPj4+IHRoZSBmb2xsb3dpbmcgZGF0YSB0eXBlIGRlZmluaXRpb25zIG1heSBiZSBhZGFwdGVkIHRvd2FyZHMgYSBzcGVjaWZpYyBSVE9TCisKKy8vLyBUaHJlYWQgSUQgaWRlbnRpZmllcyB0aGUgdGhyZWFkLgorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCit0eXBlZGVmIHZvaWQgKm9zVGhyZWFkSWQ7CisjZWxzZQorI2RlZmluZSBvc1RocmVhZElkIG9zVGhyZWFkSWRfdAorI2VuZGlmCisKKy8vLyBUaW1lciBJRCBpZGVudGlmaWVzIHRoZSB0aW1lci4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQordHlwZWRlZiB2b2lkICpvc1RpbWVySWQ7CisjZWxzZQorI2RlZmluZSBvc1RpbWVySWQgb3NUaW1lcklkX3QKKyNlbmRpZgorCisvLy8gTXV0ZXggSUQgaWRlbnRpZmllcyB0aGUgbXV0ZXguCisjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKK3R5cGVkZWYgdm9pZCAqb3NNdXRleElkOworI2Vsc2UKKyNkZWZpbmUgb3NNdXRleElkIG9zTXV0ZXhJZF90CisjZW5kaWYKKworLy8vIFNlbWFwaG9yZSBJRCBpZGVudGlmaWVzIHRoZSBzZW1hcGhvcmUuCisjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKK3R5cGVkZWYgdm9pZCAqb3NTZW1hcGhvcmVJZDsKKyNlbHNlCisjZGVmaW5lIG9zU2VtYXBob3JlSWQgb3NTZW1hcGhvcmVJZF90CisjZW5kaWYKKworLy8vIFBvb2wgSUQgaWRlbnRpZmllcyB0aGUgbWVtb3J5IHBvb2wuCit0eXBlZGVmIHZvaWQgKm9zUG9vbElkOworCisvLy8gTWVzc2FnZSBJRCBpZGVudGlmaWVzIHRoZSBtZXNzYWdlIHF1ZXVlLgordHlwZWRlZiB2b2lkICpvc01lc3NhZ2VRSWQ7CisKKy8vLyBNYWlsIElEIGlkZW50aWZpZXMgdGhlIG1haWwgcXVldWUuCit0eXBlZGVmIHZvaWQgKm9zTWFpbFFJZDsKKworCisvLy8gVGhyZWFkIERlZmluaXRpb24gc3RydWN0dXJlIGNvbnRhaW5zIHN0YXJ0dXAgaW5mb3JtYXRpb24gb2YgYSB0aHJlYWQuCisjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKK3R5cGVkZWYgc3RydWN0IG9zX3RocmVhZF9kZWYgeworICBvc19wdGhyZWFkICAgICAgICAgICAgICAgICBwdGhyZWFkOyAgIC8vLzwgc3RhcnQgYWRkcmVzcyBvZiB0aHJlYWQgZnVuY3Rpb24KKyAgb3NQcmlvcml0eSAgICAgICAgICAgICAgIHRwcmlvcml0eTsgICAvLy88IGluaXRpYWwgdGhyZWFkIHByaW9yaXR5CisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBpbnN0YW5jZXM7ICAgLy8vPCBtYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMgb2YgdGhhdCB0aHJlYWQgZnVuY3Rpb24KKyAgdWludDMyX3QgICAgICAgICAgICAgICAgIHN0YWNrc2l6ZTsgICAvLy88IHN0YWNrIHNpemUgcmVxdWlyZW1lbnRzIGluIGJ5dGVzOyAwIGlzIGRlZmF1bHQgc3RhY2sgc2l6ZQorfSBvc1RocmVhZERlZl90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IG9zX3RocmVhZF9kZWYgeworICBvc19wdGhyZWFkICAgICAgICAgICAgICAgICBwdGhyZWFkOyAgIC8vLzwgc3RhcnQgYWRkcmVzcyBvZiB0aHJlYWQgZnVuY3Rpb24KKyAgb3NUaHJlYWRBdHRyX3QgICAgICAgICAgICAgICAgYXR0cjsgICAvLy88IHRocmVhZCBhdHRyaWJ1dGVzCit9IG9zVGhyZWFkRGVmX3Q7CisjZW5kaWYKKworLy8vIFRpbWVyIERlZmluaXRpb24gc3RydWN0dXJlIGNvbnRhaW5zIHRpbWVyIHBhcmFtZXRlcnMuCisjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKK3R5cGVkZWYgc3RydWN0IG9zX3RpbWVyX2RlZiB7CisgIG9zX3B0aW1lciAgICAgICAgICAgICAgICAgICBwdGltZXI7ICAgLy8vPCBzdGFydCBhZGRyZXNzIG9mIGEgdGltZXIgZnVuY3Rpb24KK30gb3NUaW1lckRlZl90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IG9zX3RpbWVyX2RlZiB7CisgIG9zX3B0aW1lciAgICAgICAgICAgICAgICAgICBwdGltZXI7ICAgLy8vPCBzdGFydCBhZGRyZXNzIG9mIGEgdGltZXIgZnVuY3Rpb24KKyAgb3NUaW1lckF0dHJfdCAgICAgICAgICAgICAgICAgYXR0cjsgICAvLy88IHRpbWVyIGF0dHJpYnV0ZXMKK30gb3NUaW1lckRlZl90OworI2VuZGlmCisKKy8vLyBNdXRleCBEZWZpbml0aW9uIHN0cnVjdHVyZSBjb250YWlucyBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgYSBtdXRleC4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQordHlwZWRlZiBzdHJ1Y3Qgb3NfbXV0ZXhfZGVmIHsKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBkdW1teTsgICAvLy88IGR1bW15IHZhbHVlCit9IG9zTXV0ZXhEZWZfdDsKKyNlbHNlCisjZGVmaW5lIG9zTXV0ZXhEZWZfdCBvc011dGV4QXR0cl90CisjZW5kaWYKKworLy8vIFNlbWFwaG9yZSBEZWZpbml0aW9uIHN0cnVjdHVyZSBjb250YWlucyBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgYSBzZW1hcGhvcmUuCisjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKK3R5cGVkZWYgc3RydWN0IG9zX3NlbWFwaG9yZV9kZWYgeworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIGR1bW15OyAgIC8vLzwgZHVtbXkgdmFsdWUKK30gb3NTZW1hcGhvcmVEZWZfdDsKKyNlbHNlCisjZGVmaW5lIG9zU2VtYXBob3JlRGVmX3Qgb3NTZW1hcGhvcmVBdHRyX3QKKyNlbmRpZgorCisvLy8gRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgZm9yIG1lbW9yeSBibG9jayBhbGxvY2F0aW9uLgorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCit0eXBlZGVmIHN0cnVjdCBvc19wb29sX2RlZiB7CisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIHBvb2xfc3o7ICAgLy8vPCBudW1iZXIgb2YgaXRlbXMgKGVsZW1lbnRzKSBpbiB0aGUgcG9vbAorICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBpdGVtX3N6OyAgIC8vLzwgc2l6ZSBvZiBhbiBpdGVtCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKnBvb2w7ICAgLy8vPCBwb2ludGVyIHRvIG1lbW9yeSBmb3IgcG9vbAorfSBvc1Bvb2xEZWZfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBvc19wb29sX2RlZiB7CisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIHBvb2xfc3o7ICAgLy8vPCBudW1iZXIgb2YgaXRlbXMgKGVsZW1lbnRzKSBpbiB0aGUgcG9vbAorICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBpdGVtX3N6OyAgIC8vLzwgc2l6ZSBvZiBhbiBpdGVtCisgIG9zTWVtb3J5UG9vbEF0dHJfdCAgICAgICAgICAgIGF0dHI7ICAgLy8vPCBtZW1vcnkgcG9vbCBhdHRyaWJ1dGVzCit9IG9zUG9vbERlZl90OworI2VuZGlmCisKKy8vLyBEZWZpbml0aW9uIHN0cnVjdHVyZSBmb3IgbWVzc2FnZSBxdWV1ZS4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQordHlwZWRlZiBzdHJ1Y3Qgb3NfbWVzc2FnZVFfZGVmIHsKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICBxdWV1ZV9zejsgICAvLy88IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqcG9vbDsgICAvLy88IG1lbW9yeSBhcnJheSBmb3IgbWVzc2FnZXMKK30gb3NNZXNzYWdlUURlZl90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IG9zX21lc3NhZ2VRX2RlZiB7CisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgcXVldWVfc3o7ICAgLy8vPCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlCisgIG9zTWVzc2FnZVF1ZXVlQXR0cl90ICAgICAgICAgIGF0dHI7ICAgLy8vPCBtZXNzYWdlIHF1ZXVlIGF0dHJpYnV0ZXMKK30gb3NNZXNzYWdlUURlZl90OworI2VuZGlmCisKKy8vLyBEZWZpbml0aW9uIHN0cnVjdHVyZSBmb3IgbWFpbCBxdWV1ZS4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQordHlwZWRlZiBzdHJ1Y3Qgb3NfbWFpbFFfZGVmIHsKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICBxdWV1ZV9zejsgICAvLy88IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgaXRlbV9zejsgICAvLy88IHNpemUgb2YgYW4gaXRlbQorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpwb29sOyAgIC8vLzwgbWVtb3J5IGFycmF5IGZvciBtYWlsCit9IG9zTWFpbFFEZWZfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBvc19tYWlsUV9kZWYgeworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgIHF1ZXVlX3N6OyAgIC8vLzwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBxdWV1ZQorICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBpdGVtX3N6OyAgIC8vLzwgc2l6ZSBvZiBhbiBpdGVtCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKm1haWw7ICAgLy8vPCBwb2ludGVyIHRvIG1haWwKKyAgb3NNZW1vcnlQb29sQXR0cl90ICAgICAgICAgbXBfYXR0cjsgICAvLy88IG1lbW9yeSBwb29sIGF0dHJpYnV0ZXMKKyAgb3NNZXNzYWdlUXVldWVBdHRyX3QgICAgICAgbXFfYXR0cjsgICAvLy88IG1lc3NhZ2UgcXVldWUgYXR0cmlidXRlcworfSBvc01haWxRRGVmX3Q7CisjZW5kaWYKKworCisvLy8gRXZlbnQgc3RydWN0dXJlIGNvbnRhaW5zIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGFuIGV2ZW50LgordHlwZWRlZiBzdHJ1Y3QgeworICBvc1N0YXR1cyAgICAgICAgICAgICAgICAgICAgc3RhdHVzOyAgIC8vLzwgc3RhdHVzIGNvZGU6IGV2ZW50IG9yIGVycm9yIGluZm9ybWF0aW9uCisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgdjsgICAvLy88IG1lc3NhZ2UgYXMgMzItYml0IHZhbHVlCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKnA7ICAgLy8vPCBtZXNzYWdlIG9yIG1haWwgYXMgdm9pZCBwb2ludGVyCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIHNpZ25hbHM7ICAgLy8vPCBzaWduYWwgZmxhZ3MKKyAgfSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGV2ZW50IHZhbHVlCisgIHVuaW9uIHsKKyAgICBvc01haWxRSWQgICAgICAgICAgICAgICAgbWFpbF9pZDsgICAvLy88IG1haWwgaWQgb2J0YWluZWQgYnkgXHJlZiBvc01haWxDcmVhdGUKKyAgICBvc01lc3NhZ2VRSWQgICAgICAgICAgbWVzc2FnZV9pZDsgICAvLy88IG1lc3NhZ2UgaWQgb2J0YWluZWQgYnkgXHJlZiBvc01lc3NhZ2VDcmVhdGUKKyAgfSBkZWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGV2ZW50IGRlZmluaXRpb24KK30gb3NFdmVudDsKKworCisvLyAgPT09PSBLZXJuZWwgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQorCisvLy8gSW5pdGlhbGl6ZSB0aGUgUlRPUyBLZXJuZWwgZm9yIGNyZWF0aW5nIG9iamVjdHMuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKK29zU3RhdHVzIG9zS2VybmVsSW5pdGlhbGl6ZSAodm9pZCk7CisjZW5kaWYKKworLy8vIFN0YXJ0IHRoZSBSVE9TIEtlcm5lbCBzY2hlZHVsZXIuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKK29zU3RhdHVzIG9zS2VybmVsU3RhcnQgKHZvaWQpOworI2VuZGlmCisKKy8vLyBDaGVjayBpZiB0aGUgUlRPUyBrZXJuZWwgaXMgYWxyZWFkeSBzdGFydGVkLgorLy8vIFxyZXR1cm4gMCBSVE9TIGlzIG5vdCBzdGFydGVkLCAxIFJUT1MgaXMgc3RhcnRlZC4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQoraW50MzJfdCBvc0tlcm5lbFJ1bm5pbmcodm9pZCk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKG9zRmVhdHVyZV9TeXNUaWNrKSAmJiAob3NGZWF0dXJlX1N5c1RpY2sgIT0gMCkpICAvLyBTeXN0ZW0gVGltZXIgYXZhaWxhYmxlCisKKy8vLyBHZXQgdGhlIFJUT1Mga2VybmVsIHN5c3RlbSB0aW1lciBjb3VudGVyLgorLy8vIFxyZXR1cm4gUlRPUyBrZXJuZWwgc3lzdGVtIHRpbWVyIGFzIDMyLWJpdCB2YWx1ZQorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCit1aW50MzJfdCBvc0tlcm5lbFN5c1RpY2sgKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgIG9zS2VybmVsU3lzVGljayBvc0tlcm5lbEdldFN5c1RpbWVyQ291bnQKKyNlbmRpZgorCisvLy8gVGhlIFJUT1Mga2VybmVsIHN5c3RlbSB0aW1lciBmcmVxdWVuY3kgaW4gSHouCisvLy8gXG5vdGUgUmVmbGVjdHMgdGhlIHN5c3RlbSB0aW1lciBzZXR0aW5nIGFuZCBpcyB0eXBpY2FsbHkgZGVmaW5lZCBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQorI2RlZmluZSBvc0tlcm5lbFN5c1RpY2tGcmVxdWVuY3kgMTAwMDAwMDAwCisjZW5kaWYKKworLy8vIENvbnZlcnQgYSBtaWNyb3NlY29uZHMgdmFsdWUgdG8gYSBSVE9TIGtlcm5lbCBzeXN0ZW0gdGltZXIgdmFsdWUuCisvLy8gXHBhcmFtICAgICAgICAgbWljcm9zZWMgICAgIHRpbWUgdmFsdWUgaW4gbWljcm9zZWNvbmRzLgorLy8vIFxyZXR1cm4gdGltZSB2YWx1ZSBub3JtYWxpemVkIHRvIHRoZSBccmVmIG9zS2VybmVsU3lzVGlja0ZyZXF1ZW5jeQorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCisjZGVmaW5lIG9zS2VybmVsU3lzVGlja01pY3JvU2VjKG1pY3Jvc2VjKSAoKCh1aW50NjRfdCltaWNyb3NlYyAqIChvc0tlcm5lbFN5c1RpY2tGcmVxdWVuY3kpKSAvIDEwMDAwMDApCisjZWxzZQorI2RlZmluZSBvc0tlcm5lbFN5c1RpY2tNaWNyb1NlYyhtaWNyb3NlYykgKCgodWludDY0X3QpbWljcm9zZWMgKiAgb3NLZXJuZWxHZXRTeXNUaW1lckZyZXEoKSkgLyAxMDAwMDAwKQorI2VuZGlmCisKKyNlbmRpZiAgLy8gU3lzdGVtIFRpbWVyIGF2YWlsYWJsZQorCisKKy8vICA9PT09IFRocmVhZCBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CisKKy8vLyBDcmVhdGUgYSBUaHJlYWQgRGVmaW5pdGlvbiB3aXRoIGZ1bmN0aW9uLCBwcmlvcml0eSwgYW5kIHN0YWNrIHJlcXVpcmVtZW50cy4KKy8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KKy8vLyBccGFyYW0gICAgICAgICBwcmlvcml0eSAgICAgIGluaXRpYWwgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KKy8vLyBccGFyYW0gICAgICAgICBpbnN0YW5jZXMgICAgIG51bWJlciBvZiBwb3NzaWJsZSB0aHJlYWQgaW5zdGFuY2VzICh1c2VkIHRvIHN0YXRpY2FsbHkgYWxsb2NhdGUgbWVtb3J5KS4KKy8vLyBccGFyYW0gICAgICAgICBzdGFja3N6ICAgICAgIHN0YWNrIHNpemUgKGluIGJ5dGVzKSByZXF1aXJlbWVudHMgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisjaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKKyNkZWZpbmUgb3NUaHJlYWREZWYobmFtZSwgcHJpb3JpdHksIGluc3RhbmNlcywgc3RhY2tzeikgXAorZXh0ZXJuIGNvbnN0IG9zVGhyZWFkRGVmX3Qgb3NfdGhyZWFkX2RlZl8jI25hbWUKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CisjZGVmaW5lIG9zVGhyZWFkRGVmKG5hbWUsIHByaW9yaXR5LCBpbnN0YW5jZXMsIHN0YWNrc3opIFwKK3N0YXRpYyB1aW50MzJfdCBvc190aHJlYWRfc3RhY2sjI25hbWVbKHN0YWNrc3opPygoKHN0YWNrc3orMykvNCkpOjFdOyBcCitzdGF0aWMgU3RhdGljVGFza190IG9zX3RocmVhZF9jYl8jI25hbWU7IFwKK2NvbnN0IG9zVGhyZWFkRGVmX3Qgb3NfdGhyZWFkX2RlZl8jI25hbWUgPSBcCit7IChuYW1lKSwgXAorICB7IE5VTEwsIG9zVGhyZWFkRGV0YWNoZWQsIFwKKyAgICAoaW5zdGFuY2VzID09IDEpID8gKCZvc190aHJlYWRfY2JfIyNuYW1lKSA6IE5VTEwsXAorICAgIChpbnN0YW5jZXMgPT0gMSkgPyBzaXplb2YoU3RhdGljVGFza190KSA6IDBVLCBcCisgICAgKChzdGFja3N6KSAmJiAoaW5zdGFuY2VzID09IDEpKSA/ICgmb3NfdGhyZWFkX3N0YWNrIyNuYW1lKSA6IE5VTEwsIFwKKyAgICA0Kigoc3RhY2tzeiszKS80KSwgXAorICAgIChwcmlvcml0eSksIDBVLCAwVSB9IH0KKyNlbmRpZgorCisvLy8gQWNjZXNzIGEgVGhyZWFkIGRlZmluaXRpb24uCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSB0aHJlYWQgZGVmaW5pdGlvbiBvYmplY3QuCisjZGVmaW5lIG9zVGhyZWFkKG5hbWUpIFwKKyZvc190aHJlYWRfZGVmXyMjbmFtZQorCisvLy8gQ3JlYXRlIGEgdGhyZWFkIGFuZCBhZGQgaXQgdG8gQWN0aXZlIFRocmVhZHMgYW5kIHNldCBpdCB0byBzdGF0ZSBSRUFEWS4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfZGVmICAgIHRocmVhZCBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zVGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIGFyZ3VtZW50ICAgICAgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uIGFzIHN0YXJ0IGFyZ3VtZW50LgorLy8vIFxyZXR1cm4gdGhyZWFkIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KK29zVGhyZWFkSWQgb3NUaHJlYWRDcmVhdGUgKGNvbnN0IG9zVGhyZWFkRGVmX3QgKnRocmVhZF9kZWYsIHZvaWQgKmFyZ3VtZW50KTsKKworLy8vIFJldHVybiB0aGUgdGhyZWFkIElEIG9mIHRoZSBjdXJyZW50IHJ1bm5pbmcgdGhyZWFkLgorLy8vIFxyZXR1cm4gdGhyZWFkIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQorb3NUaHJlYWRJZCBvc1RocmVhZEdldElkICh2b2lkKTsKKyNlbmRpZgorCisvLy8gQ2hhbmdlIHByaW9yaXR5IG9mIGEgdGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorLy8vIFxwYXJhbVtpbl0gICAgIHByaW9yaXR5ICAgICAgbmV3IHByaW9yaXR5IHZhbHVlIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCitvc1N0YXR1cyBvc1RocmVhZFNldFByaW9yaXR5IChvc1RocmVhZElkIHRocmVhZF9pZCwgb3NQcmlvcml0eSBwcmlvcml0eSk7CisjZW5kaWYKKworLy8vIEdldCBjdXJyZW50IHByaW9yaXR5IG9mIGEgdGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorLy8vIFxyZXR1cm4gY3VycmVudCBwcmlvcml0eSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHRocmVhZC4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQorb3NQcmlvcml0eSBvc1RocmVhZEdldFByaW9yaXR5IChvc1RocmVhZElkIHRocmVhZF9pZCk7CisjZW5kaWYKKworLy8vIFBhc3MgY29udHJvbCB0byBuZXh0IHRocmVhZCB0aGF0IGlzIGluIHN0YXRlIFxiIFJFQURZLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCitvc1N0YXR1cyBvc1RocmVhZFlpZWxkICh2b2lkKTsKKyNlbmRpZgorCisvLy8gVGVybWluYXRlIGV4ZWN1dGlvbiBvZiBhIHRocmVhZC4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQorb3NTdGF0dXMgb3NUaHJlYWRUZXJtaW5hdGUgKG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKKyNlbmRpZgorCisKKy8vICA9PT09IFNpZ25hbCBNYW5hZ2VtZW50ID09PT0KKworLy8vIFNldCB0aGUgc3BlY2lmaWVkIFNpZ25hbCBGbGFncyBvZiBhbiBhY3RpdmUgdGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorLy8vIFxwYXJhbVtpbl0gICAgIHNpZ25hbHMgICAgICAgc3BlY2lmaWVzIHRoZSBzaWduYWwgZmxhZ3Mgb2YgdGhlIHRocmVhZCB0aGF0IHNob3VsZCBiZSBzZXQuCisvLy8gXHJldHVybiBwcmV2aW91cyBzaWduYWwgZmxhZ3Mgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQgb3IgMHg4MDAwMDAwMCBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzLgoraW50MzJfdCBvc1NpZ25hbFNldCAob3NUaHJlYWRJZCB0aHJlYWRfaWQsIGludDMyX3Qgc2lnbmFscyk7CisKKy8vLyBDbGVhciB0aGUgc3BlY2lmaWVkIFNpZ25hbCBGbGFncyBvZiBhbiBhY3RpdmUgdGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgorLy8vIFxwYXJhbVtpbl0gICAgIHNpZ25hbHMgICAgICAgc3BlY2lmaWVzIHRoZSBzaWduYWwgZmxhZ3Mgb2YgdGhlIHRocmVhZCB0aGF0IHNoYWxsIGJlIGNsZWFyZWQuCisvLy8gXHJldHVybiBwcmV2aW91cyBzaWduYWwgZmxhZ3Mgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQgb3IgMHg4MDAwMDAwMCBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzIG9yIGNhbGwgZnJvbSBJU1IuCitpbnQzMl90IG9zU2lnbmFsQ2xlYXIgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBpbnQzMl90IHNpZ25hbHMpOworCisvLy8gV2FpdCBmb3Igb25lIG9yIG1vcmUgU2lnbmFsIEZsYWdzIHRvIGJlY29tZSBzaWduYWxlZCBmb3IgdGhlIGN1cnJlbnQgXGIgUlVOTklORyB0aHJlYWQuCisvLy8gXHBhcmFtW2luXSAgICAgc2lnbmFscyAgICAgICB3YWl0IHVudGlsIGFsbCBzcGVjaWZpZWQgc2lnbmFsIGZsYWdzIHNldCBvciAwIGZvciBhbnkgc2luZ2xlIHNpZ25hbCBmbGFnLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisvLy8gXHJldHVybiBldmVudCBmbGFnIGluZm9ybWF0aW9uIG9yIGVycm9yIGNvZGUuCitvc19JblJlZ3Mgb3NFdmVudCBvc1NpZ25hbFdhaXQgKGludDMyX3Qgc2lnbmFscywgdWludDMyX3QgbWlsbGlzZWMpOworCisKKy8vICA9PT09IEdlbmVyaWMgV2FpdCBGdW5jdGlvbnMgPT09PQorCisvLy8gV2FpdCBmb3IgVGltZW91dCAoVGltZSBEZWxheSkuCisvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlICJ0aW1lIGRlbGF5IiB2YWx1ZQorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCitvc1N0YXR1cyBvc0RlbGF5ICh1aW50MzJfdCBtaWxsaXNlYyk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfV2FpdCkgJiYgKG9zRmVhdHVyZV9XYWl0ICE9IDApKSAgLy8gR2VuZXJpYyBXYWl0IGF2YWlsYWJsZQorCisvLy8gV2FpdCBmb3IgU2lnbmFsLCBNZXNzYWdlLCBNYWlsLCBvciBUaW1lb3V0LgorLy8vIFxwYXJhbVtpbl0gbWlsbGlzZWMgICAgICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQKKy8vLyBccmV0dXJuIGV2ZW50IHRoYXQgY29udGFpbnMgc2lnbmFsLCBtZXNzYWdlLCBvciBtYWlsIGluZm9ybWF0aW9uIG9yIGVycm9yIGNvZGUuCitvc19JblJlZ3Mgb3NFdmVudCBvc1dhaXQgKHVpbnQzMl90IG1pbGxpc2VjKTsKKworI2VuZGlmICAvLyBHZW5lcmljIFdhaXQgYXZhaWxhYmxlCisKKworLy8gID09PT0gVGltZXIgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQorCisvLy8gRGVmaW5lIGEgVGltZXIgb2JqZWN0LgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgdGltZXIgb2JqZWN0LgorLy8vIFxwYXJhbSAgICAgICAgIGZ1bmN0aW9uICAgICAgbmFtZSBvZiB0aGUgdGltZXIgY2FsbCBiYWNrIGZ1bmN0aW9uLgorI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCisjZGVmaW5lIG9zVGltZXJEZWYobmFtZSwgZnVuY3Rpb24pIFwKK2V4dGVybiBjb25zdCBvc1RpbWVyRGVmX3Qgb3NfdGltZXJfZGVmXyMjbmFtZQorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSBvYmplY3QKKyNkZWZpbmUgb3NUaW1lckRlZihuYW1lLCBmdW5jdGlvbikgXAorc3RhdGljIFN0YXRpY1RpbWVyX3Qgb3NfdGltZXJfY2JfIyNuYW1lOyBcCitjb25zdCBvc1RpbWVyRGVmX3Qgb3NfdGltZXJfZGVmXyMjbmFtZSA9IFwKK3sgKGZ1bmN0aW9uKSwgeyBOVUxMLCAwVSwgKCZvc190aW1lcl9jYl8jI25hbWUpLCBzaXplb2YoU3RhdGljVGltZXJfdCkgfSB9CisjZW5kaWYKKworLy8vIEFjY2VzcyBhIFRpbWVyIGRlZmluaXRpb24uCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSB0aW1lciBvYmplY3QuCisjZGVmaW5lIG9zVGltZXIobmFtZSkgXAorJm9zX3RpbWVyX2RlZl8jI25hbWUKKworLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIHRpbWVyLgorLy8vIFxwYXJhbVtpbl0gICAgIHRpbWVyX2RlZiAgICAgdGltZXIgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zVGltZXIuCisvLy8gXHBhcmFtW2luXSAgICAgdHlwZSAgICAgICAgICBvc1RpbWVyT25jZSBmb3Igb25lLXNob3Qgb3Igb3NUaW1lclBlcmlvZGljIGZvciBwZXJpb2RpYyBiZWhhdmlvci4KKy8vLyBccGFyYW1baW5dICAgICBhcmd1bWVudCAgICAgIGFyZ3VtZW50IHRvIHRoZSB0aW1lciBjYWxsIGJhY2sgZnVuY3Rpb24uCisvLy8gXHJldHVybiB0aW1lciBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitvc1RpbWVySWQgb3NUaW1lckNyZWF0ZSAoY29uc3Qgb3NUaW1lckRlZl90ICp0aW1lcl9kZWYsIG9zX3RpbWVyX3R5cGUgdHlwZSwgdm9pZCAqYXJndW1lbnQpOworCisvLy8gU3RhcnQgb3IgcmVzdGFydCBhIHRpbWVyLgorLy8vIFxwYXJhbVtpbl0gICAgIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSAidGltZSBkZWxheSIgdmFsdWUgb2YgdGhlIHRpbWVyLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCitvc1N0YXR1cyBvc1RpbWVyU3RhcnQgKG9zVGltZXJJZCB0aW1lcl9pZCwgdWludDMyX3QgbWlsbGlzZWMpOworI2VuZGlmCisKKy8vLyBTdG9wIGEgdGltZXIuCisvLy8gXHBhcmFtW2luXSAgICAgdGltZXJfaWQgICAgICB0aW1lciBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGltZXJDcmVhdGUuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKK29zU3RhdHVzIG9zVGltZXJTdG9wIChvc1RpbWVySWQgdGltZXJfaWQpOworI2VuZGlmCisKKy8vLyBEZWxldGUgYSB0aW1lci4KKy8vLyBccGFyYW1baW5dICAgICB0aW1lcl9pZCAgICAgIHRpbWVyIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaW1lckNyZWF0ZS4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQorb3NTdGF0dXMgb3NUaW1lckRlbGV0ZSAob3NUaW1lcklkIHRpbWVyX2lkKTsKKyNlbmRpZgorCisKKy8vICA9PT09IE11dGV4IE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KKworLy8vIERlZmluZSBhIE11dGV4LgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgbXV0ZXggb2JqZWN0LgorI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCisjZGVmaW5lIG9zTXV0ZXhEZWYobmFtZSkgXAorZXh0ZXJuIGNvbnN0IG9zTXV0ZXhEZWZfdCBvc19tdXRleF9kZWZfIyNuYW1lCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAorI2RlZmluZSBvc011dGV4RGVmKG5hbWUpIFwKK3N0YXRpYyBTdGF0aWNTZW1hcGhvcmVfdCBvc19tdXRleF9jYl8jI25hbWU7IFwKK2NvbnN0IG9zTXV0ZXhEZWZfdCBvc19tdXRleF9kZWZfIyNuYW1lID0gXAoreyBOVUxMLCBvc011dGV4UmVjdXJzaXZlIHwgb3NNdXRleFByaW9Jbmhlcml0LCAoJm9zX211dGV4X2NiXyMjbmFtZSksIHNpemVvZihTdGF0aWNTZW1hcGhvcmVfdCkgfQorI2VuZGlmCisKKy8vLyBBY2Nlc3MgYSBNdXRleCBkZWZpbml0aW9uLgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgbXV0ZXggb2JqZWN0LgorI2RlZmluZSBvc011dGV4KG5hbWUpIFwKKyZvc19tdXRleF9kZWZfIyNuYW1lCisKKy8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBNdXRleCBvYmplY3QuCisvLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfZGVmICAgICBtdXRleCBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zTXV0ZXguCisvLy8gXHJldHVybiBtdXRleCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitvc011dGV4SWQgb3NNdXRleENyZWF0ZSAoY29uc3Qgb3NNdXRleERlZl90ICptdXRleF9kZWYpOworCisvLy8gV2FpdCB1bnRpbCBhIE11dGV4IGJlY29tZXMgYXZhaWxhYmxlLgorLy8vIFxwYXJhbVtpbl0gICAgIG11dGV4X2lkICAgICAgbXV0ZXggSUQgb2J0YWluZWQgYnkgXHJlZiBvc011dGV4Q3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCisjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKK29zU3RhdHVzIG9zTXV0ZXhXYWl0IChvc011dGV4SWQgbXV0ZXhfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKKyNlbHNlCisjZGVmaW5lICBvc011dGV4V2FpdCBvc011dGV4QWNxdWlyZQorI2VuZGlmCisKKy8vLyBSZWxlYXNlIGEgTXV0ZXggdGhhdCB3YXMgb2J0YWluZWQgYnkgXHJlZiBvc011dGV4V2FpdC4KKy8vLyBccGFyYW1baW5dICAgICBtdXRleF9pZCAgICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleENyZWF0ZS4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQorb3NTdGF0dXMgb3NNdXRleFJlbGVhc2UgKG9zTXV0ZXhJZCBtdXRleF9pZCk7CisjZW5kaWYKKworLy8vIERlbGV0ZSBhIE11dGV4IG9iamVjdC4KKy8vLyBccGFyYW1baW5dICAgICBtdXRleF9pZCAgICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleENyZWF0ZS4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQorb3NTdGF0dXMgb3NNdXRleERlbGV0ZSAob3NNdXRleElkIG11dGV4X2lkKTsKKyNlbmRpZgorCisKKy8vICA9PT09IFNlbWFwaG9yZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CisKKyNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX1NlbWFwaG9yZSkgJiYgKG9zRmVhdHVyZV9TZW1hcGhvcmUgIT0gMFUpKSAgLy8gU2VtYXBob3JlIGF2YWlsYWJsZQorCisvLy8gRGVmaW5lIGEgU2VtYXBob3JlIG9iamVjdC4KKy8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHNlbWFwaG9yZSBvYmplY3QuCisjaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKKyNkZWZpbmUgb3NTZW1hcGhvcmVEZWYobmFtZSkgXAorZXh0ZXJuIGNvbnN0IG9zU2VtYXBob3JlRGVmX3Qgb3Nfc2VtYXBob3JlX2RlZl8jI25hbWUKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CisjZGVmaW5lIG9zU2VtYXBob3JlRGVmKG5hbWUpIFwKK3N0YXRpYyBTdGF0aWNTZW1hcGhvcmVfdCBvc19zZW1hcGhvcmVfY2JfIyNuYW1lOyBcCitjb25zdCBvc1NlbWFwaG9yZURlZl90IG9zX3NlbWFwaG9yZV9kZWZfIyNuYW1lID0gXAoreyBOVUxMLCAwVSwgKCZvc19zZW1hcGhvcmVfY2JfIyNuYW1lKSwgc2l6ZW9mKFN0YXRpY1NlbWFwaG9yZV90KSB9CisjZW5kaWYKKworLy8vIEFjY2VzcyBhIFNlbWFwaG9yZSBkZWZpbml0aW9uLgorLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgc2VtYXBob3JlIG9iamVjdC4KKyNkZWZpbmUgb3NTZW1hcGhvcmUobmFtZSkgXAorJm9zX3NlbWFwaG9yZV9kZWZfIyNuYW1lCisKKy8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBTZW1hcGhvcmUgb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIHNlbWFwaG9yZV9kZWYgc2VtYXBob3JlIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmUuCisvLy8gXHBhcmFtW2luXSAgICAgY291bnQgICAgICAgICBtYXhpbXVtIGFuZCBpbml0aWFsIG51bWJlciBvZiBhdmFpbGFibGUgdG9rZW5zLgorLy8vIFxyZXR1cm4gc2VtYXBob3JlIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KK29zU2VtYXBob3JlSWQgb3NTZW1hcGhvcmVDcmVhdGUgKGNvbnN0IG9zU2VtYXBob3JlRGVmX3QgKnNlbWFwaG9yZV9kZWYsIGludDMyX3QgY291bnQpOworCisvLy8gV2FpdCB1bnRpbCBhIFNlbWFwaG9yZSB0b2tlbiBiZWNvbWVzIGF2YWlsYWJsZS4KKy8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUuCisvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKy8vLyBccmV0dXJuIG51bWJlciBvZiBhdmFpbGFibGUgdG9rZW5zLCBvciAtMSBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzLgoraW50MzJfdCBvc1NlbWFwaG9yZVdhaXQgKG9zU2VtYXBob3JlSWQgc2VtYXBob3JlX2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CisKKy8vLyBSZWxlYXNlIGEgU2VtYXBob3JlIHRva2VuLgorLy8vIFxwYXJhbVtpbl0gICAgIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlIG9iamVjdCByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1NlbWFwaG9yZUNyZWF0ZS4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKyNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQorb3NTdGF0dXMgb3NTZW1hcGhvcmVSZWxlYXNlIChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCk7CisjZW5kaWYKKworLy8vIERlbGV0ZSBhIFNlbWFwaG9yZSBvYmplY3QuCisvLy8gXHBhcmFtW2luXSAgICAgc2VtYXBob3JlX2lkICBzZW1hcGhvcmUgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlQ3JlYXRlLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCitvc1N0YXR1cyBvc1NlbWFwaG9yZURlbGV0ZSAob3NTZW1hcGhvcmVJZCBzZW1hcGhvcmVfaWQpOworI2VuZGlmCisKKyNlbmRpZiAgLy8gU2VtYXBob3JlIGF2YWlsYWJsZQorCisKKy8vICA9PT09IE1lbW9yeSBQb29sIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KKworI2lmIChkZWZpbmVkKG9zRmVhdHVyZV9Qb29sKSAmJiAob3NGZWF0dXJlX1Bvb2wgIT0gMCkpICAvLyBNZW1vcnkgUG9vbCBhdmFpbGFibGUKKworLy8vIFxicmllZiBEZWZpbmUgYSBNZW1vcnkgUG9vbC4KKy8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIG1lbW9yeSBwb29sLgorLy8vIFxwYXJhbSAgICAgICAgIG5vICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIChvYmplY3RzKSBpbiB0aGUgbWVtb3J5IHBvb2wuCisvLy8gXHBhcmFtICAgICAgICAgdHlwZSAgICAgICAgICBkYXRhIHR5cGUgb2YgYSBzaW5nbGUgYmxvY2sgKG9iamVjdCkuCisjaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKKyNkZWZpbmUgb3NQb29sRGVmKG5hbWUsIG5vLCB0eXBlKSBcCitleHRlcm4gY29uc3Qgb3NQb29sRGVmX3Qgb3NfcG9vbF9kZWZfIyNuYW1lCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAorI2RlZmluZSBvc1Bvb2xEZWYobmFtZSwgbm8sIHR5cGUpIFwKK2NvbnN0IG9zUG9vbERlZl90IG9zX3Bvb2xfZGVmXyMjbmFtZSA9IFwKK3sgKG5vKSwgc2l6ZW9mKHR5cGUpLCBOVUxMIH0KKyNlbmRpZgorCisvLy8gXGJyaWVmIEFjY2VzcyBhIE1lbW9yeSBQb29sIGRlZmluaXRpb24uCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBtZW1vcnkgcG9vbAorI2RlZmluZSBvc1Bvb2wobmFtZSkgXAorJm9zX3Bvb2xfZGVmXyMjbmFtZQorCisvLy8gQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgTWVtb3J5IFBvb2wgb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIHBvb2xfZGVmICAgICAgbWVtb3J5IHBvb2wgZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2wuCisvLy8gXHJldHVybiBtZW1vcnkgcG9vbCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitvc1Bvb2xJZCBvc1Bvb2xDcmVhdGUgKGNvbnN0IG9zUG9vbERlZl90ICpwb29sX2RlZik7CisKKy8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgTWVtb3J5IFBvb2wuCisvLy8gXHBhcmFtW2luXSAgICAgcG9vbF9pZCAgICAgICBtZW1vcnkgcG9vbCBJRCBvYnRhaW4gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NQb29sQ3JlYXRlLgorLy8vIFxyZXR1cm4gYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBvciBOVUxMIGluIGNhc2Ugb2Ygbm8gbWVtb3J5IGF2YWlsYWJsZS4KK3ZvaWQgKm9zUG9vbEFsbG9jIChvc1Bvb2xJZCBwb29sX2lkKTsKKworLy8vIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gYSBNZW1vcnkgUG9vbCBhbmQgc2V0IG1lbW9yeSBibG9jayB0byB6ZXJvLgorLy8vIFxwYXJhbVtpbl0gICAgIHBvb2xfaWQgICAgICAgbWVtb3J5IHBvb2wgSUQgb2J0YWluIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zUG9vbENyZWF0ZS4KKy8vLyBccmV0dXJuIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb3IgTlVMTCBpbiBjYXNlIG9mIG5vIG1lbW9yeSBhdmFpbGFibGUuCit2b2lkICpvc1Bvb2xDQWxsb2MgKG9zUG9vbElkIHBvb2xfaWQpOworCisvLy8gUmV0dXJuIGFuIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgYmFjayB0byBhIE1lbW9yeSBQb29sLgorLy8vIFxwYXJhbVtpbl0gICAgIHBvb2xfaWQgICAgICAgbWVtb3J5IHBvb2wgSUQgb2J0YWluIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zUG9vbENyZWF0ZS4KKy8vLyBccGFyYW1baW5dICAgICBibG9jayAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIG1lbW9yeSBwb29sLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXMgb3NQb29sRnJlZSAob3NQb29sSWQgcG9vbF9pZCwgdm9pZCAqYmxvY2spOworCisjZW5kaWYgIC8vIE1lbW9yeSBQb29sIGF2YWlsYWJsZQorCisKKy8vICA9PT09IE1lc3NhZ2UgUXVldWUgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQorCisjaWYgKGRlZmluZWQob3NGZWF0dXJlX01lc3NhZ2VRKSAmJiAob3NGZWF0dXJlX01lc3NhZ2VRICE9IDApKSAgLy8gTWVzc2FnZSBRdWV1ZSBhdmFpbGFibGUKKworLy8vIFxicmllZiBDcmVhdGUgYSBNZXNzYWdlIFF1ZXVlIERlZmluaXRpb24uCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBxdWV1ZS4KKy8vLyBccGFyYW0gICAgICAgICBxdWV1ZV9zeiAgICAgIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZS4KKy8vLyBccGFyYW0gICAgICAgICB0eXBlICAgICAgICAgIGRhdGEgdHlwZSBvZiBhIHNpbmdsZSBtZXNzYWdlIGVsZW1lbnQgKGZvciBkZWJ1Z2dlcikuCisjaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKKyNkZWZpbmUgb3NNZXNzYWdlUURlZihuYW1lLCBxdWV1ZV9zeiwgdHlwZSkgXAorZXh0ZXJuIGNvbnN0IG9zTWVzc2FnZVFEZWZfdCBvc19tZXNzYWdlUV9kZWZfIyNuYW1lCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAorI2RlZmluZSBvc01lc3NhZ2VRRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlKSBcCitzdGF0aWMgU3RhdGljUXVldWVfdCBvc19tcV9jYl8jI25hbWU7IFwKK3N0YXRpYyB1aW50MzJfdCBvc19tcV9kYXRhXyMjbmFtZVsocXVldWVfc3opICogc2l6ZW9mKHR5cGUpXTsgXAorY29uc3Qgb3NNZXNzYWdlUURlZl90IG9zX21lc3NhZ2VRX2RlZl8jI25hbWUgPSBcCit7IChxdWV1ZV9zeiksIFwKKyAgeyBOVUxMLCAwVSwgKCZvc19tcV9jYl8jI25hbWUpLCBzaXplb2YoU3RhdGljUXVldWVfdCksIFwKKyAgICAgICAgICAgICAgKCZvc19tcV9kYXRhXyMjbmFtZSksIHNpemVvZihvc19tcV9kYXRhXyMjbmFtZSkgfSB9CisjZW5kaWYKKworLy8vIFxicmllZiBBY2Nlc3MgYSBNZXNzYWdlIFF1ZXVlIERlZmluaXRpb24uCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBxdWV1ZQorI2RlZmluZSBvc01lc3NhZ2VRKG5hbWUpIFwKKyZvc19tZXNzYWdlUV9kZWZfIyNuYW1lCisKKy8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBNZXNzYWdlIFF1ZXVlIG9iamVjdC4KKy8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9kZWYgICAgIG1lc3NhZ2UgcXVldWUgZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc01lc3NhZ2VRLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIChvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZCkgb3IgTlVMTC4KKy8vLyBccmV0dXJuIG1lc3NhZ2UgcXVldWUgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorb3NNZXNzYWdlUUlkIG9zTWVzc2FnZUNyZWF0ZSAoY29uc3Qgb3NNZXNzYWdlUURlZl90ICpxdWV1ZV9kZWYsIG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKKworLy8vIFB1dCBhIE1lc3NhZ2UgdG8gYSBRdWV1ZS4KKy8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKy8vLyBccGFyYW1baW5dICAgICBpbmZvICAgICAgICAgIG1lc3NhZ2UgaW5mb3JtYXRpb24uCisvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzIG9zTWVzc2FnZVB1dCAob3NNZXNzYWdlUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBpbmZvLCB1aW50MzJfdCBtaWxsaXNlYyk7CisKKy8vLyBHZXQgYSBNZXNzYWdlIGZyb20gYSBRdWV1ZSBvciB0aW1lb3V0IGlmIFF1ZXVlIGlzIGVtcHR5LgorLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWVzc2FnZSBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNZXNzYWdlQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisvLy8gXHJldHVybiBldmVudCBpbmZvcm1hdGlvbiB0aGF0IGluY2x1ZGVzIHN0YXR1cyBjb2RlLgorb3NfSW5SZWdzIG9zRXZlbnQgb3NNZXNzYWdlR2V0IChvc01lc3NhZ2VRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKKworI2VuZGlmICAvLyBNZXNzYWdlIFF1ZXVlIGF2YWlsYWJsZQorCisKKy8vICA9PT09IE1haWwgUXVldWUgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQorCisjaWYgKGRlZmluZWQob3NGZWF0dXJlX01haWxRKSAmJiAob3NGZWF0dXJlX01haWxRICE9IDApKSAgLy8gTWFpbCBRdWV1ZSBhdmFpbGFibGUKKworLy8vIFxicmllZiBDcmVhdGUgYSBNYWlsIFF1ZXVlIERlZmluaXRpb24uCisvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBxdWV1ZS4KKy8vLyBccGFyYW0gICAgICAgICBxdWV1ZV9zeiAgICAgIG1heGltdW0gbnVtYmVyIG9mIG1haWxzIGluIHRoZSBxdWV1ZS4KKy8vLyBccGFyYW0gICAgICAgICB0eXBlICAgICAgICAgIGRhdGEgdHlwZSBvZiBhIHNpbmdsZSBtYWlsIGVsZW1lbnQuCisjaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKKyNkZWZpbmUgb3NNYWlsUURlZihuYW1lLCBxdWV1ZV9zeiwgdHlwZSkgXAorZXh0ZXJuIGNvbnN0IG9zTWFpbFFEZWZfdCBvc19tYWlsUV9kZWZfIyNuYW1lCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAorI2RlZmluZSBvc01haWxRRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlKSBcCitjb25zdCBvc01haWxRRGVmX3Qgb3NfbWFpbFFfZGVmXyMjbmFtZSA9IFwKK3sgKHF1ZXVlX3N6KSwgc2l6ZW9mKHR5cGUpLCBOVUxMIH0KKyNlbmRpZgorCisvLy8gXGJyaWVmIEFjY2VzcyBhIE1haWwgUXVldWUgRGVmaW5pdGlvbi4KKy8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHF1ZXVlCisjZGVmaW5lIG9zTWFpbFEobmFtZSkgXAorJm9zX21haWxRX2RlZl8jI25hbWUKKworLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIE1haWwgUXVldWUgb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2RlZiAgICAgbWFpbCBxdWV1ZSBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zTWFpbFEuCisvLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgKG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkKSBvciBOVUxMLgorLy8vIFxyZXR1cm4gbWFpbCBxdWV1ZSBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitvc01haWxRSWQgb3NNYWlsQ3JlYXRlIChjb25zdCBvc01haWxRRGVmX3QgKnF1ZXVlX2RlZiwgb3NUaHJlYWRJZCB0aHJlYWRfaWQpOworCisvLy8gQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZm9yIG1haWwgZnJvbSBhIG1haWwgbWVtb3J5IHBvb2wuCisvLy8gXHBhcmFtW2luXSAgICAgcXVldWVfaWQgICAgICBtYWlsIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxDcmVhdGUuCisvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dAorLy8vIFxyZXR1cm4gcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgdGhhdCBjYW4gYmUgZmlsbGVkIHdpdGggbWFpbCBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCit2b2lkICpvc01haWxBbGxvYyAob3NNYWlsUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CisKKy8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmb3IgbWFpbCBmcm9tIGEgbWFpbCBtZW1vcnkgcG9vbCBhbmQgc2V0IG1lbW9yeSBibG9jayB0byB6ZXJvLgorLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQKKy8vLyBccmV0dXJuIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRoIG1haWwgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgordm9pZCAqb3NNYWlsQ0FsbG9jIChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKKworLy8vIFB1dCBhIE1haWwgaW50byBhIFF1ZXVlLgorLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1haWwgICAgICAgICAgcG9pbnRlciB0byBtZW1vcnkgd2l0aCBtYWlsIHRvIHB1dCBpbnRvIGEgcXVldWUuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1cyBvc01haWxQdXQgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgY29uc3Qgdm9pZCAqbWFpbCk7CisKKy8vLyBHZXQgYSBNYWlsIGZyb20gYSBRdWV1ZSBvciB0aW1lb3V0IGlmIFF1ZXVlIGlzIGVtcHR5LgorLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisvLy8gXHJldHVybiBldmVudCBpbmZvcm1hdGlvbiB0aGF0IGluY2x1ZGVzIHN0YXR1cyBjb2RlLgorb3NfSW5SZWdzIG9zRXZlbnQgb3NNYWlsR2V0IChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKKworLy8vIEZyZWUgYSBtZW1vcnkgYmxvY2sgYnkgcmV0dXJuaW5nIGl0IHRvIGEgbWFpbCBtZW1vcnkgcG9vbC4KKy8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KKy8vLyBccGFyYW1baW5dICAgICBtYWlsICAgICAgICAgIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRoYXQgd2FzIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxHZXQuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1cyBvc01haWxGcmVlIChvc01haWxRSWQgcXVldWVfaWQsIHZvaWQgKm1haWwpOworCisjZW5kaWYgIC8vIE1haWwgUXVldWUgYXZhaWxhYmxlCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIENNU0lTX09TX0hfCmRpZmYgLS1naXQgYS9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczEuYyBiL1NvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZmZlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczEuYwpAQCAtMCwwICsxLDM2OCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMjAxMy0yMDE3IEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogUG9ydGlvbnMgQ29weXJpZ2h0IMKpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzIEludGVybmF0aW9uYWwgTi5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpOyB5b3UgbWF5CisgKiBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogUHJvamVjdDogICAgICBDTVNJUy1SVE9TIEFQSSBWMQorICogVGl0bGU6ICAgICAgICBjbXNpc19vczEuYyBWMSBtb2R1bGUgZmlsZQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjbXNpc19vcy5oIgorCisjaWYgKG9zQ01TSVMgPj0gMHgyMDAwMFUpICYmICFkZWZpbmVkKG9zMV9EaXNhYmxlKQorCisKKy8vIFRocmVhZAorI2lmICFkZWZpbmVkKG9zMV9EaXNhYmxlX1RocmVhZCkKK29zVGhyZWFkSWQgb3NUaHJlYWRDcmVhdGUgKGNvbnN0IG9zVGhyZWFkRGVmX3QgKnRocmVhZF9kZWYsIHZvaWQgKmFyZ3VtZW50KSB7CisKKyAgaWYgKHRocmVhZF9kZWYgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBvc1RocmVhZE5ldygob3NUaHJlYWRGdW5jX3QpdGhyZWFkX2RlZi0+cHRocmVhZCwgYXJndW1lbnQsICZ0aHJlYWRfZGVmLT5hdHRyKTsKK30KKyNlbmRpZgorCisKKy8vIFNpZ25hbHMKKworI2lmICFkZWZpbmVkKG9zMV9EaXNhYmxlX1NpZ25hbCkKKworI2RlZmluZSBTaWduYWxNYXNrICgoMVU8PG9zRmVhdHVyZV9TaWduYWxzKS0xVSkKKworaW50MzJfdCBvc1NpZ25hbFNldCAob3NUaHJlYWRJZCB0aHJlYWRfaWQsIGludDMyX3Qgc2lnbmFscykgeworICB1aW50MzJfdCBmbGFnczsKKworICBmbGFncyA9IG9zVGhyZWFkRmxhZ3NTZXQodGhyZWFkX2lkLCAodWludDMyX3Qpc2lnbmFscyk7CisgIGlmICgoZmxhZ3MgJiAweDgwMDAwMDAwVSkgIT0gMFUpIHsKKyAgICByZXR1cm4gKChpbnQzMl90KTB4ODAwMDAwMDBVKTsKKyAgfQorICByZXR1cm4gKChpbnQzMl90KShmbGFncyAmIH4oKHVpbnQzMl90KXNpZ25hbHMpKSk7Cit9CisKK2ludDMyX3Qgb3NTaWduYWxDbGVhciAob3NUaHJlYWRJZCB0aHJlYWRfaWQsIGludDMyX3Qgc2lnbmFscykgeworICB1aW50MzJfdCBmbGFnczsKKworICBpZiAodGhyZWFkX2lkICE9IG9zVGhyZWFkR2V0SWQoKSkgeworICAgIHJldHVybiAoKGludDMyX3QpMHg4MDAwMDAwMFUpOworICB9CisgIGZsYWdzID0gb3NUaHJlYWRGbGFnc0NsZWFyKCh1aW50MzJfdClzaWduYWxzKTsKKyAgaWYgKChmbGFncyAmIDB4ODAwMDAwMDBVKSAhPSAwVSkgeworICAgIHJldHVybiAoKGludDMyX3QpMHg4MDAwMDAwMFUpOworICB9CisgIHJldHVybiAoKGludDMyX3QpZmxhZ3MpOworfQorCitvc19JblJlZ3Mgb3NFdmVudCBvc1NpZ25hbFdhaXQgKGludDMyX3Qgc2lnbmFscywgdWludDMyX3QgbWlsbGlzZWMpIHsKKyAgb3NFdmVudCAgZXZlbnQ7CisgIHVpbnQzMl90IGZsYWdzOworCisgIGlmIChzaWduYWxzICE9IDApIHsKKyAgICBmbGFncyA9IG9zVGhyZWFkRmxhZ3NXYWl0KCh1aW50MzJfdClzaWduYWxzLCBvc0ZsYWdzV2FpdEFsbCwgbWlsbGlzZWMpOworICB9IGVsc2UgeworICAgIGZsYWdzID0gb3NUaHJlYWRGbGFnc1dhaXQoU2lnbmFsTWFzaywgICAgICAgIG9zRmxhZ3NXYWl0QW55LCBtaWxsaXNlYyk7CisgIH0KKyAgaWYgKChmbGFncyA+IDBVKSAmJiAoZmxhZ3MgPCAweDgwMDAwMDAwVSkpIHsKKyAgICBldmVudC5zdGF0dXMgPSBvc0V2ZW50U2lnbmFsOworICAgIGV2ZW50LnZhbHVlLnNpZ25hbHMgPSAoaW50MzJfdClmbGFnczsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKChpbnQzMl90KWZsYWdzKSB7CisgICAgICBjYXNlIG9zRXJyb3JSZXNvdXJjZToKKyAgICAgICAgZXZlbnQuc3RhdHVzID0gb3NPSzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG9zRXJyb3JUaW1lb3V0OgorICAgICAgICBldmVudC5zdGF0dXMgPSBvc0V2ZW50VGltZW91dDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIG9zRXJyb3JQYXJhbWV0ZXI6CisgICAgICAgIGV2ZW50LnN0YXR1cyA9IG9zRXJyb3JWYWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBldmVudC5zdGF0dXMgPSAob3NTdGF0dXMpZmxhZ3M7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gZXZlbnQ7Cit9CisKKyNlbmRpZiAgLy8gU2lnbmFsCisKKworLy8gVGltZXIKKyNpZiAhZGVmaW5lZChvczFfRGlzYWJsZV9UaW1lcikKK29zVGltZXJJZCBvc1RpbWVyQ3JlYXRlIChjb25zdCBvc1RpbWVyRGVmX3QgKnRpbWVyX2RlZiwgb3NfdGltZXJfdHlwZSB0eXBlLCB2b2lkICphcmd1bWVudCkgeworCisgIGlmICh0aW1lcl9kZWYgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBvc1RpbWVyTmV3KChvc1RpbWVyRnVuY190KXRpbWVyX2RlZi0+cHRpbWVyLCB0eXBlLCBhcmd1bWVudCwgJnRpbWVyX2RlZi0+YXR0cik7Cit9CisjZW5kaWYKKworCisvLyBNdXRleAorI2lmICFkZWZpbmVkKG9zMV9EaXNhYmxlX011dGV4KQorb3NNdXRleElkIG9zTXV0ZXhDcmVhdGUgKGNvbnN0IG9zTXV0ZXhEZWZfdCAqbXV0ZXhfZGVmKSB7CisKKyAgaWYgKG11dGV4X2RlZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG9zTXV0ZXhOZXcobXV0ZXhfZGVmKTsKK30KKyNlbmRpZgorCisKKy8vIFNlbWFwaG9yZQorCisjaWYgKGRlZmluZWQgKG9zRmVhdHVyZV9TZW1hcGhvcmUpICYmIChvc0ZlYXR1cmVfU2VtYXBob3JlICE9IDBVKSkgJiYgIWRlZmluZWQob3MxX0Rpc2FibGVfU2VtYXBob3JlKQorCitvc1NlbWFwaG9yZUlkIG9zU2VtYXBob3JlQ3JlYXRlIChjb25zdCBvc1NlbWFwaG9yZURlZl90ICpzZW1hcGhvcmVfZGVmLCBpbnQzMl90IGNvdW50KSB7CisKKyAgaWYgKHNlbWFwaG9yZV9kZWYgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBvc1NlbWFwaG9yZU5ldygodWludDMyX3QpY291bnQsICh1aW50MzJfdCljb3VudCwgc2VtYXBob3JlX2RlZik7Cit9CisKK2ludDMyX3Qgb3NTZW1hcGhvcmVXYWl0IChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpIHsKKyAgb3NTdGF0dXNfdCBzdGF0dXM7CisgIHVpbnQzMl90ICAgY291bnQ7CisKKyAgc3RhdHVzID0gb3NTZW1hcGhvcmVBY3F1aXJlKHNlbWFwaG9yZV9pZCwgbWlsbGlzZWMpOworICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2Ugb3NPSzoKKyAgICAgIGNvdW50ID0gb3NTZW1hcGhvcmVHZXRDb3VudChzZW1hcGhvcmVfaWQpOworICAgICAgcmV0dXJuICgoaW50MzJfdCljb3VudCArIDEpOworICAgIGNhc2Ugb3NFcnJvclJlc291cmNlOgorICAgIGNhc2Ugb3NFcnJvclRpbWVvdXQ6CisgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisjZW5kaWYgIC8vIFNlbWFwaG9yZQorCisKKy8vIE1lbW9yeSBQb29sCisKKyNpZiAoZGVmaW5lZChvc0ZlYXR1cmVfUG9vbCkgJiYgKG9zRmVhdHVyZV9Qb29sICE9IDApKSYmICFkZWZpbmVkKG9zMV9EaXNhYmxlX1Bvb2wpCisKK29zUG9vbElkIG9zUG9vbENyZWF0ZSAoY29uc3Qgb3NQb29sRGVmX3QgKnBvb2xfZGVmKSB7CisKKyAgaWYgKHBvb2xfZGVmID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gb3NNZW1vcnlQb29sTmV3KHBvb2xfZGVmLT5wb29sX3N6LCBwb29sX2RlZi0+aXRlbV9zeiwgJnBvb2xfZGVmLT5hdHRyKTsKK30KKwordm9pZCAqb3NQb29sQWxsb2MgKG9zUG9vbElkIHBvb2xfaWQpIHsKKyAgcmV0dXJuIG9zTWVtb3J5UG9vbEFsbG9jKHBvb2xfaWQsIDBVKTsKK30KKwordm9pZCAqb3NQb29sQ0FsbG9jIChvc1Bvb2xJZCBwb29sX2lkKSB7CisgIHZvaWQgICAgKmJsb2NrOworICB1aW50MzJfdCBibG9ja19zaXplOworCisgIGJsb2NrX3NpemUgPSBvc01lbW9yeVBvb2xHZXRCbG9ja1NpemUoKG9zTWVtb3J5UG9vbElkX3QpcG9vbF9pZCk7CisgIGlmIChibG9ja19zaXplID09IDBVKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYmxvY2sgPSBvc01lbW9yeVBvb2xBbGxvYyhwb29sX2lkLCAwVSk7CisgIGlmIChibG9jayAhPSBOVUxMKSB7CisgICAgbWVtc2V0KGJsb2NrLCAwLCBibG9ja19zaXplKTsKKyAgfQorICByZXR1cm4gYmxvY2s7Cit9CisKK29zU3RhdHVzIG9zUG9vbEZyZWUgKG9zUG9vbElkIHBvb2xfaWQsIHZvaWQgKmJsb2NrKSB7CisgIHJldHVybiBvc01lbW9yeVBvb2xGcmVlKHBvb2xfaWQsIGJsb2NrKTsKK30KKworI2VuZGlmICAvLyBNZW1vcnkgUG9vbAorCisKKy8vIE1lc3NhZ2UgUXVldWUKKworI2lmIChkZWZpbmVkKG9zRmVhdHVyZV9NZXNzYWdlUSkgJiYgKG9zRmVhdHVyZV9NZXNzYWdlUSAhPSAwKSkgJiYgIWRlZmluZWQob3MxX0Rpc2FibGVfTWVzc2FnZVEpCisKK29zTWVzc2FnZVFJZCBvc01lc3NhZ2VDcmVhdGUgKGNvbnN0IG9zTWVzc2FnZVFEZWZfdCAqcXVldWVfZGVmLCBvc1RocmVhZElkIHRocmVhZF9pZCkgeworICAodm9pZCl0aHJlYWRfaWQ7CisKKyAgaWYgKHF1ZXVlX2RlZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG9zTWVzc2FnZVF1ZXVlTmV3KHF1ZXVlX2RlZi0+cXVldWVfc3osIHNpemVvZih1aW50MzJfdCksICZxdWV1ZV9kZWYtPmF0dHIpOworfQorCitvc1N0YXR1cyBvc01lc3NhZ2VQdXQgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCwgdWludDMyX3QgaW5mbywgdWludDMyX3QgbWlsbGlzZWMpIHsKKyAgcmV0dXJuIG9zTWVzc2FnZVF1ZXVlUHV0KHF1ZXVlX2lkLCAmaW5mbywgMFUsIG1pbGxpc2VjKTsKK30KKworb3NfSW5SZWdzIG9zRXZlbnQgb3NNZXNzYWdlR2V0IChvc01lc3NhZ2VRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKSB7CisgIG9zU3RhdHVzX3Qgc3RhdHVzOworICBvc0V2ZW50ICAgIGV2ZW50OworICB1aW50MzJfdCAgIG1lc3NhZ2U7CisKKyAgc3RhdHVzID0gb3NNZXNzYWdlUXVldWVHZXQocXVldWVfaWQsICZtZXNzYWdlLCBOVUxMLCBtaWxsaXNlYyk7CisgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBvc09LOgorICAgICAgZXZlbnQuc3RhdHVzID0gb3NFdmVudE1lc3NhZ2U7CisgICAgICBldmVudC52YWx1ZS52ID0gbWVzc2FnZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugb3NFcnJvclJlc291cmNlOgorICAgICAgZXZlbnQuc3RhdHVzID0gb3NPSzsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugb3NFcnJvclRpbWVvdXQ6CisgICAgICBldmVudC5zdGF0dXMgPSBvc0V2ZW50VGltZW91dDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBldmVudC5zdGF0dXMgPSBzdGF0dXM7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gZXZlbnQ7Cit9CisKKyNlbmRpZiAgLy8gTWVzc2FnZSBRdWV1ZQorCisKKy8vIE1haWwgUXVldWUKKworI2lmIChkZWZpbmVkKG9zRmVhdHVyZV9NYWlsUSkgJiYgKG9zRmVhdHVyZV9NYWlsUSAhPSAwKSkgJiYgIWRlZmluZWQob3MxX0Rpc2FibGVfTWFpbFEpCisKK3R5cGVkZWYgc3RydWN0IG9zX21haWxfcXVldWVfcyB7CisgIG9zTWVtb3J5UG9vbElkX3QgICBtcF9pZDsKKyAgb3NNZXNzYWdlUXVldWVJZF90IG1xX2lkOworfSBvc19tYWlsX3F1ZXVlX3Q7CisKK29zTWFpbFFJZCBvc01haWxDcmVhdGUgKGNvbnN0IG9zTWFpbFFEZWZfdCAqcXVldWVfZGVmLCBvc1RocmVhZElkIHRocmVhZF9pZCkgeworICBvc19tYWlsX3F1ZXVlX3QgKnB0cjsKKyAgKHZvaWQpdGhyZWFkX2lkOworCisgIGlmIChxdWV1ZV9kZWYgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcHRyID0gcXVldWVfZGVmLT5tYWlsOworICBpZiAocHRyID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHB0ci0+bXBfaWQgPSBvc01lbW9yeVBvb2xOZXcgIChxdWV1ZV9kZWYtPnF1ZXVlX3N6LCBxdWV1ZV9kZWYtPml0ZW1fc3osICZxdWV1ZV9kZWYtPm1wX2F0dHIpOworICBwdHItPm1xX2lkID0gb3NNZXNzYWdlUXVldWVOZXcocXVldWVfZGVmLT5xdWV1ZV9zeiwgc2l6ZW9mKHZvaWQgKiksICZxdWV1ZV9kZWYtPm1xX2F0dHIpOworICBpZiAoKHB0ci0+bXBfaWQgPT0gTlVMTCkgfHwgKHB0ci0+bXFfaWQgPT0gTlVMTCkpIHsKKyAgICBpZiAocHRyLT5tcF9pZCAhPSBOVUxMKSB7CisgICAgICBvc01lbW9yeVBvb2xEZWxldGUocHRyLT5tcF9pZCk7CisgICAgfQorICAgIGlmIChwdHItPm1xX2lkICE9IE5VTEwpIHsKKyAgICAgIG9zTWVzc2FnZVF1ZXVlRGVsZXRlKHB0ci0+bXFfaWQpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKm9zTWFpbEFsbG9jIChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKSB7CisgIG9zX21haWxfcXVldWVfdCAqcHRyID0gKG9zX21haWxfcXVldWVfdCAqKXF1ZXVlX2lkOworCisgIGlmIChwdHIgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBvc01lbW9yeVBvb2xBbGxvYyhwdHItPm1wX2lkLCBtaWxsaXNlYyk7Cit9CisKK3ZvaWQgKm9zTWFpbENBbGxvYyAob3NNYWlsUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYykgeworICBvc19tYWlsX3F1ZXVlX3QgKnB0ciA9IChvc19tYWlsX3F1ZXVlX3QgKilxdWV1ZV9pZDsKKyAgdm9pZCAgICAgICAgICAgICpibG9jazsKKyAgdWludDMyX3QgICAgICAgICBibG9ja19zaXplOworCisgIGlmIChwdHIgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGJsb2NrX3NpemUgPSBvc01lbW9yeVBvb2xHZXRCbG9ja1NpemUocHRyLT5tcF9pZCk7CisgIGlmIChibG9ja19zaXplID09IDBVKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYmxvY2sgPSBvc01lbW9yeVBvb2xBbGxvYyhwdHItPm1wX2lkLCBtaWxsaXNlYyk7CisgIGlmIChibG9jayAhPSBOVUxMKSB7CisgICAgbWVtc2V0KGJsb2NrLCAwLCBibG9ja19zaXplKTsKKyAgfQorCisgIHJldHVybiBibG9jazsKKworfQorCitvc1N0YXR1cyBvc01haWxQdXQgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgY29uc3Qgdm9pZCAqbWFpbCkgeworICBvc19tYWlsX3F1ZXVlX3QgKnB0ciA9IChvc19tYWlsX3F1ZXVlX3QgKilxdWV1ZV9pZDsKKworICBpZiAocHRyID09IE5VTEwpIHsKKyAgICByZXR1cm4gb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICBpZiAobWFpbCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG9zRXJyb3JWYWx1ZTsKKyAgfQorICByZXR1cm4gb3NNZXNzYWdlUXVldWVQdXQocHRyLT5tcV9pZCwgJm1haWwsIDBVLCAwVSk7Cit9CisKK29zX0luUmVncyBvc0V2ZW50IG9zTWFpbEdldCAob3NNYWlsUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYykgeworICBvc19tYWlsX3F1ZXVlX3QgKnB0ciA9IChvc19tYWlsX3F1ZXVlX3QgKilxdWV1ZV9pZDsKKyAgb3NTdGF0dXNfdCAgICAgICBzdGF0dXM7CisgIG9zRXZlbnQgICAgICAgICAgZXZlbnQ7CisgIHZvaWQgICAgICAgICAgICAqbWFpbDsKKworICBpZiAocHRyID09IE5VTEwpIHsKKyAgICBldmVudC5zdGF0dXMgPSBvc0Vycm9yUGFyYW1ldGVyOworICAgIHJldHVybiBldmVudDsKKyAgfQorCisgIHN0YXR1cyA9IG9zTWVzc2FnZVF1ZXVlR2V0KHB0ci0+bXFfaWQsICZtYWlsLCBOVUxMLCBtaWxsaXNlYyk7CisgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBvc09LOgorICAgICAgZXZlbnQuc3RhdHVzID0gb3NFdmVudE1haWw7CisgICAgICBldmVudC52YWx1ZS5wID0gbWFpbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugb3NFcnJvclJlc291cmNlOgorICAgICAgZXZlbnQuc3RhdHVzID0gb3NPSzsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugb3NFcnJvclRpbWVvdXQ6CisgICAgICBldmVudC5zdGF0dXMgPSBvc0V2ZW50VGltZW91dDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBldmVudC5zdGF0dXMgPSBzdGF0dXM7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gZXZlbnQ7Cit9CisKK29zU3RhdHVzIG9zTWFpbEZyZWUgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgdm9pZCAqbWFpbCkgeworICBvc19tYWlsX3F1ZXVlX3QgKnB0ciA9IChvc19tYWlsX3F1ZXVlX3QgKilxdWV1ZV9pZDsKKworICBpZiAocHRyID09IE5VTEwpIHsKKyAgICByZXR1cm4gb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICBpZiAobWFpbCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG9zRXJyb3JWYWx1ZTsKKyAgfQorICByZXR1cm4gb3NNZW1vcnlQb29sRnJlZShwdHItPm1wX2lkLCBtYWlsKTsKK30KKworI2VuZGlmICAvLyBNYWlsIFF1ZXVlCisKKworI2VuZGlmICAvLyBvc0NNU0lTCmRpZmYgLS1naXQgYS9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYyBiL1NvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NWIzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYwpAQCAtMCwwICsxLDE4NzEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgwqkgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MgSW50ZXJuYXRpb25hbCBOLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7IHlvdSBtYXkKKyAqIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiB3d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiAgICAgIE5hbWU6ICAgIGNtc2lzX29zMi5jCisgKiAgICAgIFB1cnBvc2U6IENNU0lTIFJUT1MyIHdyYXBwZXIgZm9yIEZyZWVSVE9TCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJjbXNpc19vczIuaCIgICAgICAgICAgICAgICAgICAvLyA6OkNNU0lTOlJUT1MyCisjaW5jbHVkZSAiY21zaXNfY29tcGlsZXIuaCIKKworI2luY2x1ZGUgIkZyZWVSVE9TLmgiICAgICAgICAgICAgICAgICAgIC8vIEFSTS5GcmVlUlRPUzo6UlRPUzpDb3JlCisjaW5jbHVkZSAidGFzay5oIiAgICAgICAgICAgICAgICAgICAgICAgLy8gQVJNLkZyZWVSVE9TOjpSVE9TOkNvcmUKKyNpbmNsdWRlICJldmVudF9ncm91cHMuaCIgICAgICAgICAgICAgICAvLyBBUk0uRnJlZVJUT1M6OlJUT1M6RXZlbnQgR3JvdXBzCisjaW5jbHVkZSAic2VtcGhyLmgiICAgICAgICAgICAgICAgICAgICAgLy8gQVJNLkZyZWVSVE9TOjpSVE9TOkNvcmUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmbmRlZiBfX0FSTV9BUkNIXzZNX18KKyAgI2RlZmluZSBfX0FSTV9BUkNIXzZNX18gICAgICAgICAwCisjZW5kaWYKKyNpZm5kZWYgX19BUk1fQVJDSF83TV9fCisgICNkZWZpbmUgX19BUk1fQVJDSF83TV9fICAgICAgICAgMAorI2VuZGlmCisjaWZuZGVmIF9fQVJNX0FSQ0hfN0VNX18KKyAgI2RlZmluZSBfX0FSTV9BUkNIXzdFTV9fICAgICAgICAwCisjZW5kaWYKKyNpZm5kZWYgX19BUk1fQVJDSF84TV9NQUlOX18KKyAgI2RlZmluZSBfX0FSTV9BUkNIXzhNX01BSU5fXyAgICAwCisjZW5kaWYKKyNpZm5kZWYgX19BUk1fQVJDSF83QV9fCisgICNkZWZpbmUgX19BUk1fQVJDSF83QV9fICAgICAgICAgMAorI2VuZGlmCisKKyNpZiAgICgoX19BUk1fQVJDSF83TV9fICAgICAgPT0gMVUpIHx8IFwKKyAgICAgICAoX19BUk1fQVJDSF83RU1fXyAgICAgPT0gMVUpIHx8IFwKKyAgICAgICAoX19BUk1fQVJDSF84TV9NQUlOX18gPT0gMVUpKQorI2RlZmluZSBJU19JUlFfTUFTS0VEKCkgICAgICAgICAgICgoX19nZXRfUFJJTUFTSygpICE9IDBVKSB8fCAoKEtlcm5lbFN0YXRlID09IG9zS2VybmVsUnVubmluZykgJiYgKF9fZ2V0X0JBU0VQUkkoKSAhPSAwVSkpKQorI2VsaWYgIChfX0FSTV9BUkNIXzZNX18gICAgICA9PSAxVSkKKyNkZWZpbmUgSVNfSVJRX01BU0tFRCgpICAgICAgICAgICAoKF9fZ2V0X1BSSU1BU0soKSAhPSAwVSkgJiYgIChLZXJuZWxTdGF0ZSA9PSBvc0tlcm5lbFJ1bm5pbmcpKQorI2VsaWYgKF9fQVJNX0FSQ0hfN0FfXyAgICAgICA9PSAxKQorI2RlZmluZSBJU19JUlFfTUFTS0VEKCkgICAgICAgICAgICgwVSkKKyNlbHNlCisjZGVmaW5lIElTX0lSUV9NQVNLRUQoKSAgICAgICAgICAgKF9fZ2V0X1BSSU1BU0soKSAhPSAwVSkKKyNlbmRpZgorCisjaWYgICAgKF9fQVJNX0FSQ0hfN0FfXyAgICAgID09IDFVKQorLyogQ1BTUiBtb2RlIGJpdG1hc2tzICovCisjZGVmaW5lIENQU1JfTU9ERV9VU0VSICAgICAgICAgICAgMHgxMFUKKyNkZWZpbmUgQ1BTUl9NT0RFX1NZU1RFTSAgICAgICAgICAweDFGVQorCisjZGVmaW5lIElTX0lSUV9NT0RFKCkgICAgICAgICAgICAgKChfX2dldF9tb2RlKCkgIT0gQ1BTUl9NT0RFX1VTRVIpICYmIChfX2dldF9tb2RlKCkgIT0gQ1BTUl9NT0RFX1NZU1RFTSkpCisjZWxzZQorI2RlZmluZSBJU19JUlFfTU9ERSgpICAgICAgICAgICAgIChfX2dldF9JUFNSKCkgIT0gMFUpCisjZW5kaWYKKworI2RlZmluZSBJU19JUlEoKSAgICAgICAgICAgICAgICAgIChJU19JUlFfTU9ERSgpIHx8IElTX0lSUV9NQVNLRUQoKSkKKworLyogTGltaXRzICovCisjZGVmaW5lIE1BWF9CSVRTX1RBU0tfTk9USUZZICAgICAgMzFVCisjZGVmaW5lIE1BWF9CSVRTX0VWRU5UX0dST1VQUyAgICAgMjRVCisKKyNkZWZpbmUgVEhSRUFEX0ZMQUdTX0lOVkFMSURfQklUUyAofigoMVVMIDw8IE1BWF9CSVRTX1RBU0tfTk9USUZZKSAgLSAxVSkpCisjZGVmaW5lIEVWRU5UX0ZMQUdTX0lOVkFMSURfQklUUyAgKH4oKDFVTCA8PCBNQVhfQklUU19FVkVOVF9HUk9VUFMpIC0gMVUpKQorCisvKiBLZXJuZWwgdmVyc2lvbiBhbmQgaWRlbnRpZmljYXRpb24gc3RyaW5nIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgS0VSTkVMX1ZFUlNJT04gICAgICAgICAgICAoKCh1aW50MzJfdCl0c2tLRVJORUxfVkVSU0lPTl9NQUpPUiAqIDEwMDAwMDAwVUwpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXRza0tFUk5FTF9WRVJTSU9OX01JTk9SICogICAgMTAwMDBVTCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpdHNrS0VSTkVMX1ZFUlNJT05fQlVJTEQgKiAgICAgICAgMVVMKSkKKworI2RlZmluZSBLRVJORUxfSUQgICAgICAgICAgICAgICAgICJGcmVlUlRPUyBWMTAuMC4xIgorCisvKiBUaW1lciBjYWxsYmFjayBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBvc1RpbWVyRnVuY190IGZ1bmM7CisgIHZvaWQgICAgICAgICAqYXJnOworfSBUaW1lckNhbGxiYWNrX3Q7CisKKy8qIEtlcm5lbCBpbml0aWFsaXphdGlvbiBzdGF0ZSAqLworc3RhdGljIG9zS2VybmVsU3RhdGVfdCBLZXJuZWxTdGF0ZTsKKworLyogSGVhcCByZWdpb24gZGVmaW5pdGlvbiB1c2VkIGJ5IGhlYXBfNSB2YXJpYW50ICovCisjaWYgZGVmaW5lZChVU0VfRnJlZVJUT1NfSEVBUF81KQorI2lmIChjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCA9PSAxKQorLyoKKyAgVGhlIGFwcGxpY2F0aW9uIHdyaXRlciBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBhcnJheSB1c2VkIGZvciB0aGUgUlRPUworICBoZWFwIC0gcHJvYmFibHkgc28gaXQgY2FuIGJlIHBsYWNlZCBpbiBhIHNwZWNpYWwgc2VnbWVudCBvciBhZGRyZXNzLgorKi8KKyAgZXh0ZXJuIHVpbnQ4X3QgdWNIZWFwW2NvbmZpZ1RPVEFMX0hFQVBfU0laRV07CisjZWxzZQorICBzdGF0aWMgdWludDhfdCB1Y0hlYXBbY29uZmlnVE9UQUxfSEVBUF9TSVpFXTsKKyNlbmRpZiAvKiBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCAqLworCitzdGF0aWMgSGVhcFJlZ2lvbl90IHhIZWFwUmVnaW9uc1tdID0geworICB7IHVjSGVhcCwgY29uZmlnVE9UQUxfSEVBUF9TSVpFIH0sCisgIHsgTlVMTCwgICAwICAgICAgICAgICAgICAgICAgICAgfQorfTsKKyNlbmRpZiAvKiBVU0VfRnJlZVJUT1NfSEVBUF81ICovCisKKyNpZiBkZWZpbmVkKFN5c1RpY2spCisvKiBGcmVlUlRPUyB0aWNrIHRpbWVyIGludGVycnVwdCBoYW5kbGVyIHByb3RvdHlwZSAqLworZXh0ZXJuIHZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciAodm9pZCk7CisKKy8qCisgIFN5c1RpY2sgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsc28gY2xlYXJzIG92ZXJmbG93IGZsYWcuCisqLwordm9pZCBTeXNUaWNrX0hhbmRsZXIgKHZvaWQpIHsKKyAgLyogQ2xlYXIgb3ZlcmZsb3cgZmxhZyAqLworICBTeXNUaWNrLT5DVFJMOworCisgIC8qIENhbGwgdGljayBoYW5kbGVyICovCisgIHhQb3J0U3lzVGlja0hhbmRsZXIoKTsKK30KKyNlbmRpZiAvKiBTeXNUaWNrICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworb3NTdGF0dXNfdCBvc0tlcm5lbEluaXRpYWxpemUgKHZvaWQpIHsKKyAgb3NTdGF0dXNfdCBzdGF0OworCisgIGlmIChJU19JUlEoKSkgeworICAgIHN0YXQgPSBvc0Vycm9ySVNSOworICB9CisgIGVsc2UgeworICAgIGlmIChLZXJuZWxTdGF0ZSA9PSBvc0tlcm5lbEluYWN0aXZlKSB7CisgICAgICAjaWYgZGVmaW5lZChVU0VfRnJlZVJUT1NfSEVBUF81KQorICAgICAgICB2UG9ydERlZmluZUhlYXBSZWdpb25zICh4SGVhcFJlZ2lvbnMpOworICAgICAgI2VuZGlmCisgICAgICBLZXJuZWxTdGF0ZSA9IG9zS2VybmVsUmVhZHk7CisgICAgICBzdGF0ID0gb3NPSzsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdCA9IG9zRXJyb3I7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChzdGF0KTsKK30KKworb3NTdGF0dXNfdCBvc0tlcm5lbEdldEluZm8gKG9zVmVyc2lvbl90ICp2ZXJzaW9uLCBjaGFyICppZF9idWYsIHVpbnQzMl90IGlkX3NpemUpIHsKKworICBpZiAodmVyc2lvbiAhPSBOVUxMKSB7CisgICAgdmVyc2lvbi0+YXBpICAgID0gS0VSTkVMX1ZFUlNJT047CisgICAgdmVyc2lvbi0+a2VybmVsID0gS0VSTkVMX1ZFUlNJT047CisgIH0KKworICBpZiAoKGlkX2J1ZiAhPSBOVUxMKSAmJiAoaWRfc2l6ZSAhPSAwVSkpIHsKKyAgICBpZiAoaWRfc2l6ZSA+IHNpemVvZihLRVJORUxfSUQpKSB7CisgICAgICBpZF9zaXplID0gc2l6ZW9mKEtFUk5FTF9JRCk7CisgICAgfQorICAgIG1lbWNweShpZF9idWYsIEtFUk5FTF9JRCwgaWRfc2l6ZSk7CisgIH0KKworICByZXR1cm4gKG9zT0spOworfQorCitvc0tlcm5lbFN0YXRlX3Qgb3NLZXJuZWxHZXRTdGF0ZSAodm9pZCkgeworICBvc0tlcm5lbFN0YXRlX3Qgc3RhdGU7CisKKyAgc3dpdGNoICh4VGFza0dldFNjaGVkdWxlclN0YXRlKCkpIHsKKyAgICBjYXNlIHRhc2tTQ0hFRFVMRVJfUlVOTklORzoKKyAgICAgIHN0YXRlID0gb3NLZXJuZWxSdW5uaW5nOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRhc2tTQ0hFRFVMRVJfU1VTUEVOREVEOgorICAgICAgc3RhdGUgPSBvc0tlcm5lbExvY2tlZDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0YXNrU0NIRURVTEVSX05PVF9TVEFSVEVEOgorICAgIGRlZmF1bHQ6CisgICAgICBpZiAoS2VybmVsU3RhdGUgPT0gb3NLZXJuZWxSZWFkeSkgeworICAgICAgICBzdGF0ZSA9IG9zS2VybmVsUmVhZHk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGF0ZSA9IG9zS2VybmVsSW5hY3RpdmU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiAoc3RhdGUpOworfQorCitvc1N0YXR1c190IG9zS2VybmVsU3RhcnQgKHZvaWQpIHsKKyAgb3NTdGF0dXNfdCBzdGF0OworCisgIGlmIChJU19JUlEoKSkgeworICAgIHN0YXQgPSBvc0Vycm9ySVNSOworICB9CisgIGVsc2UgeworICAgIGlmIChLZXJuZWxTdGF0ZSA9PSBvc0tlcm5lbFJlYWR5KSB7CisgICAgICBLZXJuZWxTdGF0ZSA9IG9zS2VybmVsUnVubmluZzsKKyAgICAgIHZUYXNrU3RhcnRTY2hlZHVsZXIoKTsKKyAgICAgIHN0YXQgPSBvc09LOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0ID0gb3NFcnJvcjsKKyAgICB9CisgIH0KKworICByZXR1cm4gKHN0YXQpOworfQorCitpbnQzMl90IG9zS2VybmVsTG9jayAodm9pZCkgeworICBpbnQzMl90IGxvY2s7CisKKyAgaWYgKElTX0lSUSgpKSB7CisgICAgbG9jayA9IChpbnQzMl90KW9zRXJyb3JJU1I7CisgIH0KKyAgZWxzZSB7CisgICAgc3dpdGNoICh4VGFza0dldFNjaGVkdWxlclN0YXRlKCkpIHsKKyAgICAgIGNhc2UgdGFza1NDSEVEVUxFUl9TVVNQRU5ERUQ6CisgICAgICAgIGxvY2sgPSAxOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0YXNrU0NIRURVTEVSX1JVTk5JTkc6CisgICAgICAgIHZUYXNrU3VzcGVuZEFsbCgpOworICAgICAgICBsb2NrID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdGFza1NDSEVEVUxFUl9OT1RfU1RBUlRFRDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxvY2sgPSAoaW50MzJfdClvc0Vycm9yOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gKGxvY2spOworfQorCitpbnQzMl90IG9zS2VybmVsVW5sb2NrICh2b2lkKSB7CisgIGludDMyX3QgbG9jazsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBsb2NrID0gKGludDMyX3Qpb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIHsKKyAgICBzd2l0Y2ggKHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSkgeworICAgICAgY2FzZSB0YXNrU0NIRURVTEVSX1NVU1BFTkRFRDoKKyAgICAgICAgbG9jayA9IDE7CisKKyAgICAgICAgaWYgKHhUYXNrUmVzdW1lQWxsKCkgIT0gcGRUUlVFKSB7CisgICAgICAgICAgaWYgKHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSA9PSB0YXNrU0NIRURVTEVSX1NVU1BFTkRFRCkgeworICAgICAgICAgICAgbG9jayA9IChpbnQzMl90KW9zRXJyb3I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRhc2tTQ0hFRFVMRVJfUlVOTklORzoKKyAgICAgICAgbG9jayA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRhc2tTQ0hFRFVMRVJfTk9UX1NUQVJURUQ6CisgICAgICBkZWZhdWx0OgorICAgICAgICBsb2NrID0gKGludDMyX3Qpb3NFcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChsb2NrKTsKK30KKworaW50MzJfdCBvc0tlcm5lbFJlc3RvcmVMb2NrIChpbnQzMl90IGxvY2spIHsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBsb2NrID0gKGludDMyX3Qpb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIHsKKyAgICBzd2l0Y2ggKHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSkgeworICAgICAgY2FzZSB0YXNrU0NIRURVTEVSX1NVU1BFTkRFRDoKKyAgICAgIGNhc2UgdGFza1NDSEVEVUxFUl9SVU5OSU5HOgorICAgICAgICBpZiAobG9jayA9PSAxKSB7CisgICAgICAgICAgdlRhc2tTdXNwZW5kQWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaWYgKGxvY2sgIT0gMCkgeworICAgICAgICAgICAgbG9jayA9IChpbnQzMl90KW9zRXJyb3I7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHhUYXNrUmVzdW1lQWxsKCkgIT0gcGRUUlVFKSB7CisgICAgICAgICAgICAgIGlmICh4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgIT0gdGFza1NDSEVEVUxFUl9SVU5OSU5HKSB7CisgICAgICAgICAgICAgICAgbG9jayA9IChpbnQzMl90KW9zRXJyb3I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdGFza1NDSEVEVUxFUl9OT1RfU1RBUlRFRDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxvY2sgPSAoaW50MzJfdClvc0Vycm9yOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gKGxvY2spOworfQorCit1aW50MzJfdCBvc0tlcm5lbEdldFRpY2tDb3VudCAodm9pZCkgeworICBUaWNrVHlwZV90IHRpY2tzOworCisgIGlmIChJU19JUlEoKSkgeworICAgIHRpY2tzID0geFRhc2tHZXRUaWNrQ291bnRGcm9tSVNSKCk7CisgIH0gZWxzZSB7CisgICAgdGlja3MgPSB4VGFza0dldFRpY2tDb3VudCgpOworICB9CisKKyAgcmV0dXJuICh0aWNrcyk7Cit9CisKK3VpbnQzMl90IG9zS2VybmVsR2V0VGlja0ZyZXEgKHZvaWQpIHsKKyAgcmV0dXJuIChjb25maWdUSUNLX1JBVEVfSFopOworfQorCit1aW50MzJfdCBvc0tlcm5lbEdldFN5c1RpbWVyQ291bnQgKHZvaWQpIHsKKyAgVGlja1R5cGVfdCB0aWNrczsKKyAgdWludDMyX3QgdmFsOworCisgIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKworICB0aWNrcyA9IHhUYXNrR2V0VGlja0NvdW50KCk7CisKKyAgdmFsID0gdGlja3MgKiAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApOworICBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKworICByZXR1cm4gKHZhbCk7Cit9CisKK3VpbnQzMl90IG9zS2VybmVsR2V0U3lzVGltZXJGcmVxICh2b2lkKSB7CisgIHJldHVybiAoY29uZmlnQ1BVX0NMT0NLX0haKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitvc1RocmVhZElkX3Qgb3NUaHJlYWROZXcgKG9zVGhyZWFkRnVuY190IGZ1bmMsIHZvaWQgKmFyZ3VtZW50LCBjb25zdCBvc1RocmVhZEF0dHJfdCAqYXR0cikgeworICBjaGFyIGVtcHR5OworICBjb25zdCBjaGFyICpuYW1lOworICB1aW50MzJfdCBzdGFjazsKKyAgVGFza0hhbmRsZV90IGhUYXNrOworICBVQmFzZVR5cGVfdCBwcmlvOworICBpbnQzMl90IG1lbTsKKworICBoVGFzayA9IE5VTEw7CisKKyAgaWYgKCFJU19JUlEoKSAmJiAoZnVuYyAhPSBOVUxMKSkgeworICAgIHN0YWNrID0gY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFOworICAgIHByaW8gID0gKFVCYXNlVHlwZV90KW9zUHJpb3JpdHlOb3JtYWw7CisKKyAgICBlbXB0eSA9ICdcMCc7CisgICAgbmFtZSAgPSAmZW1wdHk7CisgICAgbWVtICAgPSAtMTsKKworICAgIGlmIChhdHRyICE9IE5VTEwpIHsKKyAgICAgIGlmIChhdHRyLT5uYW1lICE9IE5VTEwpIHsKKyAgICAgICAgbmFtZSA9IGF0dHItPm5hbWU7CisgICAgICB9CisgICAgICBpZiAoYXR0ci0+cHJpb3JpdHkgIT0gb3NQcmlvcml0eU5vbmUpIHsKKyAgICAgICAgcHJpbyA9IChVQmFzZVR5cGVfdClhdHRyLT5wcmlvcml0eTsKKyAgICAgIH0KKworICAgICAgaWYgKChwcmlvIDwgb3NQcmlvcml0eUlkbGUpIHx8IChwcmlvID4gb3NQcmlvcml0eUlTUikgfHwgKChhdHRyLT5hdHRyX2JpdHMgJiBvc1RocmVhZEpvaW5hYmxlKSA9PSBvc1RocmVhZEpvaW5hYmxlKSkgeworICAgICAgICByZXR1cm4gKE5VTEwpOworICAgICAgfQorCisgICAgICBpZiAoYXR0ci0+c3RhY2tfc2l6ZSA+IDBVKSB7CisgICAgICAgIC8qIEluIEZyZWVSVE9TIHN0YWNrIGlzIG5vdCBpbiBieXRlcywgYnV0IGluIHNpemVvZihTdGFja1R5cGVfdCkgd2hpY2ggaXMgNCBvbiBBUk0gcG9ydHMuICAgICAgICovCisgICAgICAgIC8qIFN0YWNrIHNpemUgc2hvdWxkIGJlIHRoZXJlZm9yZSA0IGJ5dGUgYWxpZ25lZCBpbiBvcmRlciB0byBhdm9pZCBkaXZpc2lvbiBjYXVzZWQgc2lkZSBlZmZlY3RzICovCisgICAgICAgIHN0YWNrID0gYXR0ci0+c3RhY2tfc2l6ZSAvIHNpemVvZihTdGFja1R5cGVfdCk7CisgICAgICB9CisKKyAgICAgIGlmICgoYXR0ci0+Y2JfbWVtICAgICE9IE5VTEwpICYmIChhdHRyLT5jYl9zaXplICAgID49IHNpemVvZihTdGF0aWNUYXNrX3QpKSAmJgorICAgICAgICAgIChhdHRyLT5zdGFja19tZW0gIT0gTlVMTCkgJiYgKGF0dHItPnN0YWNrX3NpemUgPiAgMFUpKSB7CisgICAgICAgIG1lbSA9IDE7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKChhdHRyLT5jYl9tZW0gPT0gTlVMTCkgJiYgKGF0dHItPmNiX3NpemUgPT0gMFUpICYmIChhdHRyLT5zdGFja19tZW0gPT0gTlVMTCkpIHsKKyAgICAgICAgICBtZW0gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgbWVtID0gMDsKKyAgICB9CisKKyAgICBpZiAobWVtID09IDEpIHsKKyAgICAgIGhUYXNrID0geFRhc2tDcmVhdGVTdGF0aWMgKChUYXNrRnVuY3Rpb25fdClmdW5jLCBuYW1lLCBzdGFjaywgYXJndW1lbnQsIHByaW8sIChTdGFja1R5cGVfdCAgKilhdHRyLT5zdGFja19tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhdGljVGFza190ICopYXR0ci0+Y2JfbWVtKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAobWVtID09IDApIHsKKyAgICAgICAgaWYgKHhUYXNrQ3JlYXRlICgoVGFza0Z1bmN0aW9uX3QpZnVuYywgbmFtZSwgKHVpbnQxNl90KXN0YWNrLCBhcmd1bWVudCwgcHJpbywgJmhUYXNrKSAhPSBwZFBBU1MpIHsKKyAgICAgICAgICBoVGFzayA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gKChvc1RocmVhZElkX3QpaFRhc2spOworfQorCitjb25zdCBjaGFyICpvc1RocmVhZEdldE5hbWUgKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQpIHsKKyAgVGFza0hhbmRsZV90IGhUYXNrID0gKFRhc2tIYW5kbGVfdCl0aHJlYWRfaWQ7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgaWYgKElTX0lSUSgpIHx8IChoVGFzayA9PSBOVUxMKSkgeworICAgIG5hbWUgPSBOVUxMOworICB9IGVsc2UgeworICAgIG5hbWUgPSBwY1Rhc2tHZXROYW1lIChoVGFzayk7CisgIH0KKworICByZXR1cm4gKG5hbWUpOworfQorCitvc1RocmVhZElkX3Qgb3NUaHJlYWRHZXRJZCAodm9pZCkgeworICBvc1RocmVhZElkX3QgaWQ7CisKKyAgaWYgKElTX0lSUSgpKSB7CisgICAgaWQgPSBOVUxMOworICB9IGVsc2UgeworICAgIGlkID0gKG9zVGhyZWFkSWRfdCl4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCk7CisgIH0KKworICByZXR1cm4gKGlkKTsKK30KKworb3NUaHJlYWRTdGF0ZV90IG9zVGhyZWFkR2V0U3RhdGUgKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQpIHsKKyAgVGFza0hhbmRsZV90IGhUYXNrID0gKFRhc2tIYW5kbGVfdCl0aHJlYWRfaWQ7CisgIG9zVGhyZWFkU3RhdGVfdCBzdGF0ZTsKKworICBpZiAoSVNfSVJRKCkgfHwgKGhUYXNrID09IE5VTEwpKSB7CisgICAgc3RhdGUgPSBvc1RocmVhZEVycm9yOworICB9CisgIGVsc2UgeworICAgIHN3aXRjaCAoZVRhc2tHZXRTdGF0ZSAoaFRhc2spKSB7CisgICAgICBjYXNlIGVSdW5uaW5nOiAgIHN0YXRlID0gb3NUaHJlYWRSdW5uaW5nOyAgICBicmVhazsKKyAgICAgIGNhc2UgZVJlYWR5OiAgICAgc3RhdGUgPSBvc1RocmVhZFJlYWR5OyAgICAgIGJyZWFrOworICAgICAgY2FzZSBlQmxvY2tlZDoKKyAgICAgIGNhc2UgZVN1c3BlbmRlZDogc3RhdGUgPSBvc1RocmVhZEJsb2NrZWQ7ICAgIGJyZWFrOworICAgICAgY2FzZSBlRGVsZXRlZDogICBzdGF0ZSA9IG9zVGhyZWFkVGVybWluYXRlZDsgYnJlYWs7CisgICAgICBjYXNlIGVJbnZhbGlkOgorICAgICAgZGVmYXVsdDogICAgICAgICBzdGF0ZSA9IG9zVGhyZWFkRXJyb3I7ICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChzdGF0ZSk7Cit9CisKK3VpbnQzMl90IG9zVGhyZWFkR2V0U3RhY2tTcGFjZSAob3NUaHJlYWRJZF90IHRocmVhZF9pZCkgeworICBUYXNrSGFuZGxlX3QgaFRhc2sgPSAoVGFza0hhbmRsZV90KXRocmVhZF9pZDsKKyAgdWludDMyX3Qgc3o7CisKKyAgaWYgKElTX0lSUSgpIHx8IChoVGFzayA9PSBOVUxMKSkgeworICAgIHN6ID0gMFU7CisgIH0gZWxzZSB7CisgICAgc3ogPSAodWludDMyX3QpdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrIChoVGFzayk7CisgIH0KKworICByZXR1cm4gKHN6KTsKK30KKwordWludDMyX3Qgb3NUaHJlYWRHZXRTdGFja1NpemUJKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQpIHsKKyAgLyoKKyAgICogdGhpcyBpbXBsbWVudGF0aW9uIGlzIG5vdCBjb3JyZWN0LgorICAgKiB0aGlzIGZ1bmN0aW9uIGlzIGltcGxtZW50ZWQgdG8gYXZvaWQgbGluayBlcnJvcnMgKHVuZGVmaW5lZCByZWZlcmVuY2UpCisgICAqIEJ1ZyByZXBvcnRlZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9BUk0tc29mdHdhcmUvQ01TSVMtRnJlZVJUT1MvaXNzdWVzLzE0CisgICAqLworICAodm9pZCkgdGhyZWFkX2lkOworICByZXR1cm4gMDsKK30KKworb3NTdGF0dXNfdCBvc1RocmVhZFNldFByaW9yaXR5IChvc1RocmVhZElkX3QgdGhyZWFkX2lkLCBvc1ByaW9yaXR5X3QgcHJpb3JpdHkpIHsKKyAgVGFza0hhbmRsZV90IGhUYXNrID0gKFRhc2tIYW5kbGVfdCl0aHJlYWRfaWQ7CisgIG9zU3RhdHVzX3Qgc3RhdDsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBzdGF0ID0gb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIGlmICgoaFRhc2sgPT0gTlVMTCkgfHwgKHByaW9yaXR5IDwgb3NQcmlvcml0eUlkbGUpIHx8IChwcmlvcml0eSA+IG9zUHJpb3JpdHlJU1IpKSB7CisgICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgZWxzZSB7CisgICAgc3RhdCA9IG9zT0s7CisgICAgdlRhc2tQcmlvcml0eVNldCAoaFRhc2ssIChVQmFzZVR5cGVfdClwcmlvcml0eSk7CisgIH0KKworICByZXR1cm4gKHN0YXQpOworfQorCitvc1ByaW9yaXR5X3Qgb3NUaHJlYWRHZXRQcmlvcml0eSAob3NUaHJlYWRJZF90IHRocmVhZF9pZCkgeworICBUYXNrSGFuZGxlX3QgaFRhc2sgPSAoVGFza0hhbmRsZV90KXRocmVhZF9pZDsKKyAgb3NQcmlvcml0eV90IHByaW87CisKKyAgaWYgKElTX0lSUSgpIHx8IChoVGFzayA9PSBOVUxMKSkgeworICAgIHByaW8gPSBvc1ByaW9yaXR5RXJyb3I7CisgIH0gZWxzZSB7CisgICAgcHJpbyA9IChvc1ByaW9yaXR5X3QpdXhUYXNrUHJpb3JpdHlHZXQgKGhUYXNrKTsKKyAgfQorCisgIHJldHVybiAocHJpbyk7Cit9CisKK29zU3RhdHVzX3Qgb3NUaHJlYWRZaWVsZCAodm9pZCkgeworICBvc1N0YXR1c190IHN0YXQ7CisKKyAgaWYgKElTX0lSUSgpKSB7CisgICAgc3RhdCA9IG9zRXJyb3JJU1I7CisgIH0gZWxzZSB7CisgICAgc3RhdCA9IG9zT0s7CisgICAgdGFza1lJRUxEKCk7CisgIH0KKworICByZXR1cm4gKHN0YXQpOworfQorCitvc1N0YXR1c190IG9zVGhyZWFkU3VzcGVuZCAob3NUaHJlYWRJZF90IHRocmVhZF9pZCkgeworICBUYXNrSGFuZGxlX3QgaFRhc2sgPSAoVGFza0hhbmRsZV90KXRocmVhZF9pZDsKKyAgb3NTdGF0dXNfdCBzdGF0OworCisgIGlmIChJU19JUlEoKSkgeworICAgIHN0YXQgPSBvc0Vycm9ySVNSOworICB9CisgIGVsc2UgaWYgKGhUYXNrID09IE5VTEwpIHsKKyAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICBlbHNlIHsKKyAgICBzdGF0ID0gb3NPSzsKKyAgICB2VGFza1N1c3BlbmQgKGhUYXNrKTsKKyAgfQorCisgIHJldHVybiAoc3RhdCk7Cit9CisKK29zU3RhdHVzX3Qgb3NUaHJlYWRSZXN1bWUgKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQpIHsKKyAgVGFza0hhbmRsZV90IGhUYXNrID0gKFRhc2tIYW5kbGVfdCl0aHJlYWRfaWQ7CisgIG9zU3RhdHVzX3Qgc3RhdDsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBzdGF0ID0gb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIGlmIChoVGFzayA9PSBOVUxMKSB7CisgICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgZWxzZSB7CisgICAgc3RhdCA9IG9zT0s7CisgICAgdlRhc2tSZXN1bWUgKGhUYXNrKTsKKyAgfQorCisgIHJldHVybiAoc3RhdCk7Cit9CisKK19fTk9fUkVUVVJOIHZvaWQgb3NUaHJlYWRFeGl0ICh2b2lkKSB7CisjaWZuZGVmIFVTRV9GcmVlUlRPU19IRUFQXzEKKyAgdlRhc2tEZWxldGUgKE5VTEwpOworI2VuZGlmCisgIGZvciAoOzspOworfQorCitvc1N0YXR1c190IG9zVGhyZWFkVGVybWluYXRlIChvc1RocmVhZElkX3QgdGhyZWFkX2lkKSB7CisgIFRhc2tIYW5kbGVfdCBoVGFzayA9IChUYXNrSGFuZGxlX3QpdGhyZWFkX2lkOworICBvc1N0YXR1c190IHN0YXQ7CisjaWZuZGVmIFVTRV9GcmVlUlRPU19IRUFQXzEKKyAgZVRhc2tTdGF0ZSB0c3RhdGU7CisKKyAgaWYgKElTX0lSUSgpKSB7CisgICAgc3RhdCA9IG9zRXJyb3JJU1I7CisgIH0KKyAgZWxzZSBpZiAoaFRhc2sgPT0gTlVMTCkgeworICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIGVsc2UgeworICAgIHRzdGF0ZSA9IGVUYXNrR2V0U3RhdGUgKGhUYXNrKTsKKworICAgIGlmICh0c3RhdGUgIT0gZURlbGV0ZWQpIHsKKyAgICAgIHN0YXQgPSBvc09LOworICAgICAgdlRhc2tEZWxldGUgKGhUYXNrKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKKyAgICB9CisgIH0KKyNlbHNlCisgIHN0YXQgPSBvc0Vycm9yOworI2VuZGlmCisKKyAgcmV0dXJuIChzdGF0KTsKK30KKwordWludDMyX3Qgb3NUaHJlYWRHZXRDb3VudCAodm9pZCkgeworICB1aW50MzJfdCBjb3VudDsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBjb3VudCA9IDBVOworICB9IGVsc2UgeworICAgIGNvdW50ID0gdXhUYXNrR2V0TnVtYmVyT2ZUYXNrcygpOworICB9CisKKyAgcmV0dXJuIChjb3VudCk7Cit9CisKK3VpbnQzMl90IG9zVGhyZWFkRW51bWVyYXRlIChvc1RocmVhZElkX3QgKnRocmVhZF9hcnJheSwgdWludDMyX3QgYXJyYXlfaXRlbXMpIHsKKyAgdWludDMyX3QgaSwgY291bnQ7CisgIFRhc2tTdGF0dXNfdCAqdGFzazsKKworICBpZiAoSVNfSVJRKCkgfHwgKHRocmVhZF9hcnJheSA9PSBOVUxMKSB8fCAoYXJyYXlfaXRlbXMgPT0gMFUpKSB7CisgICAgY291bnQgPSAwVTsKKyAgfSBlbHNlIHsKKyAgICB2VGFza1N1c3BlbmRBbGwoKTsKKworICAgIGNvdW50ID0gdXhUYXNrR2V0TnVtYmVyT2ZUYXNrcygpOworICAgIHRhc2sgID0gcHZQb3J0TWFsbG9jIChjb3VudCAqIHNpemVvZihUYXNrU3RhdHVzX3QpKTsKKworICAgIGlmICh0YXNrICE9IE5VTEwpIHsKKyAgICAgIGNvdW50ID0gdXhUYXNrR2V0U3lzdGVtU3RhdGUgKHRhc2ssIGNvdW50LCBOVUxMKTsKKworICAgICAgZm9yIChpID0gMFU7IChpIDwgY291bnQpICYmIChpIDwgYXJyYXlfaXRlbXMpOyBpKyspIHsKKyAgICAgICAgdGhyZWFkX2FycmF5W2ldID0gKG9zVGhyZWFkSWRfdCl0YXNrW2ldLnhIYW5kbGU7CisgICAgICB9CisgICAgICBjb3VudCA9IGk7CisgICAgfQorICAgICh2b2lkKXhUYXNrUmVzdW1lQWxsKCk7CisKKyAgICB2UG9ydEZyZWUgKHRhc2spOworICB9CisKKyAgcmV0dXJuIChjb3VudCk7Cit9CisKK3VpbnQzMl90IG9zVGhyZWFkRmxhZ3NTZXQgKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQsIHVpbnQzMl90IGZsYWdzKSB7CisgIFRhc2tIYW5kbGVfdCBoVGFzayA9IChUYXNrSGFuZGxlX3QpdGhyZWFkX2lkOworICB1aW50MzJfdCByZmxhZ3M7CisgIEJhc2VUeXBlX3QgeWllbGQ7CisKKyAgaWYgKChoVGFzayA9PSBOVUxMKSB8fCAoKGZsYWdzICYgVEhSRUFEX0ZMQUdTX0lOVkFMSURfQklUUykgIT0gMFUpKSB7CisgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgZWxzZSB7CisgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3I7CisKKyAgICBpZiAoSVNfSVJRKCkpIHsKKyAgICAgIHlpZWxkID0gcGRGQUxTRTsKKworICAgICAgKHZvaWQpeFRhc2tOb3RpZnlGcm9tSVNSIChoVGFzaywgZmxhZ3MsIGVTZXRCaXRzLCAmeWllbGQpOworICAgICAgKHZvaWQpeFRhc2tOb3RpZnlBbmRRdWVyeUZyb21JU1IgKGhUYXNrLCAwLCBlTm9BY3Rpb24sICZyZmxhZ3MsIE5VTEwpOworCisgICAgICBwb3J0WUlFTERfRlJPTV9JU1IgKHlpZWxkKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAodm9pZCl4VGFza05vdGlmeSAoaFRhc2ssIGZsYWdzLCBlU2V0Qml0cyk7CisgICAgICAodm9pZCl4VGFza05vdGlmeUFuZFF1ZXJ5IChoVGFzaywgMCwgZU5vQWN0aW9uLCAmcmZsYWdzKTsKKyAgICB9CisgIH0KKyAgLyogUmV0dXJuIGZsYWdzIGFmdGVyIHNldHRpbmcgKi8KKyAgcmV0dXJuIChyZmxhZ3MpOworfQorCit1aW50MzJfdCBvc1RocmVhZEZsYWdzQ2xlYXIgKHVpbnQzMl90IGZsYWdzKSB7CisgIFRhc2tIYW5kbGVfdCBoVGFzazsKKyAgdWludDMyX3QgcmZsYWdzLCBjZmxhZ3M7CisKKyAgaWYgKElTX0lSUSgpKSB7CisgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JJU1I7CisgIH0KKyAgZWxzZSBpZiAoKGZsYWdzICYgVEhSRUFEX0ZMQUdTX0lOVkFMSURfQklUUykgIT0gMFUpIHsKKyAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICBlbHNlIHsKKyAgICBoVGFzayA9IHhUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUoKTsKKworICAgIGlmICh4VGFza05vdGlmeUFuZFF1ZXJ5IChoVGFzaywgMCwgZU5vQWN0aW9uLCAmY2ZsYWdzKSA9PSBwZFBBU1MpIHsKKyAgICAgIHJmbGFncyA9IGNmbGFnczsKKyAgICAgIGNmbGFncyAmPSB+ZmxhZ3M7CisKKyAgICAgIGlmICh4VGFza05vdGlmeSAoaFRhc2ssIGNmbGFncywgZVNldFZhbHVlV2l0aE92ZXJ3cml0ZSkgIT0gcGRQQVNTKSB7CisgICAgICAgIHJmbGFncyA9ICh1aW50MzJfdClvc0Vycm9yOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJmbGFncyA9ICh1aW50MzJfdClvc0Vycm9yOworICAgIH0KKyAgfQorCisgIC8qIFJldHVybiBmbGFncyBiZWZvcmUgY2xlYXJpbmcgKi8KKyAgcmV0dXJuIChyZmxhZ3MpOworfQorCit1aW50MzJfdCBvc1RocmVhZEZsYWdzR2V0ICh2b2lkKSB7CisgIFRhc2tIYW5kbGVfdCBoVGFzazsKKyAgdWludDMyX3QgcmZsYWdzOworCisgIGlmIChJU19JUlEoKSkgeworICAgIHJmbGFncyA9ICh1aW50MzJfdClvc0Vycm9ySVNSOworICB9CisgIGVsc2UgeworICAgIGhUYXNrID0geFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSgpOworCisgICAgaWYgKHhUYXNrTm90aWZ5QW5kUXVlcnkgKGhUYXNrLCAwLCBlTm9BY3Rpb24sICZyZmxhZ3MpICE9IHBkUEFTUykgeworICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3I7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChyZmxhZ3MpOworfQorCit1aW50MzJfdCBvc1RocmVhZEZsYWdzV2FpdCAodWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IG9wdGlvbnMsIHVpbnQzMl90IHRpbWVvdXQpIHsKKyAgdWludDMyX3QgcmZsYWdzLCBudmFsOworICB1aW50MzJfdCBjbGVhcjsKKyAgVGlja1R5cGVfdCB0MCwgdGQsIHRvdXQ7CisgIEJhc2VUeXBlX3QgcnZhbDsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIGlmICgoZmxhZ3MgJiBUSFJFQURfRkxBR1NfSU5WQUxJRF9CSVRTKSAhPSAwVSkgeworICAgIHJmbGFncyA9ICh1aW50MzJfdClvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIGVsc2UgeworICAgIGlmICgob3B0aW9ucyAmIG9zRmxhZ3NOb0NsZWFyKSA9PSBvc0ZsYWdzTm9DbGVhcikgeworICAgICAgY2xlYXIgPSAwVTsKKyAgICB9IGVsc2UgeworICAgICAgY2xlYXIgPSBmbGFnczsKKyAgICB9CisKKyAgICByZmxhZ3MgPSAwVTsKKyAgICB0b3V0ICAgPSB0aW1lb3V0OworCisgICAgdDAgPSB4VGFza0dldFRpY2tDb3VudCgpOworICAgIGRvIHsKKyAgICAgIHJ2YWwgPSB4VGFza05vdGlmeVdhaXQgKDAsIGNsZWFyLCAmbnZhbCwgdG91dCk7CisKKyAgICAgIGlmIChydmFsID09IHBkUEFTUykgeworICAgICAgICByZmxhZ3MgJj0gZmxhZ3M7CisgICAgICAgIHJmbGFncyB8PSBudmFsOworCisgICAgICAgIGlmICgob3B0aW9ucyAmIG9zRmxhZ3NXYWl0QWxsKSA9PSBvc0ZsYWdzV2FpdEFsbCkgeworICAgICAgICAgIGlmICgoZmxhZ3MgJiByZmxhZ3MpID09IGZsYWdzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gMFUpIHsKKyAgICAgICAgICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JSZXNvdXJjZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICgoZmxhZ3MgJiByZmxhZ3MpICE9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodGltZW91dCA9PSAwVSkgeworICAgICAgICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclJlc291cmNlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgdGltZW91dCAqLworICAgICAgICB0ZCA9IHhUYXNrR2V0VGlja0NvdW50KCkgLSB0MDsKKworICAgICAgICBpZiAodGQgPiB0b3V0KSB7CisgICAgICAgICAgdG91dCAgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRvdXQgLT0gdGQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAodGltZW91dCA9PSAwKSB7CisgICAgICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JSZXNvdXJjZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclRpbWVvdXQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKHJ2YWwgIT0gcGRGQUlMKTsKKyAgfQorCisgIC8qIFJldHVybiBmbGFncyBiZWZvcmUgY2xlYXJpbmcgKi8KKyAgcmV0dXJuIChyZmxhZ3MpOworfQorCitvc1N0YXR1c190IG9zRGVsYXkgKHVpbnQzMl90IHRpY2tzKSB7CisgIG9zU3RhdHVzX3Qgc3RhdDsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBzdGF0ID0gb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIHsKKyAgICBzdGF0ID0gb3NPSzsKKworICAgIGlmICh0aWNrcyAhPSAwVSkgeworICAgICAgdlRhc2tEZWxheSh0aWNrcyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChzdGF0KTsKK30KKworb3NTdGF0dXNfdCBvc0RlbGF5VW50aWwgKHVpbnQzMl90IHRpY2tzKSB7CisgIFRpY2tUeXBlX3QgdGNudDsKKyAgb3NTdGF0dXNfdCBzdGF0OworCisgIGlmIChJU19JUlEoKSkgeworICAgIHN0YXQgPSBvc0Vycm9ySVNSOworICB9CisgIGVsc2UgeworICAgIHN0YXQgPSBvc09LOworICAgIHRjbnQgPSB4VGFza0dldFRpY2tDb3VudCgpOworCisgICAgdlRhc2tEZWxheVVudGlsICgmdGNudCwgKFRpY2tUeXBlX3QpKHRpY2tzIC0gdGNudCkpOworICB9CisKKyAgcmV0dXJuIChzdGF0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBUaW1lckNhbGxiYWNrIChUaW1lckhhbmRsZV90IGhUaW1lcikgeworICBUaW1lckNhbGxiYWNrX3QgKmNhbGxiOworCisgIGNhbGxiID0gKFRpbWVyQ2FsbGJhY2tfdCAqKXB2VGltZXJHZXRUaW1lcklEIChoVGltZXIpOworCisgIGlmIChjYWxsYiAhPSBOVUxMKSB7CisgICAgY2FsbGItPmZ1bmMgKGNhbGxiLT5hcmcpOworICB9Cit9CisKK29zVGltZXJJZF90IG9zVGltZXJOZXcgKG9zVGltZXJGdW5jX3QgZnVuYywgb3NUaW1lclR5cGVfdCB0eXBlLCB2b2lkICphcmd1bWVudCwgY29uc3Qgb3NUaW1lckF0dHJfdCAqYXR0cikgeworICBjb25zdCBjaGFyICpuYW1lOworICBUaW1lckhhbmRsZV90IGhUaW1lcjsKKyAgVGltZXJDYWxsYmFja190ICpjYWxsYjsKKyAgVUJhc2VUeXBlX3QgcmVsb2FkOworICBpbnQzMl90IG1lbTsKKworICBoVGltZXIgPSBOVUxMOworCisgIGlmICghSVNfSVJRKCkgJiYgKGZ1bmMgIT0gTlVMTCkpIHsKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgY2FsbGJhY2sgZnVuY3Rpb24gYW5kIGFyZ3VtZW50ICovCisgICAgY2FsbGIgPSBwdlBvcnRNYWxsb2MgKHNpemVvZihUaW1lckNhbGxiYWNrX3QpKTsKKworICAgIGlmIChjYWxsYiAhPSBOVUxMKSB7CisgICAgICBjYWxsYi0+ZnVuYyA9IGZ1bmM7CisgICAgICBjYWxsYi0+YXJnICA9IGFyZ3VtZW50OworCisgICAgICBpZiAodHlwZSA9PSBvc1RpbWVyT25jZSkgeworICAgICAgICByZWxvYWQgPSBwZEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVsb2FkID0gcGRUUlVFOworICAgICAgfQorCisgICAgICBtZW0gID0gLTE7CisgICAgICBuYW1lID0gTlVMTDsKKworICAgICAgaWYgKGF0dHIgIT0gTlVMTCkgeworICAgICAgICBpZiAoYXR0ci0+bmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgbmFtZSA9IGF0dHItPm5hbWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGF0dHItPmNiX21lbSAhPSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSA+PSBzaXplb2YoU3RhdGljVGltZXJfdCkpKSB7CisgICAgICAgICAgbWVtID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAoKGF0dHItPmNiX21lbSA9PSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSA9PSAwVSkpIHsKKyAgICAgICAgICAgIG1lbSA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgbWVtID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKG1lbSA9PSAxKSB7CisgICAgICAgIGhUaW1lciA9IHhUaW1lckNyZWF0ZVN0YXRpYyAobmFtZSwgMSwgcmVsb2FkLCBjYWxsYiwgVGltZXJDYWxsYmFjaywgKFN0YXRpY1RpbWVyX3QgKilhdHRyLT5jYl9tZW0pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmIChtZW0gPT0gMCkgeworICAgICAgICAgIGhUaW1lciA9IHhUaW1lckNyZWF0ZSAobmFtZSwgMSwgcmVsb2FkLCBjYWxsYiwgVGltZXJDYWxsYmFjayk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gKChvc1RpbWVySWRfdCloVGltZXIpOworfQorCitjb25zdCBjaGFyICpvc1RpbWVyR2V0TmFtZSAob3NUaW1lcklkX3QgdGltZXJfaWQpIHsKKyAgVGltZXJIYW5kbGVfdCBoVGltZXIgPSAoVGltZXJIYW5kbGVfdCl0aW1lcl9pZDsKKyAgY29uc3QgY2hhciAqcDsKKworICBpZiAoSVNfSVJRKCkgfHwgKGhUaW1lciA9PSBOVUxMKSkgeworICAgIHAgPSBOVUxMOworICB9IGVsc2UgeworICAgIHAgPSBwY1RpbWVyR2V0TmFtZSAoaFRpbWVyKTsKKyAgfQorCisgIHJldHVybiAocCk7Cit9CisKK29zU3RhdHVzX3Qgb3NUaW1lclN0YXJ0IChvc1RpbWVySWRfdCB0aW1lcl9pZCwgdWludDMyX3QgdGlja3MpIHsKKyAgVGltZXJIYW5kbGVfdCBoVGltZXIgPSAoVGltZXJIYW5kbGVfdCl0aW1lcl9pZDsKKyAgb3NTdGF0dXNfdCBzdGF0OworCisgIGlmIChJU19JUlEoKSkgeworICAgIHN0YXQgPSBvc0Vycm9ySVNSOworICB9CisgIGVsc2UgaWYgKGhUaW1lciA9PSBOVUxMKSB7CisgICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKHhUaW1lckNoYW5nZVBlcmlvZCAoaFRpbWVyLCB0aWNrcywgMCkgPT0gcGRQQVNTKSB7CisgICAgICBzdGF0ID0gb3NPSzsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gKHN0YXQpOworfQorCitvc1N0YXR1c190IG9zVGltZXJTdG9wIChvc1RpbWVySWRfdCB0aW1lcl9pZCkgeworICBUaW1lckhhbmRsZV90IGhUaW1lciA9IChUaW1lckhhbmRsZV90KXRpbWVyX2lkOworICBvc1N0YXR1c190IHN0YXQ7CisKKyAgaWYgKElTX0lSUSgpKSB7CisgICAgc3RhdCA9IG9zRXJyb3JJU1I7CisgIH0KKyAgZWxzZSBpZiAoaFRpbWVyID09IE5VTEwpIHsKKyAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoeFRpbWVySXNUaW1lckFjdGl2ZSAoaFRpbWVyKSA9PSBwZEZBTFNFKSB7CisgICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmICh4VGltZXJTdG9wIChoVGltZXIsIDApID09IHBkUEFTUykgeworICAgICAgICBzdGF0ID0gb3NPSzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXQgPSBvc0Vycm9yOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAoc3RhdCk7Cit9CisKK3VpbnQzMl90IG9zVGltZXJJc1J1bm5pbmcgKG9zVGltZXJJZF90IHRpbWVyX2lkKSB7CisgIFRpbWVySGFuZGxlX3QgaFRpbWVyID0gKFRpbWVySGFuZGxlX3QpdGltZXJfaWQ7CisgIHVpbnQzMl90IHJ1bm5pbmc7CisKKyAgaWYgKElTX0lSUSgpIHx8IChoVGltZXIgPT0gTlVMTCkpIHsKKyAgICBydW5uaW5nID0gMFU7CisgIH0gZWxzZSB7CisgICAgcnVubmluZyA9ICh1aW50MzJfdCl4VGltZXJJc1RpbWVyQWN0aXZlIChoVGltZXIpOworICB9CisKKyAgcmV0dXJuIChydW5uaW5nKTsKK30KKworb3NTdGF0dXNfdCBvc1RpbWVyRGVsZXRlIChvc1RpbWVySWRfdCB0aW1lcl9pZCkgeworICBUaW1lckhhbmRsZV90IGhUaW1lciA9IChUaW1lckhhbmRsZV90KXRpbWVyX2lkOworICBvc1N0YXR1c190IHN0YXQ7CisjaWZuZGVmIFVTRV9GcmVlUlRPU19IRUFQXzEKKyAgVGltZXJDYWxsYmFja190ICpjYWxsYjsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBzdGF0ID0gb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIGlmIChoVGltZXIgPT0gTlVMTCkgeworICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIGVsc2UgeworICAgIGNhbGxiID0gKFRpbWVyQ2FsbGJhY2tfdCAqKXB2VGltZXJHZXRUaW1lcklEIChoVGltZXIpOworCisgICAgaWYgKHhUaW1lckRlbGV0ZSAoaFRpbWVyLCAwKSA9PSBwZFBBU1MpIHsKKyAgICAgIHZQb3J0RnJlZSAoY2FsbGIpOworICAgICAgc3RhdCA9IG9zT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXQgPSBvc0Vycm9yUmVzb3VyY2U7CisgICAgfQorICB9CisjZWxzZQorICBzdGF0ID0gb3NFcnJvcjsKKyNlbmRpZgorCisgIHJldHVybiAoc3RhdCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworb3NFdmVudEZsYWdzSWRfdCBvc0V2ZW50RmxhZ3NOZXcgKGNvbnN0IG9zRXZlbnRGbGFnc0F0dHJfdCAqYXR0cikgeworICBFdmVudEdyb3VwSGFuZGxlX3QgaEV2ZW50R3JvdXA7CisgIGludDMyX3QgbWVtOworCisgIGhFdmVudEdyb3VwID0gTlVMTDsKKworICBpZiAoIUlTX0lSUSgpKSB7CisgICAgbWVtID0gLTE7CisKKyAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CisgICAgICBpZiAoKGF0dHItPmNiX21lbSAhPSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSA+PSBzaXplb2YoU3RhdGljRXZlbnRHcm91cF90KSkpIHsKKyAgICAgICAgbWVtID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoKGF0dHItPmNiX21lbSA9PSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSA9PSAwVSkpIHsKKyAgICAgICAgICBtZW0gPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgbWVtID0gMDsKKyAgICB9CisKKyAgICBpZiAobWVtID09IDEpIHsKKyAgICAgIGhFdmVudEdyb3VwID0geEV2ZW50R3JvdXBDcmVhdGVTdGF0aWMgKGF0dHItPmNiX21lbSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKG1lbSA9PSAwKSB7CisgICAgICAgIGhFdmVudEdyb3VwID0geEV2ZW50R3JvdXBDcmVhdGUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gKChvc0V2ZW50RmxhZ3NJZF90KWhFdmVudEdyb3VwKTsKK30KKwordWludDMyX3Qgb3NFdmVudEZsYWdzU2V0IChvc0V2ZW50RmxhZ3NJZF90IGVmX2lkLCB1aW50MzJfdCBmbGFncykgeworICBFdmVudEdyb3VwSGFuZGxlX3QgaEV2ZW50R3JvdXAgPSAoRXZlbnRHcm91cEhhbmRsZV90KWVmX2lkOworICB1aW50MzJfdCByZmxhZ3M7CisgIEJhc2VUeXBlX3QgeWllbGQ7CisKKyAgaWYgKChoRXZlbnRHcm91cCA9PSBOVUxMKSB8fCAoKGZsYWdzICYgRVZFTlRfRkxBR1NfSU5WQUxJRF9CSVRTKSAhPSAwVSkpIHsKKyAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICBlbHNlIGlmIChJU19JUlEoKSkgeworICAgIHlpZWxkID0gcGRGQUxTRTsKKworICAgIGlmICh4RXZlbnRHcm91cFNldEJpdHNGcm9tSVNSIChoRXZlbnRHcm91cCwgKEV2ZW50Qml0c190KWZsYWdzLCAmeWllbGQpICE9IHBkRkFJTCkgeworICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JSZXNvdXJjZTsKKyAgICB9IGVsc2UgeworICAgICAgcmZsYWdzID0gZmxhZ3M7CisgICAgICBwb3J0WUlFTERfRlJPTV9JU1IgKHlpZWxkKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgcmZsYWdzID0geEV2ZW50R3JvdXBTZXRCaXRzIChoRXZlbnRHcm91cCwgKEV2ZW50Qml0c190KWZsYWdzKTsKKyAgfQorCisgIHJldHVybiAocmZsYWdzKTsKK30KKwordWludDMyX3Qgb3NFdmVudEZsYWdzQ2xlYXIgKG9zRXZlbnRGbGFnc0lkX3QgZWZfaWQsIHVpbnQzMl90IGZsYWdzKSB7CisgIEV2ZW50R3JvdXBIYW5kbGVfdCBoRXZlbnRHcm91cCA9IChFdmVudEdyb3VwSGFuZGxlX3QpZWZfaWQ7CisgIHVpbnQzMl90IHJmbGFnczsKKworICBpZiAoKGhFdmVudEdyb3VwID09IE5VTEwpIHx8ICgoZmxhZ3MgJiBFVkVOVF9GTEFHU19JTlZBTElEX0JJVFMpICE9IDBVKSkgeworICAgIHJmbGFncyA9ICh1aW50MzJfdClvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIGVsc2UgaWYgKElTX0lSUSgpKSB7CisgICAgcmZsYWdzID0geEV2ZW50R3JvdXBHZXRCaXRzRnJvbUlTUiAoaEV2ZW50R3JvdXApOworCisgICAgaWYgKHhFdmVudEdyb3VwQ2xlYXJCaXRzRnJvbUlTUiAoaEV2ZW50R3JvdXAsIChFdmVudEJpdHNfdClmbGFncykgPT0gcGRGQUlMKSB7CisgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclJlc291cmNlOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICByZmxhZ3MgPSB4RXZlbnRHcm91cENsZWFyQml0cyAoaEV2ZW50R3JvdXAsIChFdmVudEJpdHNfdClmbGFncyk7CisgIH0KKworICByZXR1cm4gKHJmbGFncyk7Cit9CisKK3VpbnQzMl90IG9zRXZlbnRGbGFnc0dldCAob3NFdmVudEZsYWdzSWRfdCBlZl9pZCkgeworICBFdmVudEdyb3VwSGFuZGxlX3QgaEV2ZW50R3JvdXAgPSAoRXZlbnRHcm91cEhhbmRsZV90KWVmX2lkOworICB1aW50MzJfdCByZmxhZ3M7CisKKyAgaWYgKGVmX2lkID09IE5VTEwpIHsKKyAgICByZmxhZ3MgPSAwVTsKKyAgfQorICBlbHNlIGlmIChJU19JUlEoKSkgeworICAgIHJmbGFncyA9IHhFdmVudEdyb3VwR2V0Qml0c0Zyb21JU1IgKGhFdmVudEdyb3VwKTsKKyAgfQorICBlbHNlIHsKKyAgICByZmxhZ3MgPSB4RXZlbnRHcm91cEdldEJpdHMgKGhFdmVudEdyb3VwKTsKKyAgfQorCisgIHJldHVybiAocmZsYWdzKTsKK30KKwordWludDMyX3Qgb3NFdmVudEZsYWdzV2FpdCAob3NFdmVudEZsYWdzSWRfdCBlZl9pZCwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IG9wdGlvbnMsIHVpbnQzMl90IHRpbWVvdXQpIHsKKyAgRXZlbnRHcm91cEhhbmRsZV90IGhFdmVudEdyb3VwID0gKEV2ZW50R3JvdXBIYW5kbGVfdCllZl9pZDsKKyAgQmFzZVR5cGVfdCB3YWl0X2FsbDsKKyAgQmFzZVR5cGVfdCBleGl0X2NscjsKKyAgdWludDMyX3QgcmZsYWdzOworCisgIGlmICgoaEV2ZW50R3JvdXAgPT0gTlVMTCkgfHwgKChmbGFncyAmIEVWRU5UX0ZMQUdTX0lOVkFMSURfQklUUykgIT0gMFUpKSB7CisgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgZWxzZSBpZiAoSVNfSVJRKCkpIHsKKyAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAob3B0aW9ucyAmIG9zRmxhZ3NXYWl0QWxsKSB7CisgICAgICB3YWl0X2FsbCA9IHBkVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgd2FpdF9hbGwgPSBwZEZBSUw7CisgICAgfQorCisgICAgaWYgKG9wdGlvbnMgJiBvc0ZsYWdzTm9DbGVhcikgeworICAgICAgZXhpdF9jbHIgPSBwZEZBSUw7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4aXRfY2xyID0gcGRUUlVFOworICAgIH0KKworICAgIHJmbGFncyA9IHhFdmVudEdyb3VwV2FpdEJpdHMgKGhFdmVudEdyb3VwLCAoRXZlbnRCaXRzX3QpZmxhZ3MsIGV4aXRfY2xyLCB3YWl0X2FsbCwgKFRpY2tUeXBlX3QpdGltZW91dCk7CisKKyAgICBpZiAob3B0aW9ucyAmIG9zRmxhZ3NXYWl0QWxsKSB7CisgICAgICBpZiAoZmxhZ3MgIT0gcmZsYWdzKSB7CisgICAgICAgIGlmICh0aW1lb3V0ID4gMFUpIHsKKyAgICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclRpbWVvdXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JSZXNvdXJjZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmICgoZmxhZ3MgJiByZmxhZ3MpID09IDBVKSB7CisgICAgICAgIGlmICh0aW1lb3V0ID4gMFUpIHsKKyAgICAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclRpbWVvdXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmZsYWdzID0gKHVpbnQzMl90KW9zRXJyb3JSZXNvdXJjZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAocmZsYWdzKTsKK30KKworb3NTdGF0dXNfdCBvc0V2ZW50RmxhZ3NEZWxldGUgKG9zRXZlbnRGbGFnc0lkX3QgZWZfaWQpIHsKKyAgRXZlbnRHcm91cEhhbmRsZV90IGhFdmVudEdyb3VwID0gKEV2ZW50R3JvdXBIYW5kbGVfdCllZl9pZDsKKyAgb3NTdGF0dXNfdCBzdGF0OworCisjaWZuZGVmIFVTRV9GcmVlUlRPU19IRUFQXzEKKyAgaWYgKElTX0lSUSgpKSB7CisgICAgc3RhdCA9IG9zRXJyb3JJU1I7CisgIH0KKyAgZWxzZSBpZiAoaEV2ZW50R3JvdXAgPT0gTlVMTCkgeworICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIGVsc2UgeworICAgIHN0YXQgPSBvc09LOworICAgIHZFdmVudEdyb3VwRGVsZXRlIChoRXZlbnRHcm91cCk7CisgIH0KKyNlbHNlCisgIHN0YXQgPSBvc0Vycm9yOworI2VuZGlmCisKKyAgcmV0dXJuIChzdGF0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitvc011dGV4SWRfdCBvc011dGV4TmV3IChjb25zdCBvc011dGV4QXR0cl90ICphdHRyKSB7CisgIFNlbWFwaG9yZUhhbmRsZV90IGhNdXRleDsKKyAgdWludDMyX3QgdHlwZTsKKyAgdWludDMyX3Qgcm10eDsKKyAgaW50MzJfdCAgbWVtOworICAjaWYgKGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwKQorICBjb25zdCBjaGFyICpuYW1lOworICAjZW5kaWYKKworICBoTXV0ZXggPSBOVUxMOworCisgIGlmICghSVNfSVJRKCkpIHsKKyAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CisgICAgICB0eXBlID0gYXR0ci0+YXR0cl9iaXRzOworICAgIH0gZWxzZSB7CisgICAgICB0eXBlID0gMFU7CisgICAgfQorCisgICAgaWYgKCh0eXBlICYgb3NNdXRleFJlY3Vyc2l2ZSkgPT0gb3NNdXRleFJlY3Vyc2l2ZSkgeworICAgICAgcm10eCA9IDFVOworICAgIH0gZWxzZSB7CisgICAgICBybXR4ID0gMFU7CisgICAgfQorCisgICAgaWYgKCh0eXBlICYgb3NNdXRleFJvYnVzdCkgIT0gb3NNdXRleFJvYnVzdCkgeworICAgICAgbWVtID0gLTE7CisKKyAgICAgIGlmIChhdHRyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKChhdHRyLT5jYl9tZW0gIT0gTlVMTCkgJiYgKGF0dHItPmNiX3NpemUgPj0gc2l6ZW9mKFN0YXRpY1NlbWFwaG9yZV90KSkpIHsKKyAgICAgICAgICBtZW0gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmICgoYXR0ci0+Y2JfbWVtID09IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID09IDBVKSkgeworICAgICAgICAgICAgbWVtID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBtZW0gPSAwOworICAgICAgfQorCisgICAgICBpZiAobWVtID09IDEpIHsKKyAgICAgICAgaWYgKHJtdHggIT0gMFUpIHsKKyAgICAgICAgICBoTXV0ZXggPSB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXhTdGF0aWMgKGF0dHItPmNiX21lbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaE11dGV4ID0geFNlbWFwaG9yZUNyZWF0ZU11dGV4U3RhdGljIChhdHRyLT5jYl9tZW0pOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKG1lbSA9PSAwKSB7CisgICAgICAgICAgaWYgKHJtdHggIT0gMFUpIHsKKyAgICAgICAgICAgIGhNdXRleCA9IHhTZW1hcGhvcmVDcmVhdGVSZWN1cnNpdmVNdXRleCAoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaE11dGV4ID0geFNlbWFwaG9yZUNyZWF0ZU11dGV4ICgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAjaWYgKGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwKQorICAgICAgaWYgKGhNdXRleCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhdHRyICE9IE5VTEwpIHsKKyAgICAgICAgICBuYW1lID0gYXR0ci0+bmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuYW1lID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2UXVldWVBZGRUb1JlZ2lzdHJ5IChoTXV0ZXgsIG5hbWUpOworICAgICAgfQorICAgICAgI2VuZGlmCisKKyAgICAgIGlmICgoaE11dGV4ICE9IE5VTEwpICYmIChybXR4ICE9IDBVKSkgeworICAgICAgICBoTXV0ZXggPSAoU2VtYXBob3JlSGFuZGxlX3QpKCh1aW50MzJfdCloTXV0ZXggfCAxVSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuICgob3NNdXRleElkX3QpaE11dGV4KTsKK30KKworb3NTdGF0dXNfdCBvc011dGV4QWNxdWlyZSAob3NNdXRleElkX3QgbXV0ZXhfaWQsIHVpbnQzMl90IHRpbWVvdXQpIHsKKyAgU2VtYXBob3JlSGFuZGxlX3QgaE11dGV4OworICBvc1N0YXR1c190IHN0YXQ7CisgIHVpbnQzMl90IHJtdHg7CisKKyAgaE11dGV4ID0gKFNlbWFwaG9yZUhhbmRsZV90KSgodWludDMyX3QpbXV0ZXhfaWQgJiB+MVUpOworCisgIHJtdHggPSAodWludDMyX3QpbXV0ZXhfaWQgJiAxVTsKKworICBzdGF0ID0gb3NPSzsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBzdGF0ID0gb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIGlmIChoTXV0ZXggPT0gTlVMTCkgeworICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIGVsc2UgeworICAgIGlmIChybXR4ICE9IDBVKSB7CisgICAgICBpZiAoeFNlbWFwaG9yZVRha2VSZWN1cnNpdmUgKGhNdXRleCwgdGltZW91dCkgIT0gcGRQQVNTKSB7CisgICAgICAgIGlmICh0aW1lb3V0ICE9IDBVKSB7CisgICAgICAgICAgc3RhdCA9IG9zRXJyb3JUaW1lb3V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0YXQgPSBvc0Vycm9yUmVzb3VyY2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoeFNlbWFwaG9yZVRha2UgKGhNdXRleCwgdGltZW91dCkgIT0gcGRQQVNTKSB7CisgICAgICAgIGlmICh0aW1lb3V0ICE9IDBVKSB7CisgICAgICAgICAgc3RhdCA9IG9zRXJyb3JUaW1lb3V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0YXQgPSBvc0Vycm9yUmVzb3VyY2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gKHN0YXQpOworfQorCitvc1N0YXR1c190IG9zTXV0ZXhSZWxlYXNlIChvc011dGV4SWRfdCBtdXRleF9pZCkgeworICBTZW1hcGhvcmVIYW5kbGVfdCBoTXV0ZXg7CisgIG9zU3RhdHVzX3Qgc3RhdDsKKyAgdWludDMyX3Qgcm10eDsKKworICBoTXV0ZXggPSAoU2VtYXBob3JlSGFuZGxlX3QpKCh1aW50MzJfdCltdXRleF9pZCAmIH4xVSk7CisKKyAgcm10eCA9ICh1aW50MzJfdCltdXRleF9pZCAmIDFVOworCisgIHN0YXQgPSBvc09LOworCisgIGlmIChJU19JUlEoKSkgeworICAgIHN0YXQgPSBvc0Vycm9ySVNSOworICB9CisgIGVsc2UgaWYgKGhNdXRleCA9PSBOVUxMKSB7CisgICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKHJtdHggIT0gMFUpIHsKKyAgICAgIGlmICh4U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSAoaE11dGV4KSAhPSBwZFBBU1MpIHsKKyAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoeFNlbWFwaG9yZUdpdmUgKGhNdXRleCkgIT0gcGRQQVNTKSB7CisgICAgICAgIHN0YXQgPSBvc0Vycm9yUmVzb3VyY2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIChzdGF0KTsKK30KKworb3NUaHJlYWRJZF90IG9zTXV0ZXhHZXRPd25lciAob3NNdXRleElkX3QgbXV0ZXhfaWQpIHsKKyAgU2VtYXBob3JlSGFuZGxlX3QgaE11dGV4OworICBvc1RocmVhZElkX3Qgb3duZXI7CisKKyAgaE11dGV4ID0gKFNlbWFwaG9yZUhhbmRsZV90KSgodWludDMyX3QpbXV0ZXhfaWQgJiB+MVUpOworCisgIGlmIChJU19JUlEoKSB8fCAoaE11dGV4ID09IE5VTEwpKSB7CisgICAgb3duZXIgPSBOVUxMOworICB9IGVsc2UgeworICAgIG93bmVyID0gKG9zVGhyZWFkSWRfdCl4U2VtYXBob3JlR2V0TXV0ZXhIb2xkZXIgKGhNdXRleCk7CisgIH0KKworICByZXR1cm4gKG93bmVyKTsKK30KKworb3NTdGF0dXNfdCBvc011dGV4RGVsZXRlIChvc011dGV4SWRfdCBtdXRleF9pZCkgeworICBvc1N0YXR1c190IHN0YXQ7CisjaWZuZGVmIFVTRV9GcmVlUlRPU19IRUFQXzEKKyAgU2VtYXBob3JlSGFuZGxlX3QgaE11dGV4OworCisgIGhNdXRleCA9IChTZW1hcGhvcmVIYW5kbGVfdCkoKHVpbnQzMl90KW11dGV4X2lkICYgfjFVKTsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBzdGF0ID0gb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIGlmIChoTXV0ZXggPT0gTlVMTCkgeworICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIGVsc2UgeworICAgICNpZiAoY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDApCisgICAgdlF1ZXVlVW5yZWdpc3RlclF1ZXVlIChoTXV0ZXgpOworICAgICNlbmRpZgorICAgIHN0YXQgPSBvc09LOworICAgIHZTZW1hcGhvcmVEZWxldGUgKGhNdXRleCk7CisgIH0KKyNlbHNlCisgIHN0YXQgPSBvc0Vycm9yOworI2VuZGlmCisKKyAgcmV0dXJuIChzdGF0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitvc1NlbWFwaG9yZUlkX3Qgb3NTZW1hcGhvcmVOZXcgKHVpbnQzMl90IG1heF9jb3VudCwgdWludDMyX3QgaW5pdGlhbF9jb3VudCwgY29uc3Qgb3NTZW1hcGhvcmVBdHRyX3QgKmF0dHIpIHsKKyAgU2VtYXBob3JlSGFuZGxlX3QgaFNlbWFwaG9yZTsKKyAgaW50MzJfdCBtZW07CisgICNpZiAoY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDApCisgIGNvbnN0IGNoYXIgKm5hbWU7CisgICNlbmRpZgorCisgIGhTZW1hcGhvcmUgPSBOVUxMOworCisgIGlmICghSVNfSVJRKCkgJiYgKG1heF9jb3VudCA+IDBVKSAmJiAoaW5pdGlhbF9jb3VudCA8PSBtYXhfY291bnQpKSB7CisgICAgbWVtID0gLTE7CisKKyAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CisgICAgICBpZiAoKGF0dHItPmNiX21lbSAhPSBOVUxMKSAmJiAoYXR0ci0+Y2Jfc2l6ZSA+PSBzaXplb2YoU3RhdGljU2VtYXBob3JlX3QpKSkgeworICAgICAgICBtZW0gPSAxOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmICgoYXR0ci0+Y2JfbWVtID09IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID09IDBVKSkgeworICAgICAgICAgIG1lbSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBtZW0gPSAwOworICAgIH0KKworICAgIGlmIChtZW0gIT0gLTEpIHsKKyAgICAgIGlmIChtYXhfY291bnQgPT0gMVUpIHsKKyAgICAgICAgaWYgKG1lbSA9PSAxKSB7CisgICAgICAgICAgaFNlbWFwaG9yZSA9IHhTZW1hcGhvcmVDcmVhdGVCaW5hcnlTdGF0aWMgKChTdGF0aWNTZW1hcGhvcmVfdCAqKWF0dHItPmNiX21lbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaFNlbWFwaG9yZSA9IHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoaFNlbWFwaG9yZSAhPSBOVUxMKSAmJiAoaW5pdGlhbF9jb3VudCAhPSAwVSkpIHsKKyAgICAgICAgICBpZiAoeFNlbWFwaG9yZUdpdmUgKGhTZW1hcGhvcmUpICE9IHBkUEFTUykgeworICAgICAgICAgICAgdlNlbWFwaG9yZURlbGV0ZSAoaFNlbWFwaG9yZSk7CisgICAgICAgICAgICBoU2VtYXBob3JlID0gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAobWVtID09IDEpIHsKKyAgICAgICAgICBoU2VtYXBob3JlID0geFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nU3RhdGljIChtYXhfY291bnQsIGluaXRpYWxfY291bnQsIChTdGF0aWNTZW1hcGhvcmVfdCAqKWF0dHItPmNiX21lbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaFNlbWFwaG9yZSA9IHhTZW1hcGhvcmVDcmVhdGVDb3VudGluZyAobWF4X2NvdW50LCBpbml0aWFsX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAjaWYgKGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwKQorICAgICAgaWYgKGhTZW1hcGhvcmUgIT0gTlVMTCkgeworICAgICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CisgICAgICAgICAgbmFtZSA9IGF0dHItPm5hbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmFtZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdlF1ZXVlQWRkVG9SZWdpc3RyeSAoaFNlbWFwaG9yZSwgbmFtZSk7CisgICAgICB9CisgICAgICAjZW5kaWYKKyAgICB9CisgIH0KKworICByZXR1cm4gKChvc1NlbWFwaG9yZUlkX3QpaFNlbWFwaG9yZSk7Cit9CisKK29zU3RhdHVzX3Qgb3NTZW1hcGhvcmVBY3F1aXJlIChvc1NlbWFwaG9yZUlkX3Qgc2VtYXBob3JlX2lkLCB1aW50MzJfdCB0aW1lb3V0KSB7CisgIFNlbWFwaG9yZUhhbmRsZV90IGhTZW1hcGhvcmUgPSAoU2VtYXBob3JlSGFuZGxlX3Qpc2VtYXBob3JlX2lkOworICBvc1N0YXR1c190IHN0YXQ7CisgIEJhc2VUeXBlX3QgeWllbGQ7CisKKyAgc3RhdCA9IG9zT0s7CisKKyAgaWYgKGhTZW1hcGhvcmUgPT0gTlVMTCkgeworICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIGVsc2UgaWYgKElTX0lSUSgpKSB7CisgICAgaWYgKHRpbWVvdXQgIT0gMFUpIHsKKyAgICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHlpZWxkID0gcGRGQUxTRTsKKworICAgICAgaWYgKHhTZW1hcGhvcmVUYWtlRnJvbUlTUiAoaFNlbWFwaG9yZSwgJnlpZWxkKSAhPSBwZFBBU1MpIHsKKyAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBvcnRZSUVMRF9GUk9NX0lTUiAoeWllbGQpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBpZiAoeFNlbWFwaG9yZVRha2UgKGhTZW1hcGhvcmUsIChUaWNrVHlwZV90KXRpbWVvdXQpICE9IHBkUEFTUykgeworICAgICAgaWYgKHRpbWVvdXQgIT0gMFUpIHsKKyAgICAgICAgc3RhdCA9IG9zRXJyb3JUaW1lb3V0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gKHN0YXQpOworfQorCitvc1N0YXR1c190IG9zU2VtYXBob3JlUmVsZWFzZSAob3NTZW1hcGhvcmVJZF90IHNlbWFwaG9yZV9pZCkgeworICBTZW1hcGhvcmVIYW5kbGVfdCBoU2VtYXBob3JlID0gKFNlbWFwaG9yZUhhbmRsZV90KXNlbWFwaG9yZV9pZDsKKyAgb3NTdGF0dXNfdCBzdGF0OworICBCYXNlVHlwZV90IHlpZWxkOworCisgIHN0YXQgPSBvc09LOworCisgIGlmIChoU2VtYXBob3JlID09IE5VTEwpIHsKKyAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICBlbHNlIGlmIChJU19JUlEoKSkgeworICAgIHlpZWxkID0gcGRGQUxTRTsKKworICAgIGlmICh4U2VtYXBob3JlR2l2ZUZyb21JU1IgKGhTZW1hcGhvcmUsICZ5aWVsZCkgIT0gcGRUUlVFKSB7CisgICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOworICAgIH0gZWxzZSB7CisgICAgICBwb3J0WUlFTERfRlJPTV9JU1IgKHlpZWxkKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKHhTZW1hcGhvcmVHaXZlIChoU2VtYXBob3JlKSAhPSBwZFBBU1MpIHsKKyAgICAgIHN0YXQgPSBvc0Vycm9yUmVzb3VyY2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIChzdGF0KTsKK30KKwordWludDMyX3Qgb3NTZW1hcGhvcmVHZXRDb3VudCAob3NTZW1hcGhvcmVJZF90IHNlbWFwaG9yZV9pZCkgeworICBTZW1hcGhvcmVIYW5kbGVfdCBoU2VtYXBob3JlID0gKFNlbWFwaG9yZUhhbmRsZV90KXNlbWFwaG9yZV9pZDsKKyAgdWludDMyX3QgY291bnQ7CisKKyAgaWYgKGhTZW1hcGhvcmUgPT0gTlVMTCkgeworICAgIGNvdW50ID0gMFU7CisgIH0KKyAgZWxzZSBpZiAoSVNfSVJRKCkpIHsKKyAgICBjb3VudCA9IHV4UXVldWVNZXNzYWdlc1dhaXRpbmdGcm9tSVNSIChoU2VtYXBob3JlKTsKKyAgfSBlbHNlIHsKKyAgICBjb3VudCA9ICh1aW50MzJfdCl1eFNlbWFwaG9yZUdldENvdW50IChoU2VtYXBob3JlKTsKKyAgfQorCisgIHJldHVybiAoY291bnQpOworfQorCitvc1N0YXR1c190IG9zU2VtYXBob3JlRGVsZXRlIChvc1NlbWFwaG9yZUlkX3Qgc2VtYXBob3JlX2lkKSB7CisgIFNlbWFwaG9yZUhhbmRsZV90IGhTZW1hcGhvcmUgPSAoU2VtYXBob3JlSGFuZGxlX3Qpc2VtYXBob3JlX2lkOworICBvc1N0YXR1c190IHN0YXQ7CisKKyNpZm5kZWYgVVNFX0ZyZWVSVE9TX0hFQVBfMQorICBpZiAoSVNfSVJRKCkpIHsKKyAgICBzdGF0ID0gb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIGlmIChoU2VtYXBob3JlID09IE5VTEwpIHsKKyAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKKyAgfQorICBlbHNlIHsKKyAgICAjaWYgKGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwKQorICAgIHZRdWV1ZVVucmVnaXN0ZXJRdWV1ZSAoaFNlbWFwaG9yZSk7CisgICAgI2VuZGlmCisKKyAgICBzdGF0ID0gb3NPSzsKKyAgICB2U2VtYXBob3JlRGVsZXRlIChoU2VtYXBob3JlKTsKKyAgfQorI2Vsc2UKKyAgc3RhdCA9IG9zRXJyb3I7CisjZW5kaWYKKworICByZXR1cm4gKHN0YXQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK29zTWVzc2FnZVF1ZXVlSWRfdCBvc01lc3NhZ2VRdWV1ZU5ldyAodWludDMyX3QgbXNnX2NvdW50LCB1aW50MzJfdCBtc2dfc2l6ZSwgY29uc3Qgb3NNZXNzYWdlUXVldWVBdHRyX3QgKmF0dHIpIHsKKyAgUXVldWVIYW5kbGVfdCBoUXVldWU7CisgIGludDMyX3QgbWVtOworICAjaWYgKGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwKQorICBjb25zdCBjaGFyICpuYW1lOworICAjZW5kaWYKKworICBoUXVldWUgPSBOVUxMOworCisgIGlmICghSVNfSVJRKCkgJiYgKG1zZ19jb3VudCA+IDBVKSAmJiAobXNnX3NpemUgPiAwVSkpIHsKKyAgICBtZW0gPSAtMTsKKworICAgIGlmIChhdHRyICE9IE5VTEwpIHsKKyAgICAgIGlmICgoYXR0ci0+Y2JfbWVtICE9IE5VTEwpICYmIChhdHRyLT5jYl9zaXplID49IHNpemVvZihTdGF0aWNRdWV1ZV90KSkgJiYKKyAgICAgICAgICAoYXR0ci0+bXFfbWVtICE9IE5VTEwpICYmIChhdHRyLT5tcV9zaXplID49IChtc2dfY291bnQgKiBtc2dfc2l6ZSkpKSB7CisgICAgICAgIG1lbSA9IDE7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKChhdHRyLT5jYl9tZW0gPT0gTlVMTCkgJiYgKGF0dHItPmNiX3NpemUgPT0gMFUpICYmCisgICAgICAgICAgICAoYXR0ci0+bXFfbWVtID09IE5VTEwpICYmIChhdHRyLT5tcV9zaXplID09IDBVKSkgeworICAgICAgICAgIG1lbSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBtZW0gPSAwOworICAgIH0KKworICAgIGlmIChtZW0gPT0gMSkgeworICAgICAgaFF1ZXVlID0geFF1ZXVlQ3JlYXRlU3RhdGljIChtc2dfY291bnQsIG1zZ19zaXplLCBhdHRyLT5tcV9tZW0sIGF0dHItPmNiX21lbSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKG1lbSA9PSAwKSB7CisgICAgICAgIGhRdWV1ZSA9IHhRdWV1ZUNyZWF0ZSAobXNnX2NvdW50LCBtc2dfc2l6ZSk7CisgICAgICB9CisgICAgfQorCisgICAgI2lmIChjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFID4gMCkKKyAgICBpZiAoaFF1ZXVlICE9IE5VTEwpIHsKKyAgICAgIGlmIChhdHRyICE9IE5VTEwpIHsKKyAgICAgICAgbmFtZSA9IGF0dHItPm5hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIHZRdWV1ZUFkZFRvUmVnaXN0cnkgKGhRdWV1ZSwgbmFtZSk7CisgICAgfQorICAgICNlbmRpZgorCisgIH0KKworICByZXR1cm4gKChvc01lc3NhZ2VRdWV1ZUlkX3QpaFF1ZXVlKTsKK30KKworb3NTdGF0dXNfdCBvc01lc3NhZ2VRdWV1ZVB1dCAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkLCBjb25zdCB2b2lkICptc2dfcHRyLCB1aW50OF90IG1zZ19wcmlvLCB1aW50MzJfdCB0aW1lb3V0KSB7CisgIFF1ZXVlSGFuZGxlX3QgaFF1ZXVlID0gKFF1ZXVlSGFuZGxlX3QpbXFfaWQ7CisgIG9zU3RhdHVzX3Qgc3RhdDsKKyAgQmFzZVR5cGVfdCB5aWVsZDsKKworICAodm9pZCltc2dfcHJpbzsgLyogTWVzc2FnZSBwcmlvcml0eSBpcyBpZ25vcmVkICovCisKKyAgc3RhdCA9IG9zT0s7CisKKyAgaWYgKElTX0lSUSgpKSB7CisgICAgaWYgKChoUXVldWUgPT0gTlVMTCkgfHwgKG1zZ19wdHIgPT0gTlVMTCkgfHwgKHRpbWVvdXQgIT0gMFUpKSB7CisgICAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB5aWVsZCA9IHBkRkFMU0U7CisKKyAgICAgIGlmICh4UXVldWVTZW5kVG9CYWNrRnJvbUlTUiAoaFF1ZXVlLCBtc2dfcHRyLCAmeWllbGQpICE9IHBkVFJVRSkgeworICAgICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcG9ydFlJRUxEX0ZST01fSVNSICh5aWVsZCk7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmICgoaFF1ZXVlID09IE5VTEwpIHx8IChtc2dfcHRyID09IE5VTEwpKSB7CisgICAgICBzdGF0ID0gb3NFcnJvclBhcmFtZXRlcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpZiAoeFF1ZXVlU2VuZFRvQmFjayAoaFF1ZXVlLCBtc2dfcHRyLCAoVGlja1R5cGVfdCl0aW1lb3V0KSAhPSBwZFBBU1MpIHsKKyAgICAgICAgaWYgKHRpbWVvdXQgIT0gMFUpIHsKKyAgICAgICAgICBzdGF0ID0gb3NFcnJvclRpbWVvdXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdCA9IG9zRXJyb3JSZXNvdXJjZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAoc3RhdCk7Cit9CisKK29zU3RhdHVzX3Qgb3NNZXNzYWdlUXVldWVHZXQgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCwgdm9pZCAqbXNnX3B0ciwgdWludDhfdCAqbXNnX3ByaW8sIHVpbnQzMl90IHRpbWVvdXQpIHsKKyAgUXVldWVIYW5kbGVfdCBoUXVldWUgPSAoUXVldWVIYW5kbGVfdCltcV9pZDsKKyAgb3NTdGF0dXNfdCBzdGF0OworICBCYXNlVHlwZV90IHlpZWxkOworCisgICh2b2lkKW1zZ19wcmlvOyAvKiBNZXNzYWdlIHByaW9yaXR5IGlzIGlnbm9yZWQgKi8KKworICBzdGF0ID0gb3NPSzsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBpZiAoKGhRdWV1ZSA9PSBOVUxMKSB8fCAobXNnX3B0ciA9PSBOVUxMKSB8fCAodGltZW91dCAhPSAwVSkpIHsKKyAgICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHlpZWxkID0gcGRGQUxTRTsKKworICAgICAgaWYgKHhRdWV1ZVJlY2VpdmVGcm9tSVNSIChoUXVldWUsIG1zZ19wdHIsICZ5aWVsZCkgIT0gcGRQQVNTKSB7CisgICAgICAgIHN0YXQgPSBvc0Vycm9yUmVzb3VyY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBwb3J0WUlFTERfRlJPTV9JU1IgKHlpZWxkKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKChoUXVldWUgPT0gTlVMTCkgfHwgKG1zZ19wdHIgPT0gTlVMTCkpIHsKKyAgICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmICh4UXVldWVSZWNlaXZlIChoUXVldWUsIG1zZ19wdHIsIChUaWNrVHlwZV90KXRpbWVvdXQpICE9IHBkUEFTUykgeworICAgICAgICBpZiAodGltZW91dCAhPSAwVSkgeworICAgICAgICAgIHN0YXQgPSBvc0Vycm9yVGltZW91dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGF0ID0gb3NFcnJvclJlc291cmNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIChzdGF0KTsKK30KKwordWludDMyX3Qgb3NNZXNzYWdlUXVldWVHZXRDYXBhY2l0eSAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKSB7CisgIFN0YXRpY1F1ZXVlX3QgKm1xID0gKFN0YXRpY1F1ZXVlX3QgKiltcV9pZDsKKyAgdWludDMyX3QgY2FwYWNpdHk7CisKKyAgaWYgKG1xID09IE5VTEwpIHsKKyAgICBjYXBhY2l0eSA9IDBVOworICB9IGVsc2UgeworICAgIC8qIGNhcGFjaXR5ID0gcHhRdWV1ZS0+dXhMZW5ndGggKi8KKyAgICBjYXBhY2l0eSA9IG1xLT51eER1bW15NFsxXTsKKyAgfQorCisgIHJldHVybiAoY2FwYWNpdHkpOworfQorCit1aW50MzJfdCBvc01lc3NhZ2VRdWV1ZUdldE1zZ1NpemUgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCkgeworICBTdGF0aWNRdWV1ZV90ICptcSA9IChTdGF0aWNRdWV1ZV90ICopbXFfaWQ7CisgIHVpbnQzMl90IHNpemU7CisKKyAgaWYgKG1xID09IE5VTEwpIHsKKyAgICBzaXplID0gMFU7CisgIH0gZWxzZSB7CisgICAgLyogc2l6ZSA9IHB4UXVldWUtPnV4SXRlbVNpemUgKi8KKyAgICBzaXplID0gbXEtPnV4RHVtbXk0WzJdOworICB9CisKKyAgcmV0dXJuIChzaXplKTsKK30KKwordWludDMyX3Qgb3NNZXNzYWdlUXVldWVHZXRDb3VudCAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKSB7CisgIFF1ZXVlSGFuZGxlX3QgaFF1ZXVlID0gKFF1ZXVlSGFuZGxlX3QpbXFfaWQ7CisgIFVCYXNlVHlwZV90IGNvdW50OworCisgIGlmIChoUXVldWUgPT0gTlVMTCkgeworICAgIGNvdW50ID0gMFU7CisgIH0KKyAgZWxzZSBpZiAoSVNfSVJRKCkpIHsKKyAgICBjb3VudCA9IHV4UXVldWVNZXNzYWdlc1dhaXRpbmdGcm9tSVNSIChoUXVldWUpOworICB9CisgIGVsc2UgeworICAgIGNvdW50ID0gdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZyAoaFF1ZXVlKTsKKyAgfQorCisgIHJldHVybiAoKHVpbnQzMl90KWNvdW50KTsKK30KKwordWludDMyX3Qgb3NNZXNzYWdlUXVldWVHZXRTcGFjZSAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKSB7CisgIFN0YXRpY1F1ZXVlX3QgKm1xID0gKFN0YXRpY1F1ZXVlX3QgKiltcV9pZDsKKyAgdWludDMyX3Qgc3BhY2U7CisgIHVpbnQzMl90IGlzcm07CisKKyAgaWYgKG1xID09IE5VTEwpIHsKKyAgICBzcGFjZSA9IDBVOworICB9CisgIGVsc2UgaWYgKElTX0lSUSgpKSB7CisgICAgaXNybSA9IHRhc2tFTlRFUl9DUklUSUNBTF9GUk9NX0lTUigpOworCisgICAgLyogc3BhY2UgPSBweFF1ZXVlLT51eExlbmd0aCAtIHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nOyAqLworICAgIHNwYWNlID0gbXEtPnV4RHVtbXk0WzFdIC0gbXEtPnV4RHVtbXk0WzBdOworCisgICAgdGFza0VYSVRfQ1JJVElDQUxfRlJPTV9JU1IoaXNybSk7CisgIH0KKyAgZWxzZSB7CisgICAgc3BhY2UgPSAodWludDMyX3QpdXhRdWV1ZVNwYWNlc0F2YWlsYWJsZSAoKFF1ZXVlSGFuZGxlX3QpbXEpOworICB9CisKKyAgcmV0dXJuIChzcGFjZSk7Cit9CisKK29zU3RhdHVzX3Qgb3NNZXNzYWdlUXVldWVSZXNldCAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKSB7CisgIFF1ZXVlSGFuZGxlX3QgaFF1ZXVlID0gKFF1ZXVlSGFuZGxlX3QpbXFfaWQ7CisgIG9zU3RhdHVzX3Qgc3RhdDsKKworICBpZiAoSVNfSVJRKCkpIHsKKyAgICBzdGF0ID0gb3NFcnJvcklTUjsKKyAgfQorICBlbHNlIGlmIChoUXVldWUgPT0gTlVMTCkgeworICAgIHN0YXQgPSBvc0Vycm9yUGFyYW1ldGVyOworICB9CisgIGVsc2UgeworICAgIHN0YXQgPSBvc09LOworICAgICh2b2lkKXhRdWV1ZVJlc2V0IChoUXVldWUpOworICB9CisKKyAgcmV0dXJuIChzdGF0KTsKK30KKworb3NTdGF0dXNfdCBvc01lc3NhZ2VRdWV1ZURlbGV0ZSAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKSB7CisgIFF1ZXVlSGFuZGxlX3QgaFF1ZXVlID0gKFF1ZXVlSGFuZGxlX3QpbXFfaWQ7CisgIG9zU3RhdHVzX3Qgc3RhdDsKKworI2lmbmRlZiBVU0VfRnJlZVJUT1NfSEVBUF8xCisgIGlmIChJU19JUlEoKSkgeworICAgIHN0YXQgPSBvc0Vycm9ySVNSOworICB9CisgIGVsc2UgaWYgKGhRdWV1ZSA9PSBOVUxMKSB7CisgICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CisgIH0KKyAgZWxzZSB7CisgICAgI2lmIChjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFID4gMCkKKyAgICB2UXVldWVVbnJlZ2lzdGVyUXVldWUgKGhRdWV1ZSk7CisgICAgI2VuZGlmCisKKyAgICBzdGF0ID0gb3NPSzsKKyAgICB2UXVldWVEZWxldGUgKGhRdWV1ZSk7CisgIH0KKyNlbHNlCisgIHN0YXQgPSBvc0Vycm9yOworI2VuZGlmCisKKyAgcmV0dXJuIChzdGF0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGVzICovCitleHRlcm4gdm9pZCB2QXBwbGljYXRpb25JZGxlSG9vayAodm9pZCk7CitleHRlcm4gdm9pZCB2QXBwbGljYXRpb25UaWNrSG9vayAodm9pZCk7CitleHRlcm4gdm9pZCB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rICh2b2lkKTsKK2V4dGVybiB2b2lkIHZBcHBsaWNhdGlvbkRhZW1vblRhc2tTdGFydHVwSG9vayAodm9pZCk7CitleHRlcm4gdm9pZCB2QXBwbGljYXRpb25TdGFja092ZXJmbG93SG9vayAoVGFza0hhbmRsZV90IHhUYXNrLCBzaWduZWQgY2hhciAqcGNUYXNrTmFtZSk7CisKKy8qKgorICBEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdkFwcGxpY2F0aW9uSWRsZUhvb2soKS4KKyovCisjaWYgKGNvbmZpZ1VTRV9JRExFX0hPT0sgPT0gMSkKK19fV0VBSyB2b2lkIHZBcHBsaWNhdGlvbklkbGVIb29rICh2b2lkKXt9CisjZW5kaWYKKworLyoqCisgIER1bW15IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB2QXBwbGljYXRpb25UaWNrSG9vaygpLgorKi8KKyNpZiAoY29uZmlnVVNFX1RJQ0tfSE9PSyA9PSAxKQorIF9fV0VBSyB2b2lkIHZBcHBsaWNhdGlvblRpY2tIb29rICh2b2lkKXt9CisjZW5kaWYKKworLyoqCisgIER1bW15IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCkuCisqLworI2lmIChjb25maWdVU0VfTUFMTE9DX0ZBSUxFRF9IT09LID09IDEpCitfX1dFQUsgdm9pZCB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rICh2b2lkKXt9CisjZW5kaWYKKworLyoqCisgIER1bW15IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB2QXBwbGljYXRpb25EYWVtb25UYXNrU3RhcnR1cEhvb2soKS4KKyovCisjaWYgKGNvbmZpZ1VTRV9EQUVNT05fVEFTS19TVEFSVFVQX0hPT0sgPT0gMSkKK19fV0VBSyB2b2lkIHZBcHBsaWNhdGlvbkRhZW1vblRhc2tTdGFydHVwSG9vayAodm9pZCl7fQorI2VuZGlmCisKKy8qKgorICBEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdkFwcGxpY2F0aW9uU3RhY2tPdmVyZmxvd0hvb2soKS4KKyovCisjaWYgKGNvbmZpZ0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVyA+IDApCitfX1dFQUsgdm9pZCB2QXBwbGljYXRpb25TdGFja092ZXJmbG93SG9vayAoVGFza0hhbmRsZV90IHhUYXNrLCBzaWduZWQgY2hhciAqcGNUYXNrTmFtZSkgeworICAodm9pZCl4VGFzazsKKyAgKHZvaWQpcGNUYXNrTmFtZTsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEV4dGVybmFsIElkbGUgYW5kIFRpbWVyIHRhc2sgc3RhdGljIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uR2V0SWRsZVRhc2tNZW1vcnkgIChTdGF0aWNUYXNrX3QgKipwcHhJZGxlVGFza1RDQkJ1ZmZlciwgIFN0YWNrVHlwZV90ICoqcHB4SWRsZVRhc2tTdGFja0J1ZmZlciwgIHVpbnQzMl90ICpwdWxJZGxlVGFza1N0YWNrU2l6ZSk7CitleHRlcm4gdm9pZCB2QXBwbGljYXRpb25HZXRUaW1lclRhc2tNZW1vcnkgKFN0YXRpY1Rhc2tfdCAqKnBweFRpbWVyVGFza1RDQkJ1ZmZlciwgU3RhY2tUeXBlX3QgKipwcHhUaW1lclRhc2tTdGFja0J1ZmZlciwgdWludDMyX3QgKnB1bFRpbWVyVGFza1N0YWNrU2l6ZSk7CisKKy8qIElkbGUgdGFzayBjb250cm9sIGJsb2NrIGFuZCBzdGFjayAqLworc3RhdGljIFN0YXRpY1Rhc2tfdCBJZGxlX1RDQjsKK3N0YXRpYyBTdGFja1R5cGVfdCAgSWRsZV9TdGFja1tjb25maWdNSU5JTUFMX1NUQUNLX1NJWkVdOworCisvKiBUaW1lciB0YXNrIGNvbnRyb2wgYmxvY2sgYW5kIHN0YWNrICovCitzdGF0aWMgU3RhdGljVGFza190IFRpbWVyX1RDQjsKK3N0YXRpYyBTdGFja1R5cGVfdCAgVGltZXJfU3RhY2tbY29uZmlnVElNRVJfVEFTS19TVEFDS19ERVBUSF07CisKKy8qCisgIHZBcHBsaWNhdGlvbkdldElkbGVUYXNrTWVtb3J5IGdldHMgY2FsbGVkIHdoZW4gY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTgorICBlcXVhbHMgdG8gMSBhbmQgaXMgcmVxdWlyZWQgZm9yIHN0YXRpYyBtZW1vcnkgYWxsb2NhdGlvbiBzdXBwb3J0LgorKi8KK3ZvaWQgdkFwcGxpY2F0aW9uR2V0SWRsZVRhc2tNZW1vcnkgKFN0YXRpY1Rhc2tfdCAqKnBweElkbGVUYXNrVENCQnVmZmVyLCBTdGFja1R5cGVfdCAqKnBweElkbGVUYXNrU3RhY2tCdWZmZXIsIHVpbnQzMl90ICpwdWxJZGxlVGFza1N0YWNrU2l6ZSkgeworICAqcHB4SWRsZVRhc2tUQ0JCdWZmZXIgICA9ICZJZGxlX1RDQjsKKyAgKnBweElkbGVUYXNrU3RhY2tCdWZmZXIgPSAmSWRsZV9TdGFja1swXTsKKyAgKnB1bElkbGVUYXNrU3RhY2tTaXplICAgPSAodWludDMyX3QpY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFOworfQorCisvKgorICB2QXBwbGljYXRpb25HZXRUaW1lclRhc2tNZW1vcnkgZ2V0cyBjYWxsZWQgd2hlbiBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OCisgIGVxdWFscyB0byAxIGFuZCBpcyByZXF1aXJlZCBmb3Igc3RhdGljIG1lbW9yeSBhbGxvY2F0aW9uIHN1cHBvcnQuCisqLwordm9pZCB2QXBwbGljYXRpb25HZXRUaW1lclRhc2tNZW1vcnkgKFN0YXRpY1Rhc2tfdCAqKnBweFRpbWVyVGFza1RDQkJ1ZmZlciwgU3RhY2tUeXBlX3QgKipwcHhUaW1lclRhc2tTdGFja0J1ZmZlciwgdWludDMyX3QgKnB1bFRpbWVyVGFza1N0YWNrU2l6ZSkgeworICAqcHB4VGltZXJUYXNrVENCQnVmZmVyICAgPSAmVGltZXJfVENCOworICAqcHB4VGltZXJUYXNrU3RhY2tCdWZmZXIgPSAmVGltZXJfU3RhY2tbMF07CisgICpwdWxUaW1lclRhc2tTdGFja1NpemUgICA9ICh1aW50MzJfdCljb25maWdUSU1FUl9UQVNLX1NUQUNLX0RFUFRIOworfQpkaWZmIC0tZ2l0IGEvU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmggYi9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzc0Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmgKQEAgLTAsMCArMSw3MzQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgwqkgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MgSW50ZXJuYXRpb25hbCBOLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7IHlvdSBtYXkKKyAqIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiB3d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiAgICAgIE5hbWU6ICAgIGNtc2lzX29zMi5oCisgKiAgICAgIFB1cnBvc2U6IENNU0lTIFJUT1MyIHdyYXBwZXIgZm9yIEZyZWVSVE9TCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIENNU0lTX09TMl9IXworI2RlZmluZSBDTVNJU19PUzJfSF8KKworI2lmbmRlZiBfX05PX1JFVFVSTgorI2lmICAgZGVmaW5lZChfX0NDX0FSTSkKKyNkZWZpbmUgX19OT19SRVRVUk4gX19kZWNsc3BlYyhub3JldHVybikKKyNlbGlmIGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSAmJiAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApCisjZGVmaW5lIF9fTk9fUkVUVVJOIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBfX05PX1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2VsaWYgZGVmaW5lZChfX0lDQ0FSTV9fKQorI2RlZmluZSBfX05PX1JFVFVSTiBfX25vcmV0dXJuCisjZWxzZQorI2RlZmluZSBfX05PX1JFVFVSTgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworCisvLyAgPT09PSBFbnVtZXJhdGlvbnMsIHN0cnVjdHVyZXMsIGRlZmluZXMgPT09PQorCisvLy8gVmVyc2lvbiBpbmZvcm1hdGlvbi4KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIGFwaTsgICAvLy88IEFQSSB2ZXJzaW9uIChtYWpvci5taW5vci5yZXY6IG1tbm5ucnJyciBkZWMpLgorICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAga2VybmVsOyAgIC8vLzwgS2VybmVsIHZlcnNpb24gKG1ham9yLm1pbm9yLnJldjogbW1ubm5ycnJyIGRlYykuCit9IG9zVmVyc2lvbl90OworCisvLy8gS2VybmVsIHN0YXRlLgordHlwZWRlZiBlbnVtIHsKKyAgb3NLZXJuZWxJbmFjdGl2ZSAgICAgICAgPSAgMCwgICAgICAgICAvLy88IEluYWN0aXZlLgorICBvc0tlcm5lbFJlYWR5ICAgICAgICAgICA9ICAxLCAgICAgICAgIC8vLzwgUmVhZHkuCisgIG9zS2VybmVsUnVubmluZyAgICAgICAgID0gIDIsICAgICAgICAgLy8vPCBSdW5uaW5nLgorICBvc0tlcm5lbExvY2tlZCAgICAgICAgICA9ICAzLCAgICAgICAgIC8vLzwgTG9ja2VkLgorICBvc0tlcm5lbFN1c3BlbmRlZCAgICAgICA9ICA0LCAgICAgICAgIC8vLzwgU3VzcGVuZGVkLgorICBvc0tlcm5lbEVycm9yICAgICAgICAgICA9IC0xLCAgICAgICAgIC8vLzwgRXJyb3IuCisgIG9zS2VybmVsUmVzZXJ2ZWQgICAgICAgID0gMHg3RkZGRkZGRlUgLy8vPCBQcmV2ZW50cyBlbnVtIGRvd24tc2l6ZSBjb21waWxlciBvcHRpbWl6YXRpb24uCit9IG9zS2VybmVsU3RhdGVfdDsKKworLy8vIFRocmVhZCBzdGF0ZS4KK3R5cGVkZWYgZW51bSB7CisgIG9zVGhyZWFkSW5hY3RpdmUgICAgICAgID0gIDAsICAgICAgICAgLy8vPCBJbmFjdGl2ZS4KKyAgb3NUaHJlYWRSZWFkeSAgICAgICAgICAgPSAgMSwgICAgICAgICAvLy88IFJlYWR5LgorICBvc1RocmVhZFJ1bm5pbmcgICAgICAgICA9ICAyLCAgICAgICAgIC8vLzwgUnVubmluZy4KKyAgb3NUaHJlYWRCbG9ja2VkICAgICAgICAgPSAgMywgICAgICAgICAvLy88IEJsb2NrZWQuCisgIG9zVGhyZWFkVGVybWluYXRlZCAgICAgID0gIDQsICAgICAgICAgLy8vPCBUZXJtaW5hdGVkLgorICBvc1RocmVhZEVycm9yICAgICAgICAgICA9IC0xLCAgICAgICAgIC8vLzwgRXJyb3IuCisgIG9zVGhyZWFkUmVzZXJ2ZWQgICAgICAgID0gMHg3RkZGRkZGRiAgLy8vPCBQcmV2ZW50cyBlbnVtIGRvd24tc2l6ZSBjb21waWxlciBvcHRpbWl6YXRpb24uCit9IG9zVGhyZWFkU3RhdGVfdDsKKworLy8vIFByaW9yaXR5IHZhbHVlcy4KK3R5cGVkZWYgZW51bSB7CisgIG9zUHJpb3JpdHlOb25lICAgICAgICAgID0gIDAsICAgICAgICAgLy8vPCBObyBwcmlvcml0eSAobm90IGluaXRpYWxpemVkKS4KKyAgb3NQcmlvcml0eUlkbGUgICAgICAgICAgPSAgMSwgICAgICAgICAvLy88IFJlc2VydmVkIGZvciBJZGxlIHRocmVhZC4KKyAgb3NQcmlvcml0eUxvdyAgICAgICAgICAgPSAgOCwgICAgICAgICAvLy88IFByaW9yaXR5OiBsb3cKKyAgb3NQcmlvcml0eUxvdzEgICAgICAgICAgPSAgOCsxLCAgICAgICAvLy88IFByaW9yaXR5OiBsb3cgKyAxCisgIG9zUHJpb3JpdHlMb3cyICAgICAgICAgID0gIDgrMiwgICAgICAgLy8vPCBQcmlvcml0eTogbG93ICsgMgorICBvc1ByaW9yaXR5TG93MyAgICAgICAgICA9ICA4KzMsICAgICAgIC8vLzwgUHJpb3JpdHk6IGxvdyArIDMKKyAgb3NQcmlvcml0eUxvdzQgICAgICAgICAgPSAgOCs0LCAgICAgICAvLy88IFByaW9yaXR5OiBsb3cgKyA0CisgIG9zUHJpb3JpdHlMb3c1ICAgICAgICAgID0gIDgrNSwgICAgICAgLy8vPCBQcmlvcml0eTogbG93ICsgNQorICBvc1ByaW9yaXR5TG93NiAgICAgICAgICA9ICA4KzYsICAgICAgIC8vLzwgUHJpb3JpdHk6IGxvdyArIDYKKyAgb3NQcmlvcml0eUxvdzcgICAgICAgICAgPSAgOCs3LCAgICAgICAvLy88IFByaW9yaXR5OiBsb3cgKyA3CisgIG9zUHJpb3JpdHlCZWxvd05vcm1hbCAgID0gMTYsICAgICAgICAgLy8vPCBQcmlvcml0eTogYmVsb3cgbm9ybWFsCisgIG9zUHJpb3JpdHlCZWxvd05vcm1hbDEgID0gMTYrMSwgICAgICAgLy8vPCBQcmlvcml0eTogYmVsb3cgbm9ybWFsICsgMQorICBvc1ByaW9yaXR5QmVsb3dOb3JtYWwyICA9IDE2KzIsICAgICAgIC8vLzwgUHJpb3JpdHk6IGJlbG93IG5vcm1hbCArIDIKKyAgb3NQcmlvcml0eUJlbG93Tm9ybWFsMyAgPSAxNiszLCAgICAgICAvLy88IFByaW9yaXR5OiBiZWxvdyBub3JtYWwgKyAzCisgIG9zUHJpb3JpdHlCZWxvd05vcm1hbDQgID0gMTYrNCwgICAgICAgLy8vPCBQcmlvcml0eTogYmVsb3cgbm9ybWFsICsgNAorICBvc1ByaW9yaXR5QmVsb3dOb3JtYWw1ICA9IDE2KzUsICAgICAgIC8vLzwgUHJpb3JpdHk6IGJlbG93IG5vcm1hbCArIDUKKyAgb3NQcmlvcml0eUJlbG93Tm9ybWFsNiAgPSAxNis2LCAgICAgICAvLy88IFByaW9yaXR5OiBiZWxvdyBub3JtYWwgKyA2CisgIG9zUHJpb3JpdHlCZWxvd05vcm1hbDcgID0gMTYrNywgICAgICAgLy8vPCBQcmlvcml0eTogYmVsb3cgbm9ybWFsICsgNworICBvc1ByaW9yaXR5Tm9ybWFsICAgICAgICA9IDI0LCAgICAgICAgIC8vLzwgUHJpb3JpdHk6IG5vcm1hbAorICBvc1ByaW9yaXR5Tm9ybWFsMSAgICAgICA9IDI0KzEsICAgICAgIC8vLzwgUHJpb3JpdHk6IG5vcm1hbCArIDEKKyAgb3NQcmlvcml0eU5vcm1hbDIgICAgICAgPSAyNCsyLCAgICAgICAvLy88IFByaW9yaXR5OiBub3JtYWwgKyAyCisgIG9zUHJpb3JpdHlOb3JtYWwzICAgICAgID0gMjQrMywgICAgICAgLy8vPCBQcmlvcml0eTogbm9ybWFsICsgMworICBvc1ByaW9yaXR5Tm9ybWFsNCAgICAgICA9IDI0KzQsICAgICAgIC8vLzwgUHJpb3JpdHk6IG5vcm1hbCArIDQKKyAgb3NQcmlvcml0eU5vcm1hbDUgICAgICAgPSAyNCs1LCAgICAgICAvLy88IFByaW9yaXR5OiBub3JtYWwgKyA1CisgIG9zUHJpb3JpdHlOb3JtYWw2ICAgICAgID0gMjQrNiwgICAgICAgLy8vPCBQcmlvcml0eTogbm9ybWFsICsgNgorICBvc1ByaW9yaXR5Tm9ybWFsNyAgICAgICA9IDI0KzcsICAgICAgIC8vLzwgUHJpb3JpdHk6IG5vcm1hbCArIDcKKyAgb3NQcmlvcml0eUFib3ZlTm9ybWFsICAgPSAzMiwgICAgICAgICAvLy88IFByaW9yaXR5OiBhYm92ZSBub3JtYWwKKyAgb3NQcmlvcml0eUFib3ZlTm9ybWFsMSAgPSAzMisxLCAgICAgICAvLy88IFByaW9yaXR5OiBhYm92ZSBub3JtYWwgKyAxCisgIG9zUHJpb3JpdHlBYm92ZU5vcm1hbDIgID0gMzIrMiwgICAgICAgLy8vPCBQcmlvcml0eTogYWJvdmUgbm9ybWFsICsgMgorICBvc1ByaW9yaXR5QWJvdmVOb3JtYWwzICA9IDMyKzMsICAgICAgIC8vLzwgUHJpb3JpdHk6IGFib3ZlIG5vcm1hbCArIDMKKyAgb3NQcmlvcml0eUFib3ZlTm9ybWFsNCAgPSAzMis0LCAgICAgICAvLy88IFByaW9yaXR5OiBhYm92ZSBub3JtYWwgKyA0CisgIG9zUHJpb3JpdHlBYm92ZU5vcm1hbDUgID0gMzIrNSwgICAgICAgLy8vPCBQcmlvcml0eTogYWJvdmUgbm9ybWFsICsgNQorICBvc1ByaW9yaXR5QWJvdmVOb3JtYWw2ICA9IDMyKzYsICAgICAgIC8vLzwgUHJpb3JpdHk6IGFib3ZlIG5vcm1hbCArIDYKKyAgb3NQcmlvcml0eUFib3ZlTm9ybWFsNyAgPSAzMis3LCAgICAgICAvLy88IFByaW9yaXR5OiBhYm92ZSBub3JtYWwgKyA3CisgIG9zUHJpb3JpdHlIaWdoICAgICAgICAgID0gNDAsICAgICAgICAgLy8vPCBQcmlvcml0eTogaGlnaAorICBvc1ByaW9yaXR5SGlnaDEgICAgICAgICA9IDQwKzEsICAgICAgIC8vLzwgUHJpb3JpdHk6IGhpZ2ggKyAxCisgIG9zUHJpb3JpdHlIaWdoMiAgICAgICAgID0gNDArMiwgICAgICAgLy8vPCBQcmlvcml0eTogaGlnaCArIDIKKyAgb3NQcmlvcml0eUhpZ2gzICAgICAgICAgPSA0MCszLCAgICAgICAvLy88IFByaW9yaXR5OiBoaWdoICsgMworICBvc1ByaW9yaXR5SGlnaDQgICAgICAgICA9IDQwKzQsICAgICAgIC8vLzwgUHJpb3JpdHk6IGhpZ2ggKyA0CisgIG9zUHJpb3JpdHlIaWdoNSAgICAgICAgID0gNDArNSwgICAgICAgLy8vPCBQcmlvcml0eTogaGlnaCArIDUKKyAgb3NQcmlvcml0eUhpZ2g2ICAgICAgICAgPSA0MCs2LCAgICAgICAvLy88IFByaW9yaXR5OiBoaWdoICsgNgorICBvc1ByaW9yaXR5SGlnaDcgICAgICAgICA9IDQwKzcsICAgICAgIC8vLzwgUHJpb3JpdHk6IGhpZ2ggKyA3CisgIG9zUHJpb3JpdHlSZWFsdGltZSAgICAgID0gNDgsICAgICAgICAgLy8vPCBQcmlvcml0eTogcmVhbHRpbWUKKyAgb3NQcmlvcml0eVJlYWx0aW1lMSAgICAgPSA0OCsxLCAgICAgICAvLy88IFByaW9yaXR5OiByZWFsdGltZSArIDEKKyAgb3NQcmlvcml0eVJlYWx0aW1lMiAgICAgPSA0OCsyLCAgICAgICAvLy88IFByaW9yaXR5OiByZWFsdGltZSArIDIKKyAgb3NQcmlvcml0eVJlYWx0aW1lMyAgICAgPSA0OCszLCAgICAgICAvLy88IFByaW9yaXR5OiByZWFsdGltZSArIDMKKyAgb3NQcmlvcml0eVJlYWx0aW1lNCAgICAgPSA0OCs0LCAgICAgICAvLy88IFByaW9yaXR5OiByZWFsdGltZSArIDQKKyAgb3NQcmlvcml0eVJlYWx0aW1lNSAgICAgPSA0OCs1LCAgICAgICAvLy88IFByaW9yaXR5OiByZWFsdGltZSArIDUKKyAgb3NQcmlvcml0eVJlYWx0aW1lNiAgICAgPSA0OCs2LCAgICAgICAvLy88IFByaW9yaXR5OiByZWFsdGltZSArIDYKKyAgb3NQcmlvcml0eVJlYWx0aW1lNyAgICAgPSA0OCs3LCAgICAgICAvLy88IFByaW9yaXR5OiByZWFsdGltZSArIDcKKyAgb3NQcmlvcml0eUlTUiAgICAgICAgICAgPSA1NiwgICAgICAgICAvLy88IFJlc2VydmVkIGZvciBJU1IgZGVmZXJyZWQgdGhyZWFkLgorICBvc1ByaW9yaXR5RXJyb3IgICAgICAgICA9IC0xLCAgICAgICAgIC8vLzwgU3lzdGVtIGNhbm5vdCBkZXRlcm1pbmUgcHJpb3JpdHkgb3IgaWxsZWdhbCBwcmlvcml0eS4KKyAgb3NQcmlvcml0eVJlc2VydmVkICAgICAgPSAweDdGRkZGRkZGICAvLy88IFByZXZlbnRzIGVudW0gZG93bi1zaXplIGNvbXBpbGVyIG9wdGltaXphdGlvbi4KK30gb3NQcmlvcml0eV90OworCisvLy8gRW50cnkgcG9pbnQgb2YgYSB0aHJlYWQuCit0eXBlZGVmIHZvaWQgKCpvc1RocmVhZEZ1bmNfdCkgKHZvaWQgKmFyZ3VtZW50KTsKKworLy8vIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uLgordHlwZWRlZiB2b2lkICgqb3NUaW1lckZ1bmNfdCkgKHZvaWQgKmFyZ3VtZW50KTsKKworLy8vIFRpbWVyIHR5cGUuCit0eXBlZGVmIGVudW0geworICBvc1RpbWVyT25jZSAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgLy8vPCBPbmUtc2hvdCB0aW1lci4KKyAgb3NUaW1lclBlcmlvZGljICAgICAgICAgICA9IDEgICAgICAgICAgIC8vLzwgUmVwZWF0aW5nIHRpbWVyLgorfSBvc1RpbWVyVHlwZV90OworCisvLyBUaW1lb3V0IHZhbHVlLgorI2RlZmluZSBvc1dhaXRGb3JldmVyICAgICAgICAgMHhGRkZGRkZGRlUgLy8vPCBXYWl0IGZvcmV2ZXIgdGltZW91dCB2YWx1ZS4KKworLy8gRmxhZ3Mgb3B0aW9ucyAoXHJlZiBvc1RocmVhZEZsYWdzV2FpdCBhbmQgXHJlZiBvc0V2ZW50RmxhZ3NXYWl0KS4KKyNkZWZpbmUgb3NGbGFnc1dhaXRBbnkgICAgICAgIDB4MDAwMDAwMDBVIC8vLzwgV2FpdCBmb3IgYW55IGZsYWcgKGRlZmF1bHQpLgorI2RlZmluZSBvc0ZsYWdzV2FpdEFsbCAgICAgICAgMHgwMDAwMDAwMVUgLy8vPCBXYWl0IGZvciBhbGwgZmxhZ3MuCisjZGVmaW5lIG9zRmxhZ3NOb0NsZWFyICAgICAgICAweDAwMDAwMDAyVSAvLy88IERvIG5vdCBjbGVhciBmbGFncyB3aGljaCBoYXZlIGJlZW4gc3BlY2lmaWVkIHRvIHdhaXQgZm9yLgorCisvLyBGbGFncyBlcnJvcnMgKHJldHVybmVkIGJ5IG9zVGhyZWFkRmxhZ3NYeHh4IGFuZCBvc0V2ZW50RmxhZ3NYeHh4KS4KKyNkZWZpbmUgb3NGbGFnc0Vycm9yICAgICAgICAgIDB4ODAwMDAwMDBVIC8vLzwgRXJyb3IgaW5kaWNhdG9yLgorI2RlZmluZSBvc0ZsYWdzRXJyb3JVbmtub3duICAgMHhGRkZGRkZGRlUgLy8vPCBvc0Vycm9yICgtMSkuCisjZGVmaW5lIG9zRmxhZ3NFcnJvclRpbWVvdXQgICAweEZGRkZGRkZFVSAvLy88IG9zRXJyb3JUaW1lb3V0ICgtMikuCisjZGVmaW5lIG9zRmxhZ3NFcnJvclJlc291cmNlICAweEZGRkZGRkZEVSAvLy88IG9zRXJyb3JSZXNvdXJjZSAoLTMpLgorI2RlZmluZSBvc0ZsYWdzRXJyb3JQYXJhbWV0ZXIgMHhGRkZGRkZGQ1UgLy8vPCBvc0Vycm9yUGFyYW1ldGVyICgtNCkuCisjZGVmaW5lIG9zRmxhZ3NFcnJvcklTUiAgICAgICAweEZGRkZGRkZBVSAvLy88IG9zRXJyb3JJU1IgKC02KS4KKworLy8gVGhyZWFkIGF0dHJpYnV0ZXMgKGF0dHJfYml0cyBpbiBccmVmIG9zVGhyZWFkQXR0cl90KS4KKyNkZWZpbmUgb3NUaHJlYWREZXRhY2hlZCAgICAgIDB4MDAwMDAwMDBVIC8vLzwgVGhyZWFkIGNyZWF0ZWQgaW4gZGV0YWNoZWQgbW9kZSAoZGVmYXVsdCkKKyNkZWZpbmUgb3NUaHJlYWRKb2luYWJsZSAgICAgIDB4MDAwMDAwMDFVIC8vLzwgVGhyZWFkIGNyZWF0ZWQgaW4gam9pbmFibGUgbW9kZQorCisvLyBNdXRleCBhdHRyaWJ1dGVzIChhdHRyX2JpdHMgaW4gXHJlZiBvc011dGV4QXR0cl90KS4KKyNkZWZpbmUgb3NNdXRleFJlY3Vyc2l2ZSAgICAgIDB4MDAwMDAwMDFVIC8vLzwgUmVjdXJzaXZlIG11dGV4LgorI2RlZmluZSBvc011dGV4UHJpb0luaGVyaXQgICAgMHgwMDAwMDAwMlUgLy8vPCBQcmlvcml0eSBpbmhlcml0IHByb3RvY29sLgorI2RlZmluZSBvc011dGV4Um9idXN0ICAgICAgICAgMHgwMDAwMDAwOFUgLy8vPCBSb2J1c3QgbXV0ZXguCisKKy8vLyBTdGF0dXMgY29kZSB2YWx1ZXMgcmV0dXJuZWQgYnkgQ01TSVMtUlRPUyBmdW5jdGlvbnMuCit0eXBlZGVmIGVudW0geworICBvc09LICAgICAgICAgICAgICAgICAgICAgID0gIDAsICAgICAgICAgLy8vPCBPcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgb3NFcnJvciAgICAgICAgICAgICAgICAgICA9IC0xLCAgICAgICAgIC8vLzwgVW5zcGVjaWZpZWQgUlRPUyBlcnJvcjogcnVuLXRpbWUgZXJyb3IgYnV0IG5vIG90aGVyIGVycm9yIG1lc3NhZ2UgZml0cy4KKyAgb3NFcnJvclRpbWVvdXQgICAgICAgICAgICA9IC0yLCAgICAgICAgIC8vLzwgT3BlcmF0aW9uIG5vdCBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lb3V0IHBlcmlvZC4KKyAgb3NFcnJvclJlc291cmNlICAgICAgICAgICA9IC0zLCAgICAgICAgIC8vLzwgUmVzb3VyY2Ugbm90IGF2YWlsYWJsZS4KKyAgb3NFcnJvclBhcmFtZXRlciAgICAgICAgICA9IC00LCAgICAgICAgIC8vLzwgUGFyYW1ldGVyIGVycm9yLgorICBvc0Vycm9yTm9NZW1vcnkgICAgICAgICAgID0gLTUsICAgICAgICAgLy8vPCBTeXN0ZW0gaXMgb3V0IG9mIG1lbW9yeTogaXQgd2FzIGltcG9zc2libGUgdG8gYWxsb2NhdGUgb3IgcmVzZXJ2ZSBtZW1vcnkgZm9yIHRoZSBvcGVyYXRpb24uCisgIG9zRXJyb3JJU1IgICAgICAgICAgICAgICAgPSAtNiwgICAgICAgICAvLy88IE5vdCBhbGxvd2VkIGluIElTUiBjb250ZXh0OiB0aGUgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzLgorICBvc1N0YXR1c1Jlc2VydmVkICAgICAgICAgID0gMHg3RkZGRkZGRiAgLy8vPCBQcmV2ZW50cyBlbnVtIGRvd24tc2l6ZSBjb21waWxlciBvcHRpbWl6YXRpb24uCit9IG9zU3RhdHVzX3Q7CisKKworLy8vIFxkZXRhaWxzIFRocmVhZCBJRCBpZGVudGlmaWVzIHRoZSB0aHJlYWQuCit0eXBlZGVmIHZvaWQgKm9zVGhyZWFkSWRfdDsKKworLy8vIFxkZXRhaWxzIFRpbWVyIElEIGlkZW50aWZpZXMgdGhlIHRpbWVyLgordHlwZWRlZiB2b2lkICpvc1RpbWVySWRfdDsKKworLy8vIFxkZXRhaWxzIEV2ZW50IEZsYWdzIElEIGlkZW50aWZpZXMgdGhlIGV2ZW50IGZsYWdzLgordHlwZWRlZiB2b2lkICpvc0V2ZW50RmxhZ3NJZF90OworCisvLy8gXGRldGFpbHMgTXV0ZXggSUQgaWRlbnRpZmllcyB0aGUgbXV0ZXguCit0eXBlZGVmIHZvaWQgKm9zTXV0ZXhJZF90OworCisvLy8gXGRldGFpbHMgU2VtYXBob3JlIElEIGlkZW50aWZpZXMgdGhlIHNlbWFwaG9yZS4KK3R5cGVkZWYgdm9pZCAqb3NTZW1hcGhvcmVJZF90OworCisvLy8gXGRldGFpbHMgTWVtb3J5IFBvb2wgSUQgaWRlbnRpZmllcyB0aGUgbWVtb3J5IHBvb2wuCit0eXBlZGVmIHZvaWQgKm9zTWVtb3J5UG9vbElkX3Q7CisKKy8vLyBcZGV0YWlscyBNZXNzYWdlIFF1ZXVlIElEIGlkZW50aWZpZXMgdGhlIG1lc3NhZ2UgcXVldWUuCit0eXBlZGVmIHZvaWQgKm9zTWVzc2FnZVF1ZXVlSWRfdDsKKworCisjaWZuZGVmIFRaX01PRFVMRUlEX1QKKyNkZWZpbmUgVFpfTU9EVUxFSURfVAorLy8vIFxkZXRhaWxzIERhdGEgdHlwZSB0aGF0IGlkZW50aWZpZXMgc2VjdXJlIHNvZnR3YXJlIG1vZHVsZXMgY2FsbGVkIGJ5IGEgcHJvY2Vzcy4KK3R5cGVkZWYgdWludDMyX3QgVFpfTW9kdWxlSWRfdDsKKyNlbmRpZgorCisKKy8vLyBBdHRyaWJ1dGVzIHN0cnVjdHVyZSBmb3IgdGhyZWFkLgordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOyAgIC8vLzwgbmFtZSBvZiB0aGUgdGhyZWFkCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBhdHRyX2JpdHM7ICAgLy8vPCBhdHRyaWJ1dGUgYml0cworICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpjYl9tZW07ICAgIC8vLzwgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIGNiX3NpemU7ICAgLy8vPCBzaXplIG9mIHByb3ZpZGVkIG1lbW9yeSBmb3IgY29udHJvbCBibG9jaworICB2b2lkICAgICAgICAgICAgICAgICAgICpzdGFja19tZW07ICAgIC8vLzwgbWVtb3J5IGZvciBzdGFjaworICB1aW50MzJfdCAgICAgICAgICAgICAgICBzdGFja19zaXplOyAgIC8vLzwgc2l6ZSBvZiBzdGFjaworICBvc1ByaW9yaXR5X3QgICAgICAgICAgICAgIHByaW9yaXR5OyAgIC8vLzwgaW5pdGlhbCB0aHJlYWQgcHJpb3JpdHkgKGRlZmF1bHQ6IG9zUHJpb3JpdHlOb3JtYWwpCisgIFRaX01vZHVsZUlkX3QgICAgICAgICAgICB0el9tb2R1bGU7ICAgLy8vPCBUcnVzdFpvbmUgbW9kdWxlIGlkZW50aWZpZXIKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICByZXNlcnZlZDsgICAvLy88IHJlc2VydmVkIChtdXN0IGJlIDApCit9IG9zVGhyZWFkQXR0cl90OworCisvLy8gQXR0cmlidXRlcyBzdHJ1Y3R1cmUgZm9yIHRpbWVyLgordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOyAgIC8vLzwgbmFtZSBvZiB0aGUgdGltZXIKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgIGF0dHJfYml0czsgICAvLy88IGF0dHJpYnV0ZSBiaXRzCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmNiX21lbTsgICAgLy8vPCBtZW1vcnkgZm9yIGNvbnRyb2wgYmxvY2sKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZTsgICAvLy88IHNpemUgb2YgcHJvdmlkZWQgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCit9IG9zVGltZXJBdHRyX3Q7CisKKy8vLyBBdHRyaWJ1dGVzIHN0cnVjdHVyZSBmb3IgZXZlbnQgZmxhZ3MuCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgKm5hbWU7ICAgLy8vPCBuYW1lIG9mIHRoZSBldmVudCBmbGFncworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgYXR0cl9iaXRzOyAgIC8vLzwgYXR0cmlidXRlIGJpdHMKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqY2JfbWVtOyAgICAvLy88IG1lbW9yeSBmb3IgY29udHJvbCBibG9jaworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBjYl9zaXplOyAgIC8vLzwgc2l6ZSBvZiBwcm92aWRlZCBtZW1vcnkgZm9yIGNvbnRyb2wgYmxvY2sKK30gb3NFdmVudEZsYWdzQXR0cl90OworCisvLy8gQXR0cmlidXRlcyBzdHJ1Y3R1cmUgZm9yIG11dGV4LgordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOyAgIC8vLzwgbmFtZSBvZiB0aGUgbXV0ZXgKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgIGF0dHJfYml0czsgICAvLy88IGF0dHJpYnV0ZSBiaXRzCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmNiX21lbTsgICAgLy8vPCBtZW1vcnkgZm9yIGNvbnRyb2wgYmxvY2sKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZTsgICAvLy88IHNpemUgb2YgcHJvdmlkZWQgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCit9IG9zTXV0ZXhBdHRyX3Q7CisKKy8vLyBBdHRyaWJ1dGVzIHN0cnVjdHVyZSBmb3Igc2VtYXBob3JlLgordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOyAgIC8vLzwgbmFtZSBvZiB0aGUgc2VtYXBob3JlCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBhdHRyX2JpdHM7ICAgLy8vPCBhdHRyaWJ1dGUgYml0cworICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpjYl9tZW07ICAgIC8vLzwgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIGNiX3NpemU7ICAgLy8vPCBzaXplIG9mIHByb3ZpZGVkIG1lbW9yeSBmb3IgY29udHJvbCBibG9jaworfSBvc1NlbWFwaG9yZUF0dHJfdDsKKworLy8vIEF0dHJpYnV0ZXMgc3RydWN0dXJlIGZvciBtZW1vcnkgcG9vbC4KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqbmFtZTsgICAvLy88IG5hbWUgb2YgdGhlIG1lbW9yeSBwb29sCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBhdHRyX2JpdHM7ICAgLy8vPCBhdHRyaWJ1dGUgYml0cworICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpjYl9tZW07ICAgIC8vLzwgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIGNiX3NpemU7ICAgLy8vPCBzaXplIG9mIHByb3ZpZGVkIG1lbW9yeSBmb3IgY29udHJvbCBibG9jaworICB2b2lkICAgICAgICAgICAgICAgICAgICAgICptcF9tZW07ICAgIC8vLzwgbWVtb3J5IGZvciBkYXRhIHN0b3JhZ2UKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgbXBfc2l6ZTsgICAvLy88IHNpemUgb2YgcHJvdmlkZWQgbWVtb3J5IGZvciBkYXRhIHN0b3JhZ2UKK30gb3NNZW1vcnlQb29sQXR0cl90OworCisvLy8gQXR0cmlidXRlcyBzdHJ1Y3R1cmUgZm9yIG1lc3NhZ2UgcXVldWUuCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgKm5hbWU7ICAgLy8vPCBuYW1lIG9mIHRoZSBtZXNzYWdlIHF1ZXVlCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBhdHRyX2JpdHM7ICAgLy8vPCBhdHRyaWJ1dGUgYml0cworICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpjYl9tZW07ICAgIC8vLzwgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIGNiX3NpemU7ICAgLy8vPCBzaXplIG9mIHByb3ZpZGVkIG1lbW9yeSBmb3IgY29udHJvbCBibG9jaworICB2b2lkICAgICAgICAgICAgICAgICAgICAgICptcV9tZW07ICAgIC8vLzwgbWVtb3J5IGZvciBkYXRhIHN0b3JhZ2UKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgbXFfc2l6ZTsgICAvLy88IHNpemUgb2YgcHJvdmlkZWQgbWVtb3J5IGZvciBkYXRhIHN0b3JhZ2UKK30gb3NNZXNzYWdlUXVldWVBdHRyX3Q7CisKKworLy8gID09PT0gS2VybmVsIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KKworLy8vIEluaXRpYWxpemUgdGhlIFJUT1MgS2VybmVsLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc0tlcm5lbEluaXRpYWxpemUgKHZvaWQpOworCisvLy8gIEdldCBSVE9TIEtlcm5lbCBJbmZvcm1hdGlvbi4KKy8vLyBccGFyYW1bb3V0XSAgICB2ZXJzaW9uICAgICAgIHBvaW50ZXIgdG8gYnVmZmVyIGZvciByZXRyaWV2aW5nIHZlcnNpb24gaW5mb3JtYXRpb24uCisvLy8gXHBhcmFtW291dF0gICAgaWRfYnVmICAgICAgICBwb2ludGVyIHRvIGJ1ZmZlciBmb3IgcmV0cmlldmluZyBrZXJuZWwgaWRlbnRpZmljYXRpb24gc3RyaW5nLgorLy8vIFxwYXJhbVtpbl0gICAgIGlkX3NpemUgICAgICAgc2l6ZSBvZiBidWZmZXIgZm9yIGtlcm5lbCBpZGVudGlmaWNhdGlvbiBzdHJpbmcuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1c190IG9zS2VybmVsR2V0SW5mbyAob3NWZXJzaW9uX3QgKnZlcnNpb24sIGNoYXIgKmlkX2J1ZiwgdWludDMyX3QgaWRfc2l6ZSk7CisKKy8vLyBHZXQgdGhlIGN1cnJlbnQgUlRPUyBLZXJuZWwgc3RhdGUuCisvLy8gXHJldHVybiBjdXJyZW50IFJUT1MgS2VybmVsIHN0YXRlLgorb3NLZXJuZWxTdGF0ZV90IG9zS2VybmVsR2V0U3RhdGUgKHZvaWQpOworCisvLy8gU3RhcnQgdGhlIFJUT1MgS2VybmVsIHNjaGVkdWxlci4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzX3Qgb3NLZXJuZWxTdGFydCAodm9pZCk7CisKKy8vLyBMb2NrIHRoZSBSVE9TIEtlcm5lbCBzY2hlZHVsZXIuCisvLy8gXHJldHVybiBwcmV2aW91cyBsb2NrIHN0YXRlICgxIC0gbG9ja2VkLCAwIC0gbm90IGxvY2tlZCwgZXJyb3IgY29kZSBpZiBuZWdhdGl2ZSkuCitpbnQzMl90IG9zS2VybmVsTG9jayAodm9pZCk7CisKKy8vLyBVbmxvY2sgdGhlIFJUT1MgS2VybmVsIHNjaGVkdWxlci4KKy8vLyBccmV0dXJuIHByZXZpb3VzIGxvY2sgc3RhdGUgKDEgLSBsb2NrZWQsIDAgLSBub3QgbG9ja2VkLCBlcnJvciBjb2RlIGlmIG5lZ2F0aXZlKS4KK2ludDMyX3Qgb3NLZXJuZWxVbmxvY2sgKHZvaWQpOworCisvLy8gUmVzdG9yZSB0aGUgUlRPUyBLZXJuZWwgc2NoZWR1bGVyIGxvY2sgc3RhdGUuCisvLy8gXHBhcmFtW2luXSAgICAgbG9jayAgICAgICAgICBsb2NrIHN0YXRlIG9idGFpbmVkIGJ5IFxyZWYgb3NLZXJuZWxMb2NrIG9yIFxyZWYgb3NLZXJuZWxVbmxvY2suCisvLy8gXHJldHVybiBuZXcgbG9jayBzdGF0ZSAoMSAtIGxvY2tlZCwgMCAtIG5vdCBsb2NrZWQsIGVycm9yIGNvZGUgaWYgbmVnYXRpdmUpLgoraW50MzJfdCBvc0tlcm5lbFJlc3RvcmVMb2NrIChpbnQzMl90IGxvY2spOworCisvLy8gU3VzcGVuZCB0aGUgUlRPUyBLZXJuZWwgc2NoZWR1bGVyLgorLy8vIFxyZXR1cm4gdGltZSBpbiB0aWNrcywgZm9yIGhvdyBsb25nIHRoZSBzeXN0ZW0gY2FuIHNsZWVwIG9yIHBvd2VyLWRvd24uCit1aW50MzJfdCBvc0tlcm5lbFN1c3BlbmQgKHZvaWQpOworCisvLy8gUmVzdW1lIHRoZSBSVE9TIEtlcm5lbCBzY2hlZHVsZXIuCisvLy8gXHBhcmFtW2luXSAgICAgc2xlZXBfdGlja3MgICB0aW1lIGluIHRpY2tzIGZvciBob3cgbG9uZyB0aGUgc3lzdGVtIHdhcyBpbiBzbGVlcCBvciBwb3dlci1kb3duIG1vZGUuCit2b2lkIG9zS2VybmVsUmVzdW1lICh1aW50MzJfdCBzbGVlcF90aWNrcyk7CisKKy8vLyBHZXQgdGhlIFJUT1Mga2VybmVsIHRpY2sgY291bnQuCisvLy8gXHJldHVybiBSVE9TIGtlcm5lbCBjdXJyZW50IHRpY2sgY291bnQuCit1aW50MzJfdCBvc0tlcm5lbEdldFRpY2tDb3VudCAodm9pZCk7CisKKy8vLyBHZXQgdGhlIFJUT1Mga2VybmVsIHRpY2sgZnJlcXVlbmN5LgorLy8vIFxyZXR1cm4gZnJlcXVlbmN5IG9mIHRoZSBrZXJuZWwgdGljayBpbiBoZXJ0eiwgaS5lLiBrZXJuZWwgdGlja3MgcGVyIHNlY29uZC4KK3VpbnQzMl90IG9zS2VybmVsR2V0VGlja0ZyZXEgKHZvaWQpOworCisvLy8gR2V0IHRoZSBSVE9TIGtlcm5lbCBzeXN0ZW0gdGltZXIgY291bnQuCisvLy8gXHJldHVybiBSVE9TIGtlcm5lbCBjdXJyZW50IHN5c3RlbSB0aW1lciBjb3VudCBhcyAzMi1iaXQgdmFsdWUuCit1aW50MzJfdCBvc0tlcm5lbEdldFN5c1RpbWVyQ291bnQgKHZvaWQpOworCisvLy8gR2V0IHRoZSBSVE9TIGtlcm5lbCBzeXN0ZW0gdGltZXIgZnJlcXVlbmN5LgorLy8vIFxyZXR1cm4gZnJlcXVlbmN5IG9mIHRoZSBzeXN0ZW0gdGltZXIgaW4gaGVydHosIGkuZS4gdGltZXIgdGlja3MgcGVyIHNlY29uZC4KK3VpbnQzMl90IG9zS2VybmVsR2V0U3lzVGltZXJGcmVxICh2b2lkKTsKKworCisvLyAgPT09PSBUaHJlYWQgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQorCisvLy8gQ3JlYXRlIGEgdGhyZWFkIGFuZCBhZGQgaXQgdG8gQWN0aXZlIFRocmVhZHMuCisvLy8gXHBhcmFtW2luXSAgICAgZnVuYyAgICAgICAgICB0aHJlYWQgZnVuY3Rpb24uCisvLy8gXHBhcmFtW2luXSAgICAgYXJndW1lbnQgICAgICBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB0aHJlYWQgZnVuY3Rpb24gYXMgc3RhcnQgYXJndW1lbnQuCisvLy8gXHBhcmFtW2luXSAgICAgYXR0ciAgICAgICAgICB0aHJlYWQgYXR0cmlidXRlczsgTlVMTDogZGVmYXVsdCB2YWx1ZXMuCisvLy8gXHJldHVybiB0aHJlYWQgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorb3NUaHJlYWRJZF90IG9zVGhyZWFkTmV3IChvc1RocmVhZEZ1bmNfdCBmdW5jLCB2b2lkICphcmd1bWVudCwgY29uc3Qgb3NUaHJlYWRBdHRyX3QgKmF0dHIpOworCisvLy8gR2V0IG5hbWUgb2YgYSB0aHJlYWQuCisvLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZE5ldyBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisvLy8gXHJldHVybiBuYW1lIGFzIE5VTEwgdGVybWluYXRlZCBzdHJpbmcuCitjb25zdCBjaGFyICpvc1RocmVhZEdldE5hbWUgKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQpOworCisvLy8gUmV0dXJuIHRoZSB0aHJlYWQgSUQgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0aHJlYWQuCisvLy8gXHJldHVybiB0aHJlYWQgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorb3NUaHJlYWRJZF90IG9zVGhyZWFkR2V0SWQgKHZvaWQpOworCisvLy8gR2V0IGN1cnJlbnQgdGhyZWFkIHN0YXRlIG9mIGEgdGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWROZXcgb3IgXHJlZiBvc1RocmVhZEdldElkLgorLy8vIFxyZXR1cm4gY3VycmVudCB0aHJlYWQgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQuCitvc1RocmVhZFN0YXRlX3Qgb3NUaHJlYWRHZXRTdGF0ZSAob3NUaHJlYWRJZF90IHRocmVhZF9pZCk7CisKKy8vLyBHZXQgc3RhY2sgc2l6ZSBvZiBhIHRocmVhZC4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkTmV3IG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccmV0dXJuIHN0YWNrIHNpemUgaW4gYnl0ZXMuCit1aW50MzJfdCBvc1RocmVhZEdldFN0YWNrU2l6ZSAob3NUaHJlYWRJZF90IHRocmVhZF9pZCk7CisKKy8vLyBHZXQgYXZhaWxhYmxlIHN0YWNrIHNwYWNlIG9mIGEgdGhyZWFkIGJhc2VkIG9uIHN0YWNrIHdhdGVybWFyayByZWNvcmRpbmcgZHVyaW5nIGV4ZWN1dGlvbi4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkTmV3IG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccmV0dXJuIHJlbWFpbmluZyBzdGFjayBzcGFjZSBpbiBieXRlcy4KK3VpbnQzMl90IG9zVGhyZWFkR2V0U3RhY2tTcGFjZSAob3NUaHJlYWRJZF90IHRocmVhZF9pZCk7CisKKy8vLyBDaGFuZ2UgcHJpb3JpdHkgb2YgYSB0aHJlYWQuCisvLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZE5ldyBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisvLy8gXHBhcmFtW2luXSAgICAgcHJpb3JpdHkgICAgICBuZXcgcHJpb3JpdHkgdmFsdWUgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1c190IG9zVGhyZWFkU2V0UHJpb3JpdHkgKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQsIG9zUHJpb3JpdHlfdCBwcmlvcml0eSk7CisKKy8vLyBHZXQgY3VycmVudCBwcmlvcml0eSBvZiBhIHRocmVhZC4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkTmV3IG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccmV0dXJuIGN1cnJlbnQgcHJpb3JpdHkgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQuCitvc1ByaW9yaXR5X3Qgb3NUaHJlYWRHZXRQcmlvcml0eSAob3NUaHJlYWRJZF90IHRocmVhZF9pZCk7CisKKy8vLyBQYXNzIGNvbnRyb2wgdG8gbmV4dCB0aHJlYWQgdGhhdCBpcyBpbiBzdGF0ZSBcYiBSRUFEWS4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzX3Qgb3NUaHJlYWRZaWVsZCAodm9pZCk7CisKKy8vLyBTdXNwZW5kIGV4ZWN1dGlvbiBvZiBhIHRocmVhZC4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkTmV3IG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzX3Qgb3NUaHJlYWRTdXNwZW5kIChvc1RocmVhZElkX3QgdGhyZWFkX2lkKTsKKworLy8vIFJlc3VtZSBleGVjdXRpb24gb2YgYSB0aHJlYWQuCisvLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZE5ldyBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1c190IG9zVGhyZWFkUmVzdW1lIChvc1RocmVhZElkX3QgdGhyZWFkX2lkKTsKKworLy8vIERldGFjaCBhIHRocmVhZCAodGhyZWFkIHN0b3JhZ2UgY2FuIGJlIHJlY2xhaW1lZCB3aGVuIHRocmVhZCB0ZXJtaW5hdGVzKS4KKy8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkTmV3IG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzX3Qgb3NUaHJlYWREZXRhY2ggKG9zVGhyZWFkSWRfdCB0aHJlYWRfaWQpOworCisvLy8gV2FpdCBmb3Igc3BlY2lmaWVkIHRocmVhZCB0byB0ZXJtaW5hdGUuCisvLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZE5ldyBvciBccmVmIG9zVGhyZWFkR2V0SWQuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1c190IG9zVGhyZWFkSm9pbiAob3NUaHJlYWRJZF90IHRocmVhZF9pZCk7CisKKy8vLyBUZXJtaW5hdGUgZXhlY3V0aW9uIG9mIGN1cnJlbnQgcnVubmluZyB0aHJlYWQuCitfX05PX1JFVFVSTiB2b2lkIG9zVGhyZWFkRXhpdCAodm9pZCk7CisKKy8vLyBUZXJtaW5hdGUgZXhlY3V0aW9uIG9mIGEgdGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWROZXcgb3IgXHJlZiBvc1RocmVhZEdldElkLgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc1RocmVhZFRlcm1pbmF0ZSAob3NUaHJlYWRJZF90IHRocmVhZF9pZCk7CisKKy8vLyBHZXQgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLgorLy8vIFxyZXR1cm4gbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLgordWludDMyX3Qgb3NUaHJlYWRHZXRDb3VudCAodm9pZCk7CisKKy8vLyBFbnVtZXJhdGUgYWN0aXZlIHRocmVhZHMuCisvLy8gXHBhcmFtW291dF0gICAgdGhyZWFkX2FycmF5ICBwb2ludGVyIHRvIGFycmF5IGZvciByZXRyaWV2aW5nIHRocmVhZCBJRHMuCisvLy8gXHBhcmFtW2luXSAgICAgYXJyYXlfaXRlbXMgICBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyBpbiBhcnJheSBmb3IgcmV0cmlldmluZyB0aHJlYWQgSURzLgorLy8vIFxyZXR1cm4gbnVtYmVyIG9mIGVudW1lcmF0ZWQgdGhyZWFkcy4KK3VpbnQzMl90IG9zVGhyZWFkRW51bWVyYXRlIChvc1RocmVhZElkX3QgKnRocmVhZF9hcnJheSwgdWludDMyX3QgYXJyYXlfaXRlbXMpOworCisKKy8vICA9PT09IFRocmVhZCBGbGFncyBGdW5jdGlvbnMgPT09PQorCisvLy8gU2V0IHRoZSBzcGVjaWZpZWQgVGhyZWFkIEZsYWdzIG9mIGEgdGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWROZXcgb3IgXHJlZiBvc1RocmVhZEdldElkLgorLy8vIFxwYXJhbVtpbl0gICAgIGZsYWdzICAgICAgICAgc3BlY2lmaWVzIHRoZSBmbGFncyBvZiB0aGUgdGhyZWFkIHRoYXQgc2hhbGwgYmUgc2V0LgorLy8vIFxyZXR1cm4gdGhyZWFkIGZsYWdzIGFmdGVyIHNldHRpbmcgb3IgZXJyb3IgY29kZSBpZiBoaWdoZXN0IGJpdCBzZXQuCit1aW50MzJfdCBvc1RocmVhZEZsYWdzU2V0IChvc1RocmVhZElkX3QgdGhyZWFkX2lkLCB1aW50MzJfdCBmbGFncyk7CisKKy8vLyBDbGVhciB0aGUgc3BlY2lmaWVkIFRocmVhZCBGbGFncyBvZiBjdXJyZW50IHJ1bm5pbmcgdGhyZWFkLgorLy8vIFxwYXJhbVtpbl0gICAgIGZsYWdzICAgICAgICAgc3BlY2lmaWVzIHRoZSBmbGFncyBvZiB0aGUgdGhyZWFkIHRoYXQgc2hhbGwgYmUgY2xlYXJlZC4KKy8vLyBccmV0dXJuIHRocmVhZCBmbGFncyBiZWZvcmUgY2xlYXJpbmcgb3IgZXJyb3IgY29kZSBpZiBoaWdoZXN0IGJpdCBzZXQuCit1aW50MzJfdCBvc1RocmVhZEZsYWdzQ2xlYXIgKHVpbnQzMl90IGZsYWdzKTsKKworLy8vIEdldCB0aGUgY3VycmVudCBUaHJlYWQgRmxhZ3Mgb2YgY3VycmVudCBydW5uaW5nIHRocmVhZC4KKy8vLyBccmV0dXJuIGN1cnJlbnQgdGhyZWFkIGZsYWdzLgordWludDMyX3Qgb3NUaHJlYWRGbGFnc0dldCAodm9pZCk7CisKKy8vLyBXYWl0IGZvciBvbmUgb3IgbW9yZSBUaHJlYWQgRmxhZ3Mgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0aHJlYWQgdG8gYmVjb21lIHNpZ25hbGVkLgorLy8vIFxwYXJhbVtpbl0gICAgIGZsYWdzICAgICAgICAgc3BlY2lmaWVzIHRoZSBmbGFncyB0byB3YWl0IGZvci4KKy8vLyBccGFyYW1baW5dICAgICBvcHRpb25zICAgICAgIHNwZWNpZmllcyBmbGFncyBvcHRpb25zIChvc0ZsYWdzWHh4eCkuCisvLy8gXHBhcmFtW2luXSAgICAgdGltZW91dCAgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKy8vLyBccmV0dXJuIHRocmVhZCBmbGFncyBiZWZvcmUgY2xlYXJpbmcgb3IgZXJyb3IgY29kZSBpZiBoaWdoZXN0IGJpdCBzZXQuCit1aW50MzJfdCBvc1RocmVhZEZsYWdzV2FpdCAodWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IG9wdGlvbnMsIHVpbnQzMl90IHRpbWVvdXQpOworCisKKy8vICA9PT09IEdlbmVyaWMgV2FpdCBGdW5jdGlvbnMgPT09PQorCisvLy8gV2FpdCBmb3IgVGltZW91dCAoVGltZSBEZWxheSkuCisvLy8gXHBhcmFtW2luXSAgICAgdGlja3MgICAgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlICJ0aW1lIHRpY2tzIiB2YWx1ZQorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc0RlbGF5ICh1aW50MzJfdCB0aWNrcyk7CisKKy8vLyBXYWl0IHVudGlsIHNwZWNpZmllZCB0aW1lLgorLy8vIFxwYXJhbVtpbl0gICAgIHRpY2tzICAgICAgICAgYWJzb2x1dGUgdGltZSBpbiB0aWNrcworLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc0RlbGF5VW50aWwgKHVpbnQzMl90IHRpY2tzKTsKKworCisvLyAgPT09PSBUaW1lciBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CisKKy8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSB0aW1lci4KKy8vLyBccGFyYW1baW5dICAgICBmdW5jICAgICAgICAgIGZ1bmN0aW9uIHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24uCisvLy8gXHBhcmFtW2luXSAgICAgdHlwZSAgICAgICAgICBccmVmIG9zVGltZXJPbmNlIGZvciBvbmUtc2hvdCBvciBccmVmIG9zVGltZXJQZXJpb2RpYyBmb3IgcGVyaW9kaWMgYmVoYXZpb3IuCisvLy8gXHBhcmFtW2luXSAgICAgYXJndW1lbnQgICAgICBhcmd1bWVudCB0byB0aGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24uCisvLy8gXHBhcmFtW2luXSAgICAgYXR0ciAgICAgICAgICB0aW1lciBhdHRyaWJ1dGVzOyBOVUxMOiBkZWZhdWx0IHZhbHVlcy4KKy8vLyBccmV0dXJuIHRpbWVyIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KK29zVGltZXJJZF90IG9zVGltZXJOZXcgKG9zVGltZXJGdW5jX3QgZnVuYywgb3NUaW1lclR5cGVfdCB0eXBlLCB2b2lkICphcmd1bWVudCwgY29uc3Qgb3NUaW1lckF0dHJfdCAqYXR0cik7CisKKy8vLyBHZXQgbmFtZSBvZiBhIHRpbWVyLgorLy8vIFxwYXJhbVtpbl0gICAgIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyTmV3LgorLy8vIFxyZXR1cm4gbmFtZSBhcyBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nLgorY29uc3QgY2hhciAqb3NUaW1lckdldE5hbWUgKG9zVGltZXJJZF90IHRpbWVyX2lkKTsKKworLy8vIFN0YXJ0IG9yIHJlc3RhcnQgYSB0aW1lci4KKy8vLyBccGFyYW1baW5dICAgICB0aW1lcl9pZCAgICAgIHRpbWVyIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaW1lck5ldy4KKy8vLyBccGFyYW1baW5dICAgICB0aWNrcyAgICAgICAgIFxyZWYgQ01TSVNfUlRPU19UaW1lT3V0VmFsdWUgInRpbWUgdGlja3MiIHZhbHVlIG9mIHRoZSB0aW1lci4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzX3Qgb3NUaW1lclN0YXJ0IChvc1RpbWVySWRfdCB0aW1lcl9pZCwgdWludDMyX3QgdGlja3MpOworCisvLy8gU3RvcCBhIHRpbWVyLgorLy8vIFxwYXJhbVtpbl0gICAgIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyTmV3LgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc1RpbWVyU3RvcCAob3NUaW1lcklkX3QgdGltZXJfaWQpOworCisvLy8gQ2hlY2sgaWYgYSB0aW1lciBpcyBydW5uaW5nLgorLy8vIFxwYXJhbVtpbl0gICAgIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyTmV3LgorLy8vIFxyZXR1cm4gMCBub3QgcnVubmluZywgMSBydW5uaW5nLgordWludDMyX3Qgb3NUaW1lcklzUnVubmluZyAob3NUaW1lcklkX3QgdGltZXJfaWQpOworCisvLy8gRGVsZXRlIGEgdGltZXIuCisvLy8gXHBhcmFtW2luXSAgICAgdGltZXJfaWQgICAgICB0aW1lciBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGltZXJOZXcuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1c190IG9zVGltZXJEZWxldGUgKG9zVGltZXJJZF90IHRpbWVyX2lkKTsKKworCisvLyAgPT09PSBFdmVudCBGbGFncyBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CisKKy8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYW4gRXZlbnQgRmxhZ3Mgb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIGF0dHIgICAgICAgICAgZXZlbnQgZmxhZ3MgYXR0cmlidXRlczsgTlVMTDogZGVmYXVsdCB2YWx1ZXMuCisvLy8gXHJldHVybiBldmVudCBmbGFncyBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitvc0V2ZW50RmxhZ3NJZF90IG9zRXZlbnRGbGFnc05ldyAoY29uc3Qgb3NFdmVudEZsYWdzQXR0cl90ICphdHRyKTsKKworLy8vIEdldCBuYW1lIG9mIGFuIEV2ZW50IEZsYWdzIG9iamVjdC4KKy8vLyBccGFyYW1baW5dICAgICBlZl9pZCAgICAgICAgIGV2ZW50IGZsYWdzIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NFdmVudEZsYWdzTmV3LgorLy8vIFxyZXR1cm4gbmFtZSBhcyBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nLgorY29uc3QgY2hhciAqb3NFdmVudEZsYWdzR2V0TmFtZSAob3NFdmVudEZsYWdzSWRfdCBlZl9pZCk7CisKKy8vLyBTZXQgdGhlIHNwZWNpZmllZCBFdmVudCBGbGFncy4KKy8vLyBccGFyYW1baW5dICAgICBlZl9pZCAgICAgICAgIGV2ZW50IGZsYWdzIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NFdmVudEZsYWdzTmV3LgorLy8vIFxwYXJhbVtpbl0gICAgIGZsYWdzICAgICAgICAgc3BlY2lmaWVzIHRoZSBmbGFncyB0aGF0IHNoYWxsIGJlIHNldC4KKy8vLyBccmV0dXJuIGV2ZW50IGZsYWdzIGFmdGVyIHNldHRpbmcgb3IgZXJyb3IgY29kZSBpZiBoaWdoZXN0IGJpdCBzZXQuCit1aW50MzJfdCBvc0V2ZW50RmxhZ3NTZXQgKG9zRXZlbnRGbGFnc0lkX3QgZWZfaWQsIHVpbnQzMl90IGZsYWdzKTsKKworLy8vIENsZWFyIHRoZSBzcGVjaWZpZWQgRXZlbnQgRmxhZ3MuCisvLy8gXHBhcmFtW2luXSAgICAgZWZfaWQgICAgICAgICBldmVudCBmbGFncyBJRCBvYnRhaW5lZCBieSBccmVmIG9zRXZlbnRGbGFnc05ldy4KKy8vLyBccGFyYW1baW5dICAgICBmbGFncyAgICAgICAgIHNwZWNpZmllcyB0aGUgZmxhZ3MgdGhhdCBzaGFsbCBiZSBjbGVhcmVkLgorLy8vIFxyZXR1cm4gZXZlbnQgZmxhZ3MgYmVmb3JlIGNsZWFyaW5nIG9yIGVycm9yIGNvZGUgaWYgaGlnaGVzdCBiaXQgc2V0LgordWludDMyX3Qgb3NFdmVudEZsYWdzQ2xlYXIgKG9zRXZlbnRGbGFnc0lkX3QgZWZfaWQsIHVpbnQzMl90IGZsYWdzKTsKKworLy8vIEdldCB0aGUgY3VycmVudCBFdmVudCBGbGFncy4KKy8vLyBccGFyYW1baW5dICAgICBlZl9pZCAgICAgICAgIGV2ZW50IGZsYWdzIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NFdmVudEZsYWdzTmV3LgorLy8vIFxyZXR1cm4gY3VycmVudCBldmVudCBmbGFncy4KK3VpbnQzMl90IG9zRXZlbnRGbGFnc0dldCAob3NFdmVudEZsYWdzSWRfdCBlZl9pZCk7CisKKy8vLyBXYWl0IGZvciBvbmUgb3IgbW9yZSBFdmVudCBGbGFncyB0byBiZWNvbWUgc2lnbmFsZWQuCisvLy8gXHBhcmFtW2luXSAgICAgZWZfaWQgICAgICAgICBldmVudCBmbGFncyBJRCBvYnRhaW5lZCBieSBccmVmIG9zRXZlbnRGbGFnc05ldy4KKy8vLyBccGFyYW1baW5dICAgICBmbGFncyAgICAgICAgIHNwZWNpZmllcyB0aGUgZmxhZ3MgdG8gd2FpdCBmb3IuCisvLy8gXHBhcmFtW2luXSAgICAgb3B0aW9ucyAgICAgICBzcGVjaWZpZXMgZmxhZ3Mgb3B0aW9ucyAob3NGbGFnc1h4eHgpLgorLy8vIFxwYXJhbVtpbl0gICAgIHRpbWVvdXQgICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCisvLy8gXHJldHVybiBldmVudCBmbGFncyBiZWZvcmUgY2xlYXJpbmcgb3IgZXJyb3IgY29kZSBpZiBoaWdoZXN0IGJpdCBzZXQuCit1aW50MzJfdCBvc0V2ZW50RmxhZ3NXYWl0IChvc0V2ZW50RmxhZ3NJZF90IGVmX2lkLCB1aW50MzJfdCBmbGFncywgdWludDMyX3Qgb3B0aW9ucywgdWludDMyX3QgdGltZW91dCk7CisKKy8vLyBEZWxldGUgYW4gRXZlbnQgRmxhZ3Mgb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIGVmX2lkICAgICAgICAgZXZlbnQgZmxhZ3MgSUQgb2J0YWluZWQgYnkgXHJlZiBvc0V2ZW50RmxhZ3NOZXcuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1c190IG9zRXZlbnRGbGFnc0RlbGV0ZSAob3NFdmVudEZsYWdzSWRfdCBlZl9pZCk7CisKKworLy8gID09PT0gTXV0ZXggTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQorCisvLy8gQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgTXV0ZXggb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIGF0dHIgICAgICAgICAgbXV0ZXggYXR0cmlidXRlczsgTlVMTDogZGVmYXVsdCB2YWx1ZXMuCisvLy8gXHJldHVybiBtdXRleCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitvc011dGV4SWRfdCBvc011dGV4TmV3IChjb25zdCBvc011dGV4QXR0cl90ICphdHRyKTsKKworLy8vIEdldCBuYW1lIG9mIGEgTXV0ZXggb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIG11dGV4X2lkICAgICAgbXV0ZXggSUQgb2J0YWluZWQgYnkgXHJlZiBvc011dGV4TmV3LgorLy8vIFxyZXR1cm4gbmFtZSBhcyBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nLgorY29uc3QgY2hhciAqb3NNdXRleEdldE5hbWUgKG9zTXV0ZXhJZF90IG11dGV4X2lkKTsKKworLy8vIEFjcXVpcmUgYSBNdXRleCBvciB0aW1lb3V0IGlmIGl0IGlzIGxvY2tlZC4KKy8vLyBccGFyYW1baW5dICAgICBtdXRleF9pZCAgICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleE5ldy4KKy8vLyBccGFyYW1baW5dICAgICB0aW1lb3V0ICAgICAgIFxyZWYgQ01TSVNfUlRPU19UaW1lT3V0VmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc011dGV4QWNxdWlyZSAob3NNdXRleElkX3QgbXV0ZXhfaWQsIHVpbnQzMl90IHRpbWVvdXQpOworCisvLy8gUmVsZWFzZSBhIE11dGV4IHRoYXQgd2FzIGFjcXVpcmVkIGJ5IFxyZWYgb3NNdXRleEFjcXVpcmUuCisvLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhOZXcuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1c190IG9zTXV0ZXhSZWxlYXNlIChvc011dGV4SWRfdCBtdXRleF9pZCk7CisKKy8vLyBHZXQgVGhyZWFkIHdoaWNoIG93bnMgYSBNdXRleCBvYmplY3QuCisvLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhOZXcuCisvLy8gXHJldHVybiB0aHJlYWQgSUQgb2Ygb3duZXIgdGhyZWFkIG9yIE5VTEwgd2hlbiBtdXRleCB3YXMgbm90IGFjcXVpcmVkLgorb3NUaHJlYWRJZF90IG9zTXV0ZXhHZXRPd25lciAob3NNdXRleElkX3QgbXV0ZXhfaWQpOworCisvLy8gRGVsZXRlIGEgTXV0ZXggb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIG11dGV4X2lkICAgICAgbXV0ZXggSUQgb2J0YWluZWQgYnkgXHJlZiBvc011dGV4TmV3LgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc011dGV4RGVsZXRlIChvc011dGV4SWRfdCBtdXRleF9pZCk7CisKKworLy8gID09PT0gU2VtYXBob3JlIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KKworLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIFNlbWFwaG9yZSBvYmplY3QuCisvLy8gXHBhcmFtW2luXSAgICAgbWF4X2NvdW50ICAgICBtYXhpbXVtIG51bWJlciBvZiBhdmFpbGFibGUgdG9rZW5zLgorLy8vIFxwYXJhbVtpbl0gICAgIGluaXRpYWxfY291bnQgaW5pdGlhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHRva2Vucy4KKy8vLyBccGFyYW1baW5dICAgICBhdHRyICAgICAgICAgIHNlbWFwaG9yZSBhdHRyaWJ1dGVzOyBOVUxMOiBkZWZhdWx0IHZhbHVlcy4KKy8vLyBccmV0dXJuIHNlbWFwaG9yZSBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitvc1NlbWFwaG9yZUlkX3Qgb3NTZW1hcGhvcmVOZXcgKHVpbnQzMl90IG1heF9jb3VudCwgdWludDMyX3QgaW5pdGlhbF9jb3VudCwgY29uc3Qgb3NTZW1hcGhvcmVBdHRyX3QgKmF0dHIpOworCisvLy8gR2V0IG5hbWUgb2YgYSBTZW1hcGhvcmUgb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NTZW1hcGhvcmVOZXcuCisvLy8gXHJldHVybiBuYW1lIGFzIE5VTEwgdGVybWluYXRlZCBzdHJpbmcuCitjb25zdCBjaGFyICpvc1NlbWFwaG9yZUdldE5hbWUgKG9zU2VtYXBob3JlSWRfdCBzZW1hcGhvcmVfaWQpOworCisvLy8gQWNxdWlyZSBhIFNlbWFwaG9yZSB0b2tlbiBvciB0aW1lb3V0IGlmIG5vIHRva2VucyBhcmUgYXZhaWxhYmxlLgorLy8vIFxwYXJhbVtpbl0gICAgIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NTZW1hcGhvcmVOZXcuCisvLy8gXHBhcmFtW2luXSAgICAgdGltZW91dCAgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzX3Qgb3NTZW1hcGhvcmVBY3F1aXJlIChvc1NlbWFwaG9yZUlkX3Qgc2VtYXBob3JlX2lkLCB1aW50MzJfdCB0aW1lb3V0KTsKKworLy8vIFJlbGVhc2UgYSBTZW1hcGhvcmUgdG9rZW4gdXAgdG8gdGhlIGluaXRpYWwgbWF4aW11bSBjb3VudC4KKy8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBJRCBvYnRhaW5lZCBieSBccmVmIG9zU2VtYXBob3JlTmV3LgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc1NlbWFwaG9yZVJlbGVhc2UgKG9zU2VtYXBob3JlSWRfdCBzZW1hcGhvcmVfaWQpOworCisvLy8gR2V0IGN1cnJlbnQgU2VtYXBob3JlIHRva2VuIGNvdW50LgorLy8vIFxwYXJhbVtpbl0gICAgIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NTZW1hcGhvcmVOZXcuCisvLy8gXHJldHVybiBudW1iZXIgb2YgdG9rZW5zIGF2YWlsYWJsZS4KK3VpbnQzMl90IG9zU2VtYXBob3JlR2V0Q291bnQgKG9zU2VtYXBob3JlSWRfdCBzZW1hcGhvcmVfaWQpOworCisvLy8gRGVsZXRlIGEgU2VtYXBob3JlIG9iamVjdC4KKy8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBJRCBvYnRhaW5lZCBieSBccmVmIG9zU2VtYXBob3JlTmV3LgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc1NlbWFwaG9yZURlbGV0ZSAob3NTZW1hcGhvcmVJZF90IHNlbWFwaG9yZV9pZCk7CisKKworLy8gID09PT0gTWVtb3J5IFBvb2wgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQorCisvLy8gQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgTWVtb3J5IFBvb2wgb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIGJsb2NrX2NvdW50ICAgbWF4aW11bSBudW1iZXIgb2YgbWVtb3J5IGJsb2NrcyBpbiBtZW1vcnkgcG9vbC4KKy8vLyBccGFyYW1baW5dICAgICBibG9ja19zaXplICAgIG1lbW9yeSBibG9jayBzaXplIGluIGJ5dGVzLgorLy8vIFxwYXJhbVtpbl0gICAgIGF0dHIgICAgICAgICAgbWVtb3J5IHBvb2wgYXR0cmlidXRlczsgTlVMTDogZGVmYXVsdCB2YWx1ZXMuCisvLy8gXHJldHVybiBtZW1vcnkgcG9vbCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitvc01lbW9yeVBvb2xJZF90IG9zTWVtb3J5UG9vbE5ldyAodWludDMyX3QgYmxvY2tfY291bnQsIHVpbnQzMl90IGJsb2NrX3NpemUsIGNvbnN0IG9zTWVtb3J5UG9vbEF0dHJfdCAqYXR0cik7CisKKy8vLyBHZXQgbmFtZSBvZiBhIE1lbW9yeSBQb29sIG9iamVjdC4KKy8vLyBccGFyYW1baW5dICAgICBtcF9pZCAgICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNZW1vcnlQb29sTmV3LgorLy8vIFxyZXR1cm4gbmFtZSBhcyBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nLgorY29uc3QgY2hhciAqb3NNZW1vcnlQb29sR2V0TmFtZSAob3NNZW1vcnlQb29sSWRfdCBtcF9pZCk7CisKKy8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgTWVtb3J5IFBvb2wuCisvLy8gXHBhcmFtW2luXSAgICAgbXBfaWQgICAgICAgICBtZW1vcnkgcG9vbCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTWVtb3J5UG9vbE5ldy4KKy8vLyBccGFyYW1baW5dICAgICB0aW1lb3V0ICAgICAgIFxyZWYgQ01TSVNfUlRPU19UaW1lT3V0VmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgorLy8vIFxyZXR1cm4gYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBvciBOVUxMIGluIGNhc2Ugb2Ygbm8gbWVtb3J5IGlzIGF2YWlsYWJsZS4KK3ZvaWQgKm9zTWVtb3J5UG9vbEFsbG9jIChvc01lbW9yeVBvb2xJZF90IG1wX2lkLCB1aW50MzJfdCB0aW1lb3V0KTsKKworLy8vIFJldHVybiBhbiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIGJhY2sgdG8gYSBNZW1vcnkgUG9vbC4KKy8vLyBccGFyYW1baW5dICAgICBtcF9pZCAgICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNZW1vcnlQb29sTmV3LgorLy8vIFxwYXJhbVtpbl0gICAgIGJsb2NrICAgICAgICAgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jayB0byBiZSByZXR1cm5lZCB0byB0aGUgbWVtb3J5IHBvb2wuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1c190IG9zTWVtb3J5UG9vbEZyZWUgKG9zTWVtb3J5UG9vbElkX3QgbXBfaWQsIHZvaWQgKmJsb2NrKTsKKworLy8vIEdldCBtYXhpbXVtIG51bWJlciBvZiBtZW1vcnkgYmxvY2tzIGluIGEgTWVtb3J5IFBvb2wuCisvLy8gXHBhcmFtW2luXSAgICAgbXBfaWQgICAgICAgICBtZW1vcnkgcG9vbCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTWVtb3J5UG9vbE5ldy4KKy8vLyBccmV0dXJuIG1heGltdW0gbnVtYmVyIG9mIG1lbW9yeSBibG9ja3MuCit1aW50MzJfdCBvc01lbW9yeVBvb2xHZXRDYXBhY2l0eSAob3NNZW1vcnlQb29sSWRfdCBtcF9pZCk7CisKKy8vLyBHZXQgbWVtb3J5IGJsb2NrIHNpemUgaW4gYSBNZW1vcnkgUG9vbC4KKy8vLyBccGFyYW1baW5dICAgICBtcF9pZCAgICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNZW1vcnlQb29sTmV3LgorLy8vIFxyZXR1cm4gbWVtb3J5IGJsb2NrIHNpemUgaW4gYnl0ZXMuCit1aW50MzJfdCBvc01lbW9yeVBvb2xHZXRCbG9ja1NpemUgKG9zTWVtb3J5UG9vbElkX3QgbXBfaWQpOworCisvLy8gR2V0IG51bWJlciBvZiBtZW1vcnkgYmxvY2tzIHVzZWQgaW4gYSBNZW1vcnkgUG9vbC4KKy8vLyBccGFyYW1baW5dICAgICBtcF9pZCAgICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNZW1vcnlQb29sTmV3LgorLy8vIFxyZXR1cm4gbnVtYmVyIG9mIG1lbW9yeSBibG9ja3MgdXNlZC4KK3VpbnQzMl90IG9zTWVtb3J5UG9vbEdldENvdW50IChvc01lbW9yeVBvb2xJZF90IG1wX2lkKTsKKworLy8vIEdldCBudW1iZXIgb2YgbWVtb3J5IGJsb2NrcyBhdmFpbGFibGUgaW4gYSBNZW1vcnkgUG9vbC4KKy8vLyBccGFyYW1baW5dICAgICBtcF9pZCAgICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNZW1vcnlQb29sTmV3LgorLy8vIFxyZXR1cm4gbnVtYmVyIG9mIG1lbW9yeSBibG9ja3MgYXZhaWxhYmxlLgordWludDMyX3Qgb3NNZW1vcnlQb29sR2V0U3BhY2UgKG9zTWVtb3J5UG9vbElkX3QgbXBfaWQpOworCisvLy8gRGVsZXRlIGEgTWVtb3J5IFBvb2wgb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIG1wX2lkICAgICAgICAgbWVtb3J5IHBvb2wgSUQgb2J0YWluZWQgYnkgXHJlZiBvc01lbW9yeVBvb2xOZXcuCisvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCitvc1N0YXR1c190IG9zTWVtb3J5UG9vbERlbGV0ZSAob3NNZW1vcnlQb29sSWRfdCBtcF9pZCk7CisKKworLy8gID09PT0gTWVzc2FnZSBRdWV1ZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CisKKy8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBNZXNzYWdlIFF1ZXVlIG9iamVjdC4KKy8vLyBccGFyYW1baW5dICAgICBtc2dfY291bnQgICAgIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIGluIHF1ZXVlLgorLy8vIFxwYXJhbVtpbl0gICAgIG1zZ19zaXplICAgICAgbWF4aW11bSBtZXNzYWdlIHNpemUgaW4gYnl0ZXMuCisvLy8gXHBhcmFtW2luXSAgICAgYXR0ciAgICAgICAgICBtZXNzYWdlIHF1ZXVlIGF0dHJpYnV0ZXM7IE5VTEw6IGRlZmF1bHQgdmFsdWVzLgorLy8vIFxyZXR1cm4gbWVzc2FnZSBxdWV1ZSBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitvc01lc3NhZ2VRdWV1ZUlkX3Qgb3NNZXNzYWdlUXVldWVOZXcgKHVpbnQzMl90IG1zZ19jb3VudCwgdWludDMyX3QgbXNnX3NpemUsIGNvbnN0IG9zTWVzc2FnZVF1ZXVlQXR0cl90ICphdHRyKTsKKworLy8vIEdldCBuYW1lIG9mIGEgTWVzc2FnZSBRdWV1ZSBvYmplY3QuCisvLy8gXHBhcmFtW2luXSAgICAgbXFfaWQgICAgICAgICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNZXNzYWdlUXVldWVOZXcuCisvLy8gXHJldHVybiBuYW1lIGFzIE5VTEwgdGVybWluYXRlZCBzdHJpbmcuCitjb25zdCBjaGFyICpvc01lc3NhZ2VRdWV1ZUdldE5hbWUgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCk7CisKKy8vLyBQdXQgYSBNZXNzYWdlIGludG8gYSBRdWV1ZSBvciB0aW1lb3V0IGlmIFF1ZXVlIGlzIGZ1bGwuCisvLy8gXHBhcmFtW2luXSAgICAgbXFfaWQgICAgICAgICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNZXNzYWdlUXVldWVOZXcuCisvLy8gXHBhcmFtW2luXSAgICAgbXNnX3B0ciAgICAgICBwb2ludGVyIHRvIGJ1ZmZlciB3aXRoIG1lc3NhZ2UgdG8gcHV0IGludG8gYSBxdWV1ZS4KKy8vLyBccGFyYW1baW5dICAgICBtc2dfcHJpbyAgICAgIG1lc3NhZ2UgcHJpb3JpdHkuCisvLy8gXHBhcmFtW2luXSAgICAgdGltZW91dCAgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzX3Qgb3NNZXNzYWdlUXVldWVQdXQgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCwgY29uc3Qgdm9pZCAqbXNnX3B0ciwgdWludDhfdCBtc2dfcHJpbywgdWludDMyX3QgdGltZW91dCk7CisKKy8vLyBHZXQgYSBNZXNzYWdlIGZyb20gYSBRdWV1ZSBvciB0aW1lb3V0IGlmIFF1ZXVlIGlzIGVtcHR5LgorLy8vIFxwYXJhbVtpbl0gICAgIG1xX2lkICAgICAgICAgbWVzc2FnZSBxdWV1ZSBJRCBvYnRhaW5lZCBieSBccmVmIG9zTWVzc2FnZVF1ZXVlTmV3LgorLy8vIFxwYXJhbVtvdXRdICAgIG1zZ19wdHIgICAgICAgcG9pbnRlciB0byBidWZmZXIgZm9yIG1lc3NhZ2UgdG8gZ2V0IGZyb20gYSBxdWV1ZS4KKy8vLyBccGFyYW1bb3V0XSAgICBtc2dfcHJpbyAgICAgIHBvaW50ZXIgdG8gYnVmZmVyIGZvciBtZXNzYWdlIHByaW9yaXR5IG9yIE5VTEwuCisvLy8gXHBhcmFtW2luXSAgICAgdGltZW91dCAgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzX3Qgb3NNZXNzYWdlUXVldWVHZXQgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCwgdm9pZCAqbXNnX3B0ciwgdWludDhfdCAqbXNnX3ByaW8sIHVpbnQzMl90IHRpbWVvdXQpOworCisvLy8gR2V0IG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIGluIGEgTWVzc2FnZSBRdWV1ZS4KKy8vLyBccGFyYW1baW5dICAgICBtcV9pZCAgICAgICAgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgYnkgXHJlZiBvc01lc3NhZ2VRdWV1ZU5ldy4KKy8vLyBccmV0dXJuIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzLgordWludDMyX3Qgb3NNZXNzYWdlUXVldWVHZXRDYXBhY2l0eSAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKTsKKworLy8vIEdldCBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZSBpbiBhIE1lbW9yeSBQb29sLgorLy8vIFxwYXJhbVtpbl0gICAgIG1xX2lkICAgICAgICAgbWVzc2FnZSBxdWV1ZSBJRCBvYnRhaW5lZCBieSBccmVmIG9zTWVzc2FnZVF1ZXVlTmV3LgorLy8vIFxyZXR1cm4gbWF4aW11bSBtZXNzYWdlIHNpemUgaW4gYnl0ZXMuCit1aW50MzJfdCBvc01lc3NhZ2VRdWV1ZUdldE1zZ1NpemUgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCk7CisKKy8vLyBHZXQgbnVtYmVyIG9mIHF1ZXVlZCBtZXNzYWdlcyBpbiBhIE1lc3NhZ2UgUXVldWUuCisvLy8gXHBhcmFtW2luXSAgICAgbXFfaWQgICAgICAgICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNZXNzYWdlUXVldWVOZXcuCisvLy8gXHJldHVybiBudW1iZXIgb2YgcXVldWVkIG1lc3NhZ2VzLgordWludDMyX3Qgb3NNZXNzYWdlUXVldWVHZXRDb3VudCAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKTsKKworLy8vIEdldCBudW1iZXIgb2YgYXZhaWxhYmxlIHNsb3RzIGZvciBtZXNzYWdlcyBpbiBhIE1lc3NhZ2UgUXVldWUuCisvLy8gXHBhcmFtW2luXSAgICAgbXFfaWQgICAgICAgICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNZXNzYWdlUXVldWVOZXcuCisvLy8gXHJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIHNsb3RzIGZvciBtZXNzYWdlcy4KK3VpbnQzMl90IG9zTWVzc2FnZVF1ZXVlR2V0U3BhY2UgKG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZCk7CisKKy8vLyBSZXNldCBhIE1lc3NhZ2UgUXVldWUgdG8gaW5pdGlhbCBlbXB0eSBzdGF0ZS4KKy8vLyBccGFyYW1baW5dICAgICBtcV9pZCAgICAgICAgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgYnkgXHJlZiBvc01lc3NhZ2VRdWV1ZU5ldy4KKy8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KK29zU3RhdHVzX3Qgb3NNZXNzYWdlUXVldWVSZXNldCAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKTsKKworLy8vIERlbGV0ZSBhIE1lc3NhZ2UgUXVldWUgb2JqZWN0LgorLy8vIFxwYXJhbVtpbl0gICAgIG1xX2lkICAgICAgICAgbWVzc2FnZSBxdWV1ZSBJRCBvYnRhaW5lZCBieSBccmVmIG9zTWVzc2FnZVF1ZXVlTmV3LgorLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgorb3NTdGF0dXNfdCBvc01lc3NhZ2VRdWV1ZURlbGV0ZSAob3NNZXNzYWdlUXVldWVJZF90IG1xX2lkKTsKKworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBDTVNJU19PUzJfSF8KZGlmZiAtLWdpdCBhL1NvdXJjZS9jcm91dGluZS5jIGIvU291cmNlL2Nyb3V0aW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxNTg4NAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9jcm91dGluZS5jCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgImNyb3V0aW5lLmgiCisKKy8qIFJlbW92ZSB0aGUgd2hvbGUgZmlsZSBpcyBjby1yb3V0aW5lcyBhcmUgbm90IGJlaW5nIHVzZWQuICovCisjaWYoIGNvbmZpZ1VTRV9DT19ST1VUSU5FUyAhPSAwICkKKworLyoKKyAqIFNvbWUga2VybmVsIGF3YXJlIGRlYnVnZ2VycyByZXF1aXJlIGRhdGEgdG8gYmUgdmlld2VkIHRvIGJlIGdsb2JhbCwgcmF0aGVyCisgKiB0aGFuIGZpbGUgc2NvcGUuCisgKi8KKyNpZmRlZiBwb3J0UkVNT1ZFX1NUQVRJQ19RVUFMSUZJRVIKKwkjZGVmaW5lIHN0YXRpYworI2VuZGlmCisKKworLyogTGlzdHMgZm9yIHJlYWR5IGFuZCBibG9ja2VkIGNvLXJvdXRpbmVzLiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgTGlzdF90IHB4UmVhZHlDb1JvdXRpbmVMaXN0c1sgY29uZmlnTUFYX0NPX1JPVVRJTkVfUFJJT1JJVElFUyBdOwkvKjwgUHJpb3JpdGlzZWQgcmVhZHkgY28tcm91dGluZXMuICovCitzdGF0aWMgTGlzdF90IHhEZWxheWVkQ29Sb3V0aW5lTGlzdDE7CQkJCQkJCQkJLyo8IERlbGF5ZWQgY28tcm91dGluZXMuICovCitzdGF0aWMgTGlzdF90IHhEZWxheWVkQ29Sb3V0aW5lTGlzdDI7CQkJCQkJCQkJLyo8IERlbGF5ZWQgY28tcm91dGluZXMgKHR3byBsaXN0cyBhcmUgdXNlZCAtIG9uZSBmb3IgZGVsYXlzIHRoYXQgaGF2ZSBvdmVyZmxvd2VkIHRoZSBjdXJyZW50IHRpY2sgY291bnQuICovCitzdGF0aWMgTGlzdF90ICogcHhEZWxheWVkQ29Sb3V0aW5lTGlzdDsJCQkJCQkJCQkvKjwgUG9pbnRzIHRvIHRoZSBkZWxheWVkIGNvLXJvdXRpbmUgbGlzdCBjdXJyZW50bHkgYmVpbmcgdXNlZC4gKi8KK3N0YXRpYyBMaXN0X3QgKiBweE92ZXJmbG93RGVsYXllZENvUm91dGluZUxpc3Q7CQkJCQkJCS8qPCBQb2ludHMgdG8gdGhlIGRlbGF5ZWQgY28tcm91dGluZSBsaXN0IGN1cnJlbnRseSBiZWluZyB1c2VkIHRvIGhvbGQgY28tcm91dGluZXMgdGhhdCBoYXZlIG92ZXJmbG93ZWQgdGhlIGN1cnJlbnQgdGljayBjb3VudC4gKi8KK3N0YXRpYyBMaXN0X3QgeFBlbmRpbmdSZWFkeUNvUm91dGluZUxpc3Q7CQkJCQkJCQkvKjwgSG9sZHMgY28tcm91dGluZXMgdGhhdCBoYXZlIGJlZW4gcmVhZGllZCBieSBhbiBleHRlcm5hbCBldmVudC4gIFRoZXkgY2Fubm90IGJlIGFkZGVkIGRpcmVjdGx5IHRvIHRoZSByZWFkeSBsaXN0cyBhcyB0aGUgcmVhZHkgbGlzdHMgY2Fubm90IGJlIGFjY2Vzc2VkIGJ5IGludGVycnVwdHMuICovCisKKy8qIE90aGVyIGZpbGUgcHJpdmF0ZSB2YXJpYWJsZXMuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NSQ0JfdCAqIHB4Q3VycmVudENvUm91dGluZSA9IE5VTEw7CitzdGF0aWMgVUJhc2VUeXBlX3QgdXhUb3BDb1JvdXRpbmVSZWFkeVByaW9yaXR5ID0gMDsKK3N0YXRpYyBUaWNrVHlwZV90IHhDb1JvdXRpbmVUaWNrQ291bnQgPSAwLCB4TGFzdFRpY2tDb3VudCA9IDAsIHhQYXNzZWRUaWNrcyA9IDA7CisKKy8qIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBjby1yb3V0aW5lIHdoZW4gaXQgaXMgY3JlYXRlZC4gKi8KKyNkZWZpbmUgY29ySU5JVElBTF9TVEFURQkoIDAgKQorCisvKgorICogUGxhY2UgdGhlIGNvLXJvdXRpbmUgcmVwcmVzZW50ZWQgYnkgcHhDUkNCIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlYWR5IHF1ZXVlCisgKiBmb3IgdGhlIHByaW9yaXR5LiAgSXQgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAqCisgKiBUaGlzIG1hY3JvIGFjY2Vzc2VzIHRoZSBjby1yb3V0aW5lIHJlYWR5IGxpc3RzIGFuZCB0aGVyZWZvcmUgbXVzdCBub3QgYmUKKyAqIHVzZWQgZnJvbSB3aXRoaW4gYW4gSVNSLgorICovCisjZGVmaW5lIHBydkFkZENvUm91dGluZVRvUmVhZHlRdWV1ZSggcHhDUkNCICkJCQkJCQkJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJaWYoIHB4Q1JDQi0+dXhQcmlvcml0eSA+IHV4VG9wQ29Sb3V0aW5lUmVhZHlQcmlvcml0eSApCQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQl1eFRvcENvUm91dGluZVJlYWR5UHJpb3JpdHkgPSBweENSQ0ItPnV4UHJpb3JpdHk7CQkJCQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCXZMaXN0SW5zZXJ0RW5kKCAoIExpc3RfdCAqICkgJiggcHhSZWFkeUNvUm91dGluZUxpc3RzWyBweENSQ0ItPnV4UHJpb3JpdHkgXSApLCAmKCBweENSQ0ItPnhHZW5lcmljTGlzdEl0ZW0gKSApOwlcCit9CisKKy8qCisgKiBVdGlsaXR5IHRvIHJlYWR5IGFsbCB0aGUgbGlzdHMgdXNlZCBieSB0aGUgc2NoZWR1bGVyLiAgVGhpcyBpcyBjYWxsZWQKKyAqIGF1dG9tYXRpY2FsbHkgdXBvbiB0aGUgY3JlYXRpb24gb2YgdGhlIGZpcnN0IGNvLXJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHBydkluaXRpYWxpc2VDb1JvdXRpbmVMaXN0cyggdm9pZCApOworCisvKgorICogQ28tcm91dGluZXMgdGhhdCBhcmUgcmVhZGllZCBieSBhbiBpbnRlcnJ1cHQgY2Fubm90IGJlIHBsYWNlZCBkaXJlY3RseSBpbnRvCisgKiB0aGUgcmVhZHkgbGlzdHMgKHRoZXJlIGlzIG5vIG11dHVhbCBleGNsdXNpb24pLiAgSW5zdGVhZCB0aGV5IGFyZSBwbGFjZWQgaW4KKyAqIGluIHRoZSBwZW5kaW5nIHJlYWR5IGxpc3QgaW4gb3JkZXIgdGhhdCB0aGV5IGNhbiBsYXRlciBiZSBtb3ZlZCB0byB0aGUgcmVhZHkKKyAqIGxpc3QgYnkgdGhlIGNvLXJvdXRpbmUgc2NoZWR1bGVyLgorICovCitzdGF0aWMgdm9pZCBwcnZDaGVja1BlbmRpbmdSZWFkeUxpc3QoIHZvaWQgKTsKKworLyoKKyAqIE1hY3JvIHRoYXQgbG9va3MgYXQgdGhlIGxpc3Qgb2YgY28tcm91dGluZXMgdGhhdCBhcmUgY3VycmVudGx5IGRlbGF5ZWQgdG8KKyAqIHNlZSBpZiBhbnkgcmVxdWlyZSB3YWtpbmcuCisgKgorICogQ28tcm91dGluZXMgYXJlIHN0b3JlZCBpbiB0aGUgcXVldWUgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIHdha2UgdGltZSAtCisgKiBtZWFuaW5nIG9uY2Ugb25lIGNvLXJvdXRpbmUgaGFzIGJlZW4gZm91bmQgd2hvc2UgdGltZXIgaGFzIG5vdCBleHBpcmVkCisgKiB3ZSBuZWVkIG5vdCBsb29rIGFueSBmdXJ0aGVyIGRvd24gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIHBydkNoZWNrRGVsYXllZExpc3QoIHZvaWQgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeENvUm91dGluZUNyZWF0ZSggY3JDT1JPVVRJTkVfQ09ERSBweENvUm91dGluZUNvZGUsIFVCYXNlVHlwZV90IHV4UHJpb3JpdHksIFVCYXNlVHlwZV90IHV4SW5kZXggKQoreworQmFzZVR5cGVfdCB4UmV0dXJuOworQ1JDQl90ICpweENvUm91dGluZTsKKworCS8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgdGhhdCB3aWxsIHN0b3JlIHRoZSBjby1yb3V0aW5lIGNvbnRyb2wgYmxvY2suICovCisJcHhDb1JvdXRpbmUgPSAoIENSQ0JfdCAqICkgcHZQb3J0TWFsbG9jKCBzaXplb2YoIENSQ0JfdCApICk7CisJaWYoIHB4Q29Sb3V0aW5lICkKKwl7CisJCS8qIElmIHB4Q3VycmVudENvUm91dGluZSBpcyBOVUxMIHRoZW4gdGhpcyBpcyB0aGUgZmlyc3QgY28tcm91dGluZSB0bworCQliZSBjcmVhdGVkIGFuZCB0aGUgY28tcm91dGluZSBkYXRhIHN0cnVjdHVyZXMgbmVlZCBpbml0aWFsaXNpbmcuICovCisJCWlmKCBweEN1cnJlbnRDb1JvdXRpbmUgPT0gTlVMTCApCisJCXsKKwkJCXB4Q3VycmVudENvUm91dGluZSA9IHB4Q29Sb3V0aW5lOworCQkJcHJ2SW5pdGlhbGlzZUNvUm91dGluZUxpc3RzKCk7CisJCX0KKworCQkvKiBDaGVjayB0aGUgcHJpb3JpdHkgaXMgd2l0aGluIGxpbWl0cy4gKi8KKwkJaWYoIHV4UHJpb3JpdHkgPj0gY29uZmlnTUFYX0NPX1JPVVRJTkVfUFJJT1JJVElFUyApCisJCXsKKwkJCXV4UHJpb3JpdHkgPSBjb25maWdNQVhfQ09fUk9VVElORV9QUklPUklUSUVTIC0gMTsKKwkJfQorCisJCS8qIEZpbGwgb3V0IHRoZSBjby1yb3V0aW5lIGNvbnRyb2wgYmxvY2sgZnJvbSB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycy4gKi8KKwkJcHhDb1JvdXRpbmUtPnV4U3RhdGUgPSBjb3JJTklUSUFMX1NUQVRFOworCQlweENvUm91dGluZS0+dXhQcmlvcml0eSA9IHV4UHJpb3JpdHk7CisJCXB4Q29Sb3V0aW5lLT51eEluZGV4ID0gdXhJbmRleDsKKwkJcHhDb1JvdXRpbmUtPnB4Q29Sb3V0aW5lRnVuY3Rpb24gPSBweENvUm91dGluZUNvZGU7CisKKwkJLyogSW5pdGlhbGlzZSBhbGwgdGhlIG90aGVyIGNvLXJvdXRpbmUgY29udHJvbCBibG9jayBwYXJhbWV0ZXJzLiAqLworCQl2TGlzdEluaXRpYWxpc2VJdGVtKCAmKCBweENvUm91dGluZS0+eEdlbmVyaWNMaXN0SXRlbSApICk7CisJCXZMaXN0SW5pdGlhbGlzZUl0ZW0oICYoIHB4Q29Sb3V0aW5lLT54RXZlbnRMaXN0SXRlbSApICk7CisKKwkJLyogU2V0IHRoZSBjby1yb3V0aW5lIGNvbnRyb2wgYmxvY2sgYXMgYSBsaW5rIGJhY2sgZnJvbSB0aGUgTGlzdEl0ZW1fdC4KKwkJVGhpcyBpcyBzbyB3ZSBjYW4gZ2V0IGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgQ1JDQiBmcm9tIGEgZ2VuZXJpYyBpdGVtCisJCWluIGEgbGlzdC4gKi8KKwkJbGlzdFNFVF9MSVNUX0lURU1fT1dORVIoICYoIHB4Q29Sb3V0aW5lLT54R2VuZXJpY0xpc3RJdGVtICksIHB4Q29Sb3V0aW5lICk7CisJCWxpc3RTRVRfTElTVF9JVEVNX09XTkVSKCAmKCBweENvUm91dGluZS0+eEV2ZW50TGlzdEl0ZW0gKSwgcHhDb1JvdXRpbmUgKTsKKworCQkvKiBFdmVudCBsaXN0cyBhcmUgYWx3YXlzIGluIHByaW9yaXR5IG9yZGVyLiAqLworCQlsaXN0U0VUX0xJU1RfSVRFTV9WQUxVRSggJiggcHhDb1JvdXRpbmUtPnhFdmVudExpc3RJdGVtICksICggKCBUaWNrVHlwZV90ICkgY29uZmlnTUFYX0NPX1JPVVRJTkVfUFJJT1JJVElFUyAtICggVGlja1R5cGVfdCApIHV4UHJpb3JpdHkgKSApOworCisJCS8qIE5vdyB0aGUgY28tcm91dGluZSBoYXMgYmVlbiBpbml0aWFsaXNlZCBpdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHJlYWR5CisJCWxpc3QgYXQgdGhlIGNvcnJlY3QgcHJpb3JpdHkuICovCisJCXBydkFkZENvUm91dGluZVRvUmVhZHlRdWV1ZSggcHhDb1JvdXRpbmUgKTsKKworCQl4UmV0dXJuID0gcGRQQVNTOworCX0KKwllbHNlCisJeworCQl4UmV0dXJuID0gZXJyQ09VTERfTk9UX0FMTE9DQVRFX1JFUVVJUkVEX01FTU9SWTsKKwl9CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZDb1JvdXRpbmVBZGRUb0RlbGF5ZWRMaXN0KCBUaWNrVHlwZV90IHhUaWNrc1RvRGVsYXksIExpc3RfdCAqcHhFdmVudExpc3QgKQoreworVGlja1R5cGVfdCB4VGltZVRvV2FrZTsKKworCS8qIENhbGN1bGF0ZSB0aGUgdGltZSB0byB3YWtlIC0gdGhpcyBtYXkgb3ZlcmZsb3cgYnV0IHRoaXMgaXMKKwlub3QgYSBwcm9ibGVtLiAqLworCXhUaW1lVG9XYWtlID0geENvUm91dGluZVRpY2tDb3VudCArIHhUaWNrc1RvRGVsYXk7CisKKwkvKiBXZSBtdXN0IHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgcmVhZHkgbGlzdCBiZWZvcmUgYWRkaW5nCisJb3Vyc2VsdmVzIHRvIHRoZSBibG9ja2VkIGxpc3QgYXMgdGhlIHNhbWUgbGlzdCBpdGVtIGlzIHVzZWQgZm9yCisJYm90aCBsaXN0cy4gKi8KKwkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICggTGlzdEl0ZW1fdCAqICkgJiggcHhDdXJyZW50Q29Sb3V0aW5lLT54R2VuZXJpY0xpc3RJdGVtICkgKTsKKworCS8qIFRoZSBsaXN0IGl0ZW0gd2lsbCBiZSBpbnNlcnRlZCBpbiB3YWtlIHRpbWUgb3JkZXIuICovCisJbGlzdFNFVF9MSVNUX0lURU1fVkFMVUUoICYoIHB4Q3VycmVudENvUm91dGluZS0+eEdlbmVyaWNMaXN0SXRlbSApLCB4VGltZVRvV2FrZSApOworCisJaWYoIHhUaW1lVG9XYWtlIDwgeENvUm91dGluZVRpY2tDb3VudCApCisJeworCQkvKiBXYWtlIHRpbWUgaGFzIG92ZXJmbG93ZWQuICBQbGFjZSB0aGlzIGl0ZW0gaW4gdGhlCisJCW92ZXJmbG93IGxpc3QuICovCisJCXZMaXN0SW5zZXJ0KCAoIExpc3RfdCAqICkgcHhPdmVyZmxvd0RlbGF5ZWRDb1JvdXRpbmVMaXN0LCAoIExpc3RJdGVtX3QgKiApICYoIHB4Q3VycmVudENvUm91dGluZS0+eEdlbmVyaWNMaXN0SXRlbSApICk7CisJfQorCWVsc2UKKwl7CisJCS8qIFRoZSB3YWtlIHRpbWUgaGFzIG5vdCBvdmVyZmxvd2VkLCBzbyB3ZSBjYW4gdXNlIHRoZQorCQljdXJyZW50IGJsb2NrIGxpc3QuICovCisJCXZMaXN0SW5zZXJ0KCAoIExpc3RfdCAqICkgcHhEZWxheWVkQ29Sb3V0aW5lTGlzdCwgKCBMaXN0SXRlbV90ICogKSAmKCBweEN1cnJlbnRDb1JvdXRpbmUtPnhHZW5lcmljTGlzdEl0ZW0gKSApOworCX0KKworCWlmKCBweEV2ZW50TGlzdCApCisJeworCQkvKiBBbHNvIGFkZCB0aGUgY28tcm91dGluZSB0byBhbiBldmVudCBsaXN0LiAgSWYgdGhpcyBpcyBkb25lIHRoZW4gdGhlCisJCWZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4gKi8KKwkJdkxpc3RJbnNlcnQoIHB4RXZlbnRMaXN0LCAmKCBweEN1cnJlbnRDb1JvdXRpbmUtPnhFdmVudExpc3RJdGVtICkgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2Q2hlY2tQZW5kaW5nUmVhZHlMaXN0KCB2b2lkICkKK3sKKwkvKiBBcmUgdGhlcmUgYW55IGNvLXJvdXRpbmVzIHdhaXRpbmcgdG8gZ2V0IG1vdmVkIHRvIHRoZSByZWFkeSBsaXN0PyAgVGhlc2UKKwlhcmUgY28tcm91dGluZXMgdGhhdCBoYXZlIGJlZW4gcmVhZGllZCBieSBhbiBJU1IuICBUaGUgSVNSIGNhbm5vdCBhY2Nlc3MKKwl0aGUJcmVhZHkgbGlzdHMgaXRzZWxmLiAqLworCXdoaWxlKCBsaXN0TElTVF9JU19FTVBUWSggJnhQZW5kaW5nUmVhZHlDb1JvdXRpbmVMaXN0ICkgPT0gcGRGQUxTRSApCisJeworCQlDUkNCX3QgKnB4VW5ibG9ja2VkQ1JDQjsKKworCQkvKiBUaGUgcGVuZGluZyByZWFkeSBsaXN0IGNhbiBiZSBhY2Nlc3NlZCBieSBhbiBJU1IuICovCisJCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwkJeworCQkJcHhVbmJsb2NrZWRDUkNCID0gKCBDUkNCX3QgKiApIGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggKCZ4UGVuZGluZ1JlYWR5Q29Sb3V0aW5lTGlzdCkgKTsKKwkJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhVbmJsb2NrZWRDUkNCLT54RXZlbnRMaXN0SXRlbSApICk7CisJCX0KKwkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisKKwkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweFVuYmxvY2tlZENSQ0ItPnhHZW5lcmljTGlzdEl0ZW0gKSApOworCQlwcnZBZGRDb1JvdXRpbmVUb1JlYWR5UXVldWUoIHB4VW5ibG9ja2VkQ1JDQiApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZDaGVja0RlbGF5ZWRMaXN0KCB2b2lkICkKK3sKK0NSQ0JfdCAqcHhDUkNCOworCisJeFBhc3NlZFRpY2tzID0geFRhc2tHZXRUaWNrQ291bnQoKSAtIHhMYXN0VGlja0NvdW50OworCXdoaWxlKCB4UGFzc2VkVGlja3MgKQorCXsKKwkJeENvUm91dGluZVRpY2tDb3VudCsrOworCQl4UGFzc2VkVGlja3MtLTsKKworCQkvKiBJZiB0aGUgdGljayBjb3VudCBoYXMgb3ZlcmZsb3dlZCB3ZSBuZWVkIHRvIHN3YXAgdGhlIHJlYWR5IGxpc3RzLiAqLworCQlpZiggeENvUm91dGluZVRpY2tDb3VudCA9PSAwICkKKwkJeworCQkJTGlzdF90ICogcHhUZW1wOworCisJCQkvKiBUaWNrIGNvdW50IGhhcyBvdmVyZmxvd2VkIHNvIHdlIG5lZWQgdG8gc3dhcCB0aGUgZGVsYXkgbGlzdHMuICBJZiB0aGVyZSBhcmUKKwkJCWFueSBpdGVtcyBpbiBweERlbGF5ZWRDb1JvdXRpbmVMaXN0IGhlcmUgdGhlbiB0aGVyZSBpcyBhbiBlcnJvciEgKi8KKwkJCXB4VGVtcCA9IHB4RGVsYXllZENvUm91dGluZUxpc3Q7CisJCQlweERlbGF5ZWRDb1JvdXRpbmVMaXN0ID0gcHhPdmVyZmxvd0RlbGF5ZWRDb1JvdXRpbmVMaXN0OworCQkJcHhPdmVyZmxvd0RlbGF5ZWRDb1JvdXRpbmVMaXN0ID0gcHhUZW1wOworCQl9CisKKwkJLyogU2VlIGlmIHRoaXMgdGljayBoYXMgbWFkZSBhIHRpbWVvdXQgZXhwaXJlLiAqLworCQl3aGlsZSggbGlzdExJU1RfSVNfRU1QVFkoIHB4RGVsYXllZENvUm91dGluZUxpc3QgKSA9PSBwZEZBTFNFICkKKwkJeworCQkJcHhDUkNCID0gKCBDUkNCX3QgKiApIGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggcHhEZWxheWVkQ29Sb3V0aW5lTGlzdCApOworCisJCQlpZiggeENvUm91dGluZVRpY2tDb3VudCA8IGxpc3RHRVRfTElTVF9JVEVNX1ZBTFVFKCAmKCBweENSQ0ItPnhHZW5lcmljTGlzdEl0ZW0gKSApICkKKwkJCXsKKwkJCQkvKiBUaW1lb3V0IG5vdCB5ZXQgZXhwaXJlZC4gKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCQkJeworCQkJCS8qIFRoZSBldmVudCBjb3VsZCBoYXZlIG9jY3VycmVkIGp1c3QgYmVmb3JlIHRoaXMgY3JpdGljYWwKKwkJCQlzZWN0aW9uLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBnZW5lcmljIGxpc3QgaXRlbSB3aWxsCisJCQkJaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBwZW5kaW5nIHJlYWR5IGxpc3QgYW5kIHRoZSBmb2xsb3dpbmcKKwkJCQlsaW5lIGlzIHN0aWxsIHZhbGlkLiAgQWxzbyB0aGUgcHZDb250YWluZXIgcGFyYW1ldGVyIHdpbGwgaGF2ZQorCQkJCWJlZW4gc2V0IHRvIE5VTEwgc28gdGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYWxzbyB2YWxpZC4gKi8KKwkJCQkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICYoIHB4Q1JDQi0+eEdlbmVyaWNMaXN0SXRlbSApICk7CisKKwkJCQkvKiBJcyB0aGUgY28tcm91dGluZSB3YWl0aW5nIG9uIGFuIGV2ZW50IGFsc28/ICovCisJCQkJaWYoIHB4Q1JDQi0+eEV2ZW50TGlzdEl0ZW0ucHZDb250YWluZXIgKQorCQkJCXsKKwkJCQkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweENSQ0ItPnhFdmVudExpc3RJdGVtICkgKTsKKwkJCQl9CisJCQl9CisJCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKworCQkJcHJ2QWRkQ29Sb3V0aW5lVG9SZWFkeVF1ZXVlKCBweENSQ0IgKTsKKwkJfQorCX0KKworCXhMYXN0VGlja0NvdW50ID0geENvUm91dGluZVRpY2tDb3VudDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZDb1JvdXRpbmVTY2hlZHVsZSggdm9pZCApCit7CisJLyogU2VlIGlmIGFueSBjby1yb3V0aW5lcyByZWFkaWVkIGJ5IGV2ZW50cyBuZWVkIG1vdmluZyB0byB0aGUgcmVhZHkgbGlzdHMuICovCisJcHJ2Q2hlY2tQZW5kaW5nUmVhZHlMaXN0KCk7CisKKwkvKiBTZWUgaWYgYW55IGRlbGF5ZWQgY28tcm91dGluZXMgaGF2ZSB0aW1lZCBvdXQuICovCisJcHJ2Q2hlY2tEZWxheWVkTGlzdCgpOworCisJLyogRmluZCB0aGUgaGlnaGVzdCBwcmlvcml0eSBxdWV1ZSB0aGF0IGNvbnRhaW5zIHJlYWR5IGNvLXJvdXRpbmVzLiAqLworCXdoaWxlKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhSZWFkeUNvUm91dGluZUxpc3RzWyB1eFRvcENvUm91dGluZVJlYWR5UHJpb3JpdHkgXSApICkgKQorCXsKKwkJaWYoIHV4VG9wQ29Sb3V0aW5lUmVhZHlQcmlvcml0eSA9PSAwICkKKwkJeworCQkJLyogTm8gbW9yZSBjby1yb3V0aW5lcyB0byBjaGVjay4gKi8KKwkJCXJldHVybjsKKwkJfQorCQktLXV4VG9wQ29Sb3V0aW5lUmVhZHlQcmlvcml0eTsKKwl9CisKKwkvKiBsaXN0R0VUX09XTkVSX09GX05FWFRfRU5UUlkgd2Fsa3MgdGhyb3VnaCB0aGUgbGlzdCwgc28gdGhlIGNvLXJvdXRpbmVzCisJIG9mIHRoZQlzYW1lIHByaW9yaXR5IGdldCBhbiBlcXVhbCBzaGFyZSBvZiB0aGUgcHJvY2Vzc29yIHRpbWUuICovCisJbGlzdEdFVF9PV05FUl9PRl9ORVhUX0VOVFJZKCBweEN1cnJlbnRDb1JvdXRpbmUsICYoIHB4UmVhZHlDb1JvdXRpbmVMaXN0c1sgdXhUb3BDb1JvdXRpbmVSZWFkeVByaW9yaXR5IF0gKSApOworCisJLyogQ2FsbCB0aGUgY28tcm91dGluZS4gKi8KKwkoIHB4Q3VycmVudENvUm91dGluZS0+cHhDb1JvdXRpbmVGdW5jdGlvbiApKCBweEN1cnJlbnRDb1JvdXRpbmUsIHB4Q3VycmVudENvUm91dGluZS0+dXhJbmRleCApOworCisJcmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydkluaXRpYWxpc2VDb1JvdXRpbmVMaXN0cyggdm9pZCApCit7CitVQmFzZVR5cGVfdCB1eFByaW9yaXR5OworCisJZm9yKCB1eFByaW9yaXR5ID0gMDsgdXhQcmlvcml0eSA8IGNvbmZpZ01BWF9DT19ST1VUSU5FX1BSSU9SSVRJRVM7IHV4UHJpb3JpdHkrKyApCisJeworCQl2TGlzdEluaXRpYWxpc2UoICggTGlzdF90ICogKSAmKCBweFJlYWR5Q29Sb3V0aW5lTGlzdHNbIHV4UHJpb3JpdHkgXSApICk7CisJfQorCisJdkxpc3RJbml0aWFsaXNlKCAoIExpc3RfdCAqICkgJnhEZWxheWVkQ29Sb3V0aW5lTGlzdDEgKTsKKwl2TGlzdEluaXRpYWxpc2UoICggTGlzdF90ICogKSAmeERlbGF5ZWRDb1JvdXRpbmVMaXN0MiApOworCXZMaXN0SW5pdGlhbGlzZSggKCBMaXN0X3QgKiApICZ4UGVuZGluZ1JlYWR5Q29Sb3V0aW5lTGlzdCApOworCisJLyogU3RhcnQgd2l0aCBweERlbGF5ZWRDb1JvdXRpbmVMaXN0IHVzaW5nIGxpc3QxIGFuZCB0aGUKKwlweE92ZXJmbG93RGVsYXllZENvUm91dGluZUxpc3QgdXNpbmcgbGlzdDIuICovCisJcHhEZWxheWVkQ29Sb3V0aW5lTGlzdCA9ICZ4RGVsYXllZENvUm91dGluZUxpc3QxOworCXB4T3ZlcmZsb3dEZWxheWVkQ29Sb3V0aW5lTGlzdCA9ICZ4RGVsYXllZENvUm91dGluZUxpc3QyOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeENvUm91dGluZVJlbW92ZUZyb21FdmVudExpc3QoIGNvbnN0IExpc3RfdCAqcHhFdmVudExpc3QgKQoreworQ1JDQl90ICpweFVuYmxvY2tlZENSQ0I7CitCYXNlVHlwZV90IHhSZXR1cm47CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBpbnRlcnJ1cHQuICBJdCBjYW4gb25seSBhY2Nlc3MKKwlldmVudCBsaXN0cyBhbmQgdGhlIHBlbmRpbmcgcmVhZHkgbGlzdC4gIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEKKwljaGVjayBoYXMgYWxyZWFkeSBiZWVuIG1hZGUgdG8gZW5zdXJlIHB4RXZlbnRMaXN0IGlzIG5vdCBlbXB0eS4gKi8KKwlweFVuYmxvY2tlZENSQ0IgPSAoIENSQ0JfdCAqICkgbGlzdEdFVF9PV05FUl9PRl9IRUFEX0VOVFJZKCBweEV2ZW50TGlzdCApOworCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhVbmJsb2NrZWRDUkNCLT54RXZlbnRMaXN0SXRlbSApICk7CisJdkxpc3RJbnNlcnRFbmQoICggTGlzdF90ICogKSAmKCB4UGVuZGluZ1JlYWR5Q29Sb3V0aW5lTGlzdCApLCAmKCBweFVuYmxvY2tlZENSQ0ItPnhFdmVudExpc3RJdGVtICkgKTsKKworCWlmKCBweFVuYmxvY2tlZENSQ0ItPnV4UHJpb3JpdHkgPj0gcHhDdXJyZW50Q29Sb3V0aW5lLT51eFByaW9yaXR5ICkKKwl7CisJCXhSZXR1cm4gPSBwZFRSVUU7CisJfQorCWVsc2UKKwl7CisJCXhSZXR1cm4gPSBwZEZBTFNFOworCX0KKworCXJldHVybiB4UmV0dXJuOworfQorCisjZW5kaWYgLyogY29uZmlnVVNFX0NPX1JPVVRJTkVTID09IDAgKi8KKwpkaWZmIC0tZ2l0IGEvU291cmNlL2V2ZW50X2dyb3Vwcy5jIGIvU291cmNlL2V2ZW50X2dyb3Vwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDdiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvZXZlbnRfZ3JvdXBzLmMKQEAgLTAsMCArMSw3MzggQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiAgVGhhdCBzaG91bGQgb25seSBiZSBkb25lIHdoZW4KK3Rhc2suaCBpcyBpbmNsdWRlZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZpbGUuICovCisjZGVmaW5lIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKy8qIEZyZWVSVE9TIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInRpbWVycy5oIgorI2luY2x1ZGUgImV2ZW50X2dyb3Vwcy5oIgorCisvKiBMaW50IGU5NjEgYW5kIGU3NTAgYXJlIHN1cHByZXNzZWQgYXMgYSBNSVNSQSBleGNlcHRpb24ganVzdGlmaWVkIGJlY2F1c2UgdGhlCitNUFUgcG9ydHMgcmVxdWlyZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSB0byBiZSBkZWZpbmVkIGZvciB0aGUKK2hlYWRlciBmaWxlcyBhYm92ZSwgYnV0IG5vdCBpbiB0aGlzIGZpbGUsIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0Citwcml2aWxlZ2VkIFZzIHVucHJpdmlsZWdlZCBsaW5rYWdlIGFuZCBwbGFjZW1lbnQuICovCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgLypsaW50ICFlOTYxICFlNzUwLiAqLworCisvKiBUaGUgZm9sbG93aW5nIGJpdCBmaWVsZHMgY29udmV5IGNvbnRyb2wgaW5mb3JtYXRpb24gaW4gYSB0YXNrJ3MgZXZlbnQgbGlzdAoraXRlbSB2YWx1ZS4gIEl0IGlzIGltcG9ydGFudCB0aGV5IGRvbid0IGNsYXNoIHdpdGggdGhlCit0YXNrRVZFTlRfTElTVF9JVEVNX1ZBTFVFX0lOX1VTRSBkZWZpbml0aW9uLiAqLworI2lmIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMQorCSNkZWZpbmUgZXZlbnRDTEVBUl9FVkVOVFNfT05fRVhJVF9CSVQJMHgwMTAwVQorCSNkZWZpbmUgZXZlbnRVTkJMT0NLRURfRFVFX1RPX0JJVF9TRVQJMHgwMjAwVQorCSNkZWZpbmUgZXZlbnRXQUlUX0ZPUl9BTExfQklUUwkJCTB4MDQwMFUKKwkjZGVmaW5lIGV2ZW50RVZFTlRfQklUU19DT05UUk9MX0JZVEVTCTB4ZmYwMFUKKyNlbHNlCisJI2RlZmluZSBldmVudENMRUFSX0VWRU5UU19PTl9FWElUX0JJVAkweDAxMDAwMDAwVUwKKwkjZGVmaW5lIGV2ZW50VU5CTE9DS0VEX0RVRV9UT19CSVRfU0VUCTB4MDIwMDAwMDBVTAorCSNkZWZpbmUgZXZlbnRXQUlUX0ZPUl9BTExfQklUUwkJCTB4MDQwMDAwMDBVTAorCSNkZWZpbmUgZXZlbnRFVkVOVF9CSVRTX0NPTlRST0xfQllURVMJMHhmZjAwMDAwMFVMCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeEV2ZW50R3JvdXBEZWZpbml0aW9uCit7CisJRXZlbnRCaXRzX3QgdXhFdmVudEJpdHM7CisJTGlzdF90IHhUYXNrc1dhaXRpbmdGb3JCaXRzOwkJLyo8IExpc3Qgb2YgdGFza3Mgd2FpdGluZyBmb3IgYSBiaXQgdG8gYmUgc2V0LiAqLworCisJI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisJCVVCYXNlVHlwZV90IHV4RXZlbnRHcm91cE51bWJlcjsKKwkjZW5kaWYKKworCSNpZiggKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKSApCisJCXVpbnQ4X3QgdWNTdGF0aWNhbGx5QWxsb2NhdGVkOyAvKjwgU2V0IHRvIHBkVFJVRSBpZiB0aGUgZXZlbnQgZ3JvdXAgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgdG8gZW5zdXJlIG5vIGF0dGVtcHQgaXMgbWFkZSB0byBmcmVlIHRoZSBtZW1vcnkuICovCisJI2VuZGlmCit9IEV2ZW50R3JvdXBfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUZXN0IHRoZSBiaXRzIHNldCBpbiB1eEN1cnJlbnRFdmVudEJpdHMgdG8gc2VlIGlmIHRoZSB3YWl0IGNvbmRpdGlvbiBpcyBtZXQuCisgKiBUaGUgd2FpdCBjb25kaXRpb24gaXMgZGVmaW5lZCBieSB4V2FpdEZvckFsbEJpdHMuICBJZiB4V2FpdEZvckFsbEJpdHMgaXMKKyAqIHBkVFJVRSB0aGVuIHRoZSB3YWl0IGNvbmRpdGlvbiBpcyBtZXQgaWYgYWxsIHRoZSBiaXRzIHNldCBpbiB1eEJpdHNUb1dhaXRGb3IKKyAqIGFyZSBhbHNvIHNldCBpbiB1eEN1cnJlbnRFdmVudEJpdHMuICBJZiB4V2FpdEZvckFsbEJpdHMgaXMgcGRGQUxTRSB0aGVuIHRoZQorICogd2FpdCBjb25kaXRpb24gaXMgbWV0IGlmIGFueSBvZiB0aGUgYml0cyBzZXQgaW4gdXhCaXRzVG9XYWl0IGZvciBhcmUgYWxzbyBzZXQKKyAqIGluIHV4Q3VycmVudEV2ZW50Qml0cy4KKyAqLworc3RhdGljIEJhc2VUeXBlX3QgcHJ2VGVzdFdhaXRDb25kaXRpb24oIGNvbnN0IEV2ZW50Qml0c190IHV4Q3VycmVudEV2ZW50Qml0cywgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBjb25zdCBCYXNlVHlwZV90IHhXYWl0Rm9yQWxsQml0cyApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisKKwlFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXBDcmVhdGVTdGF0aWMoIFN0YXRpY0V2ZW50R3JvdXBfdCAqcHhFdmVudEdyb3VwQnVmZmVyICkKKwl7CisJRXZlbnRHcm91cF90ICpweEV2ZW50Qml0czsKKworCQkvKiBBIFN0YXRpY0V2ZW50R3JvdXBfdCBvYmplY3QgbXVzdCBiZSBwcm92aWRlZC4gKi8KKwkJY29uZmlnQVNTRVJUKCBweEV2ZW50R3JvdXBCdWZmZXIgKTsKKworCQkjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCQl7CisJCQkvKiBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIHVzZWQgdG8gZGVjbGFyZSBhCisJCQl2YXJpYWJsZSBvZiB0eXBlIFN0YXRpY0V2ZW50R3JvdXBfdCBlcXVhbHMgdGhlIHNpemUgb2YgdGhlIHJlYWwKKwkJCWV2ZW50IGdyb3VwIHN0cnVjdHVyZS4gKi8KKwkJCXZvbGF0aWxlIHNpemVfdCB4U2l6ZSA9IHNpemVvZiggU3RhdGljRXZlbnRHcm91cF90ICk7CisJCQljb25maWdBU1NFUlQoIHhTaXplID09IHNpemVvZiggRXZlbnRHcm91cF90ICkgKTsKKwkJfQorCQkjZW5kaWYgLyogY29uZmlnQVNTRVJUX0RFRklORUQgKi8KKworCQkvKiBUaGUgdXNlciBoYXMgcHJvdmlkZWQgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBldmVudCBncm91cCAtIHVzZSBpdC4gKi8KKwkJcHhFdmVudEJpdHMgPSAoIEV2ZW50R3JvdXBfdCAqICkgcHhFdmVudEdyb3VwQnVmZmVyOyAvKmxpbnQgIWU3NDAgRXZlbnRHcm91cF90IGFuZCBTdGF0aWNFdmVudEdyb3VwX3QgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgc2FtZSBzaXplIGFuZCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgLSBjaGVja2VkIGJ5IGNvbmZpZ0FTU0VSVCgpLiAqLworCisJCWlmKCBweEV2ZW50Qml0cyAhPSBOVUxMICkKKwkJeworCQkJcHhFdmVudEJpdHMtPnV4RXZlbnRCaXRzID0gMDsKKwkJCXZMaXN0SW5pdGlhbGlzZSggJiggcHhFdmVudEJpdHMtPnhUYXNrc1dhaXRpbmdGb3JCaXRzICkgKTsKKworCQkJI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKwkJCXsKKwkJCQkvKiBCb3RoIHN0YXRpYyBhbmQgZHluYW1pYyBhbGxvY2F0aW9uIGNhbiBiZSB1c2VkLCBzbyBub3RlIHRoYXQKKwkJCQl0aGlzIGV2ZW50IGdyb3VwIHdhcyBjcmVhdGVkIHN0YXRpY2FsbHkgaW4gY2FzZSB0aGUgZXZlbnQgZ3JvdXAKKwkJCQlpcyBsYXRlciBkZWxldGVkLiAqLworCQkJCXB4RXZlbnRCaXRzLT51Y1N0YXRpY2FsbHlBbGxvY2F0ZWQgPSBwZFRSVUU7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gKi8KKworCQkJdHJhY2VFVkVOVF9HUk9VUF9DUkVBVEUoIHB4RXZlbnRCaXRzICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0cmFjZUVWRU5UX0dST1VQX0NSRUFURV9GQUlMRUQoKTsKKwkJfQorCisJCXJldHVybiAoIEV2ZW50R3JvdXBIYW5kbGVfdCApIHB4RXZlbnRCaXRzOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCisJRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwQ3JlYXRlKCB2b2lkICkKKwl7CisJRXZlbnRHcm91cF90ICpweEV2ZW50Qml0czsKKworCQkvKiBBbGxvY2F0ZSB0aGUgZXZlbnQgZ3JvdXAuICovCisJCXB4RXZlbnRCaXRzID0gKCBFdmVudEdyb3VwX3QgKiApIHB2UG9ydE1hbGxvYyggc2l6ZW9mKCBFdmVudEdyb3VwX3QgKSApOworCisJCWlmKCBweEV2ZW50Qml0cyAhPSBOVUxMICkKKwkJeworCQkJcHhFdmVudEJpdHMtPnV4RXZlbnRCaXRzID0gMDsKKwkJCXZMaXN0SW5pdGlhbGlzZSggJiggcHhFdmVudEJpdHMtPnhUYXNrc1dhaXRpbmdGb3JCaXRzICkgKTsKKworCQkJI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCQkJeworCQkJCS8qIEJvdGggc3RhdGljIGFuZCBkeW5hbWljIGFsbG9jYXRpb24gY2FuIGJlIHVzZWQsIHNvIG5vdGUgdGhpcworCQkJCWV2ZW50IGdyb3VwIHdhcyBhbGxvY2F0ZWQgc3RhdGljYWxseSBpbiBjYXNlIHRoZSBldmVudCBncm91cCBpcworCQkJCWxhdGVyIGRlbGV0ZWQuICovCisJCQkJcHhFdmVudEJpdHMtPnVjU3RhdGljYWxseUFsbG9jYXRlZCA9IHBkRkFMU0U7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAqLworCisJCQl0cmFjZUVWRU5UX0dST1VQX0NSRUFURSggcHhFdmVudEJpdHMgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRyYWNlRVZFTlRfR1JPVVBfQ1JFQVRFX0ZBSUxFRCgpOworCQl9CisKKwkJcmV0dXJuICggRXZlbnRHcm91cEhhbmRsZV90ICkgcHhFdmVudEJpdHM7CisJfQorCisjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitFdmVudEJpdHNfdCB4RXZlbnRHcm91cFN5bmMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9TZXQsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvV2FpdEZvciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQoreworRXZlbnRCaXRzX3QgdXhPcmlnaW5hbEJpdFZhbHVlLCB1eFJldHVybjsKK0V2ZW50R3JvdXBfdCAqcHhFdmVudEJpdHMgPSAoIEV2ZW50R3JvdXBfdCAqICkgeEV2ZW50R3JvdXA7CitCYXNlVHlwZV90IHhBbHJlYWR5WWllbGRlZDsKK0Jhc2VUeXBlX3QgeFRpbWVvdXRPY2N1cnJlZCA9IHBkRkFMU0U7CisKKwljb25maWdBU1NFUlQoICggdXhCaXRzVG9XYWl0Rm9yICYgZXZlbnRFVkVOVF9CSVRTX0NPTlRST0xfQllURVMgKSA9PSAwICk7CisJY29uZmlnQVNTRVJUKCB1eEJpdHNUb1dhaXRGb3IgIT0gMCApOworCSNpZiAoICggSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlID09IDEgKSB8fCAoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApICkKKwl7CisJCWNvbmZpZ0FTU0VSVCggISggKCB4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgPT0gdGFza1NDSEVEVUxFUl9TVVNQRU5ERUQgKSAmJiAoIHhUaWNrc1RvV2FpdCAhPSAwICkgKSApOworCX0KKwkjZW5kaWYKKworCXZUYXNrU3VzcGVuZEFsbCgpOworCXsKKwkJdXhPcmlnaW5hbEJpdFZhbHVlID0gcHhFdmVudEJpdHMtPnV4RXZlbnRCaXRzOworCisJCSggdm9pZCApIHhFdmVudEdyb3VwU2V0Qml0cyggeEV2ZW50R3JvdXAsIHV4Qml0c1RvU2V0ICk7CisKKwkJaWYoICggKCB1eE9yaWdpbmFsQml0VmFsdWUgfCB1eEJpdHNUb1NldCApICYgdXhCaXRzVG9XYWl0Rm9yICkgPT0gdXhCaXRzVG9XYWl0Rm9yICkKKwkJeworCQkJLyogQWxsIHRoZSByZW5kZXp2b3VzIGJpdHMgYXJlIG5vdyBzZXQgLSBubyBuZWVkIHRvIGJsb2NrLiAqLworCQkJdXhSZXR1cm4gPSAoIHV4T3JpZ2luYWxCaXRWYWx1ZSB8IHV4Qml0c1RvU2V0ICk7CisKKwkJCS8qIFJlbmRlenZvdXMgYWx3YXlzIGNsZWFyIHRoZSBiaXRzLiAgVGhleSB3aWxsIGhhdmUgYmVlbiBjbGVhcmVkCisJCQlhbHJlYWR5IHVubGVzcyB0aGlzIGlzIHRoZSBvbmx5IHRhc2sgaW4gdGhlIHJlbmRlenZvdXMuICovCisJCQlweEV2ZW50Qml0cy0+dXhFdmVudEJpdHMgJj0gfnV4Qml0c1RvV2FpdEZvcjsKKworCQkJeFRpY2tzVG9XYWl0ID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKCB4VGlja3NUb1dhaXQgIT0gKCBUaWNrVHlwZV90ICkgMCApCisJCQl7CisJCQkJdHJhY2VFVkVOVF9HUk9VUF9TWU5DX0JMT0NLKCB4RXZlbnRHcm91cCwgdXhCaXRzVG9TZXQsIHV4Qml0c1RvV2FpdEZvciApOworCisJCQkJLyogU3RvcmUgdGhlIGJpdHMgdGhhdCB0aGUgY2FsbGluZyB0YXNrIGlzIHdhaXRpbmcgZm9yIGluIHRoZQorCQkJCXRhc2sncyBldmVudCBsaXN0IGl0ZW0gc28gdGhlIGtlcm5lbCBrbm93cyB3aGVuIGEgbWF0Y2ggaXMKKwkJCQlmb3VuZC4gIFRoZW4gZW50ZXIgdGhlIGJsb2NrZWQgc3RhdGUuICovCisJCQkJdlRhc2tQbGFjZU9uVW5vcmRlcmVkRXZlbnRMaXN0KCAmKCBweEV2ZW50Qml0cy0+eFRhc2tzV2FpdGluZ0ZvckJpdHMgKSwgKCB1eEJpdHNUb1dhaXRGb3IgfCBldmVudENMRUFSX0VWRU5UU19PTl9FWElUX0JJVCB8IGV2ZW50V0FJVF9GT1JfQUxMX0JJVFMgKSwgeFRpY2tzVG9XYWl0ICk7CisKKwkJCQkvKiBUaGlzIGFzc2lnbm1lbnQgaXMgb2Jzb2xldGUgYXMgdXhSZXR1cm4gd2lsbCBnZXQgc2V0IGFmdGVyCisJCQkJdGhlIHRhc2sgdW5ibG9ja3MsIGJ1dCBzb21lIGNvbXBpbGVycyBtaXN0YWtlbmx5IGdlbmVyYXRlIGEKKwkJCQl3YXJuaW5nIGFib3V0IHV4UmV0dXJuIGJlaW5nIHJldHVybmVkIHdpdGhvdXQgYmVpbmcgc2V0IGlmIHRoZQorCQkJCWFzc2lnbm1lbnQgaXMgb21pdHRlZC4gKi8KKwkJCQl1eFJldHVybiA9IDA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogVGhlIHJlbmRlenZvdXMgYml0cyB3ZXJlIG5vdCBzZXQsIGJ1dCBubyBibG9jayB0aW1lIHdhcworCQkJCXNwZWNpZmllZCAtIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IGV2ZW50IGJpdCB2YWx1ZS4gKi8KKwkJCQl1eFJldHVybiA9IHB4RXZlbnRCaXRzLT51eEV2ZW50Qml0czsKKwkJCQl4VGltZW91dE9jY3VycmVkID0gcGRUUlVFOworCQkJfQorCQl9CisJfQorCXhBbHJlYWR5WWllbGRlZCA9IHhUYXNrUmVzdW1lQWxsKCk7CisKKwlpZiggeFRpY2tzVG9XYWl0ICE9ICggVGlja1R5cGVfdCApIDAgKQorCXsKKwkJaWYoIHhBbHJlYWR5WWllbGRlZCA9PSBwZEZBTFNFICkKKwkJeworCQkJcG9ydFlJRUxEX1dJVEhJTl9BUEkoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCS8qIFRoZSB0YXNrIGJsb2NrZWQgdG8gd2FpdCBmb3IgaXRzIHJlcXVpcmVkIGJpdHMgdG8gYmUgc2V0IC0gYXQgdGhpcworCQlwb2ludCBlaXRoZXIgdGhlIHJlcXVpcmVkIGJpdHMgd2VyZSBzZXQgb3IgdGhlIGJsb2NrIHRpbWUgZXhwaXJlZC4gIElmCisJCXRoZSByZXF1aXJlZCBiaXRzIHdlcmUgc2V0IHRoZXkgd2lsbCBoYXZlIGJlZW4gc3RvcmVkIGluIHRoZSB0YXNrJ3MKKwkJZXZlbnQgbGlzdCBpdGVtLCBhbmQgdGhleSBzaG91bGQgbm93IGJlIHJldHJpZXZlZCB0aGVuIGNsZWFyZWQuICovCisJCXV4UmV0dXJuID0gdXhUYXNrUmVzZXRFdmVudEl0ZW1WYWx1ZSgpOworCisJCWlmKCAoIHV4UmV0dXJuICYgZXZlbnRVTkJMT0NLRURfRFVFX1RPX0JJVF9TRVQgKSA9PSAoIEV2ZW50Qml0c190ICkgMCApCisJCXsKKwkJCS8qIFRoZSB0YXNrIHRpbWVkIG91dCwganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgZXZlbnQgYml0IHZhbHVlLiAqLworCQkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJCQl7CisJCQkJdXhSZXR1cm4gPSBweEV2ZW50Qml0cy0+dXhFdmVudEJpdHM7CisKKwkJCQkvKiBBbHRob3VnaCB0aGUgdGFzayBnb3QgaGVyZSBiZWNhdXNlIGl0IHRpbWVkIG91dCBiZWZvcmUgdGhlCisJCQkJYml0cyBpdCB3YXMgd2FpdGluZyBmb3Igd2VyZSBzZXQsIGl0IGlzIHBvc3NpYmxlIHRoYXQgc2luY2UgaXQKKwkJCQl1bmJsb2NrZWQgYW5vdGhlciB0YXNrIGhhcyBzZXQgdGhlIGJpdHMuICBJZiB0aGlzIGlzIHRoZSBjYXNlCisJCQkJdGhlbiBpdCBuZWVkcyB0byBjbGVhciB0aGUgYml0cyBiZWZvcmUgZXhpdGluZy4gKi8KKwkJCQlpZiggKCB1eFJldHVybiAmIHV4Qml0c1RvV2FpdEZvciApID09IHV4Qml0c1RvV2FpdEZvciApCisJCQkJeworCQkJCQlweEV2ZW50Qml0cy0+dXhFdmVudEJpdHMgJj0gfnV4Qml0c1RvV2FpdEZvcjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJCXhUaW1lb3V0T2NjdXJyZWQgPSBwZFRSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBUaGUgdGFzayB1bmJsb2NrZWQgYmVjYXVzZSB0aGUgYml0cyB3ZXJlIHNldC4gKi8KKwkJfQorCisJCS8qIENvbnRyb2wgYml0cyBtaWdodCBiZSBzZXQgYXMgdGhlIHRhc2sgaGFkIGJsb2NrZWQgc2hvdWxkIG5vdCBiZQorCQlyZXR1cm5lZC4gKi8KKwkJdXhSZXR1cm4gJj0gfmV2ZW50RVZFTlRfQklUU19DT05UUk9MX0JZVEVTOworCX0KKworCXRyYWNlRVZFTlRfR1JPVVBfU1lOQ19FTkQoIHhFdmVudEdyb3VwLCB1eEJpdHNUb1NldCwgdXhCaXRzVG9XYWl0Rm9yLCB4VGltZW91dE9jY3VycmVkICk7CisKKwkvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gdHJhY2UgbWFjcm9zIGFyZSBub3QgdXNlZC4gKi8KKwkoIHZvaWQgKSB4VGltZW91dE9jY3VycmVkOworCisJcmV0dXJuIHV4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0V2ZW50Qml0c190IHhFdmVudEdyb3VwV2FpdEJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBjb25zdCBCYXNlVHlwZV90IHhDbGVhck9uRXhpdCwgY29uc3QgQmFzZVR5cGVfdCB4V2FpdEZvckFsbEJpdHMsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKK3sKK0V2ZW50R3JvdXBfdCAqcHhFdmVudEJpdHMgPSAoIEV2ZW50R3JvdXBfdCAqICkgeEV2ZW50R3JvdXA7CitFdmVudEJpdHNfdCB1eFJldHVybiwgdXhDb250cm9sQml0cyA9IDA7CitCYXNlVHlwZV90IHhXYWl0Q29uZGl0aW9uTWV0LCB4QWxyZWFkeVlpZWxkZWQ7CitCYXNlVHlwZV90IHhUaW1lb3V0T2NjdXJyZWQgPSBwZEZBTFNFOworCisJLyogQ2hlY2sgdGhlIHVzZXIgaXMgbm90IGF0dGVtcHRpbmcgdG8gd2FpdCBvbiB0aGUgYml0cyB1c2VkIGJ5IHRoZSBrZXJuZWwKKwlpdHNlbGYsIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgaXMgYmVpbmcgcmVxdWVzdGVkLiAqLworCWNvbmZpZ0FTU0VSVCggeEV2ZW50R3JvdXAgKTsKKwljb25maWdBU1NFUlQoICggdXhCaXRzVG9XYWl0Rm9yICYgZXZlbnRFVkVOVF9CSVRTX0NPTlRST0xfQllURVMgKSA9PSAwICk7CisJY29uZmlnQVNTRVJUKCB1eEJpdHNUb1dhaXRGb3IgIT0gMCApOworCSNpZiAoICggSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlID09IDEgKSB8fCAoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApICkKKwl7CisJCWNvbmZpZ0FTU0VSVCggISggKCB4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgPT0gdGFza1NDSEVEVUxFUl9TVVNQRU5ERUQgKSAmJiAoIHhUaWNrc1RvV2FpdCAhPSAwICkgKSApOworCX0KKwkjZW5kaWYKKworCXZUYXNrU3VzcGVuZEFsbCgpOworCXsKKwkJY29uc3QgRXZlbnRCaXRzX3QgdXhDdXJyZW50RXZlbnRCaXRzID0gcHhFdmVudEJpdHMtPnV4RXZlbnRCaXRzOworCisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgd2FpdCBjb25kaXRpb24gaXMgYWxyZWFkeSBtZXQgb3Igbm90LiAqLworCQl4V2FpdENvbmRpdGlvbk1ldCA9IHBydlRlc3RXYWl0Q29uZGl0aW9uKCB1eEN1cnJlbnRFdmVudEJpdHMsIHV4Qml0c1RvV2FpdEZvciwgeFdhaXRGb3JBbGxCaXRzICk7CisKKwkJaWYoIHhXYWl0Q29uZGl0aW9uTWV0ICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBUaGUgd2FpdCBjb25kaXRpb24gaGFzIGFscmVhZHkgYmVlbiBtZXQgc28gdGhlcmUgaXMgbm8gbmVlZCB0bworCQkJYmxvY2suICovCisJCQl1eFJldHVybiA9IHV4Q3VycmVudEV2ZW50Qml0czsKKwkJCXhUaWNrc1RvV2FpdCA9ICggVGlja1R5cGVfdCApIDA7CisKKwkJCS8qIENsZWFyIHRoZSB3YWl0IGJpdHMgaWYgcmVxdWVzdGVkIHRvIGRvIHNvLiAqLworCQkJaWYoIHhDbGVhck9uRXhpdCAhPSBwZEZBTFNFICkKKwkJCXsKKwkJCQlweEV2ZW50Qml0cy0+dXhFdmVudEJpdHMgJj0gfnV4Qml0c1RvV2FpdEZvcjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiggeFRpY2tzVG9XYWl0ID09ICggVGlja1R5cGVfdCApIDAgKQorCQl7CisJCQkvKiBUaGUgd2FpdCBjb25kaXRpb24gaGFzIG5vdCBiZWVuIG1ldCwgYnV0IG5vIGJsb2NrIHRpbWUgd2FzCisJCQlzcGVjaWZpZWQsIHNvIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLiAqLworCQkJdXhSZXR1cm4gPSB1eEN1cnJlbnRFdmVudEJpdHM7CisJCQl4VGltZW91dE9jY3VycmVkID0gcGRUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogVGhlIHRhc2sgaXMgZ29pbmcgdG8gYmxvY2sgdG8gd2FpdCBmb3IgaXRzIHJlcXVpcmVkIGJpdHMgdG8gYmUKKwkJCXNldC4gIHV4Q29udHJvbEJpdHMgYXJlIHVzZWQgdG8gcmVtZW1iZXIgdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgb2YKKwkJCXRoaXMgY2FsbCB0byB4RXZlbnRHcm91cFdhaXRCaXRzKCkgLSBmb3IgdXNlIHdoZW4gdGhlIGV2ZW50IGJpdHMKKwkJCXVuYmxvY2sgdGhlIHRhc2suICovCisJCQlpZiggeENsZWFyT25FeGl0ICE9IHBkRkFMU0UgKQorCQkJeworCQkJCXV4Q29udHJvbEJpdHMgfD0gZXZlbnRDTEVBUl9FVkVOVFNfT05fRVhJVF9CSVQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCisJCQlpZiggeFdhaXRGb3JBbGxCaXRzICE9IHBkRkFMU0UgKQorCQkJeworCQkJCXV4Q29udHJvbEJpdHMgfD0gZXZlbnRXQUlUX0ZPUl9BTExfQklUUzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisKKwkJCS8qIFN0b3JlIHRoZSBiaXRzIHRoYXQgdGhlIGNhbGxpbmcgdGFzayBpcyB3YWl0aW5nIGZvciBpbiB0aGUKKwkJCXRhc2sncyBldmVudCBsaXN0IGl0ZW0gc28gdGhlIGtlcm5lbCBrbm93cyB3aGVuIGEgbWF0Y2ggaXMKKwkJCWZvdW5kLiAgVGhlbiBlbnRlciB0aGUgYmxvY2tlZCBzdGF0ZS4gKi8KKwkJCXZUYXNrUGxhY2VPblVub3JkZXJlZEV2ZW50TGlzdCggJiggcHhFdmVudEJpdHMtPnhUYXNrc1dhaXRpbmdGb3JCaXRzICksICggdXhCaXRzVG9XYWl0Rm9yIHwgdXhDb250cm9sQml0cyApLCB4VGlja3NUb1dhaXQgKTsKKworCQkJLyogVGhpcyBpcyBvYnNvbGV0ZSBhcyBpdCB3aWxsIGdldCBzZXQgYWZ0ZXIgdGhlIHRhc2sgdW5ibG9ja3MsIGJ1dAorCQkJc29tZSBjb21waWxlcnMgbWlzdGFrZW5seSBnZW5lcmF0ZSBhIHdhcm5pbmcgYWJvdXQgdGhlIHZhcmlhYmxlCisJCQliZWluZyByZXR1cm5lZCB3aXRob3V0IGJlaW5nIHNldCBpZiBpdCBpcyBub3QgZG9uZS4gKi8KKwkJCXV4UmV0dXJuID0gMDsKKworCQkJdHJhY2VFVkVOVF9HUk9VUF9XQUlUX0JJVFNfQkxPQ0soIHhFdmVudEdyb3VwLCB1eEJpdHNUb1dhaXRGb3IgKTsKKwkJfQorCX0KKwl4QWxyZWFkeVlpZWxkZWQgPSB4VGFza1Jlc3VtZUFsbCgpOworCisJaWYoIHhUaWNrc1RvV2FpdCAhPSAoIFRpY2tUeXBlX3QgKSAwICkKKwl7CisJCWlmKCB4QWxyZWFkeVlpZWxkZWQgPT0gcGRGQUxTRSApCisJCXsKKwkJCXBvcnRZSUVMRF9XSVRISU5fQVBJKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKworCQkvKiBUaGUgdGFzayBibG9ja2VkIHRvIHdhaXQgZm9yIGl0cyByZXF1aXJlZCBiaXRzIHRvIGJlIHNldCAtIGF0IHRoaXMKKwkJcG9pbnQgZWl0aGVyIHRoZSByZXF1aXJlZCBiaXRzIHdlcmUgc2V0IG9yIHRoZSBibG9jayB0aW1lIGV4cGlyZWQuICBJZgorCQl0aGUgcmVxdWlyZWQgYml0cyB3ZXJlIHNldCB0aGV5IHdpbGwgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgdGFzaydzCisJCWV2ZW50IGxpc3QgaXRlbSwgYW5kIHRoZXkgc2hvdWxkIG5vdyBiZSByZXRyaWV2ZWQgdGhlbiBjbGVhcmVkLiAqLworCQl1eFJldHVybiA9IHV4VGFza1Jlc2V0RXZlbnRJdGVtVmFsdWUoKTsKKworCQlpZiggKCB1eFJldHVybiAmIGV2ZW50VU5CTE9DS0VEX0RVRV9UT19CSVRfU0VUICkgPT0gKCBFdmVudEJpdHNfdCApIDAgKQorCQl7CisJCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJCXsKKwkJCQkvKiBUaGUgdGFzayB0aW1lZCBvdXQsIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IGV2ZW50IGJpdCB2YWx1ZS4gKi8KKwkJCQl1eFJldHVybiA9IHB4RXZlbnRCaXRzLT51eEV2ZW50Qml0czsKKworCQkJCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGV2ZW50IGJpdHMgd2VyZSB1cGRhdGVkIGJldHdlZW4gdGhpcworCQkJCXRhc2sgbGVhdmluZyB0aGUgQmxvY2tlZCBzdGF0ZSBhbmQgcnVubmluZyBhZ2Fpbi4gKi8KKwkJCQlpZiggcHJ2VGVzdFdhaXRDb25kaXRpb24oIHV4UmV0dXJuLCB1eEJpdHNUb1dhaXRGb3IsIHhXYWl0Rm9yQWxsQml0cyApICE9IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJaWYoIHhDbGVhck9uRXhpdCAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJcHhFdmVudEJpdHMtPnV4RXZlbnRCaXRzICY9IH51eEJpdHNUb1dhaXRGb3I7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCQl4VGltZW91dE9jY3VycmVkID0gcGRUUlVFOworCQkJfQorCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFRoZSB0YXNrIHVuYmxvY2tlZCBiZWNhdXNlIHRoZSBiaXRzIHdlcmUgc2V0LiAqLworCQl9CisKKwkJLyogVGhlIHRhc2sgYmxvY2tlZCBzbyBjb250cm9sIGJpdHMgbWF5IGhhdmUgYmVlbiBzZXQuICovCisJCXV4UmV0dXJuICY9IH5ldmVudEVWRU5UX0JJVFNfQ09OVFJPTF9CWVRFUzsKKwl9CisJdHJhY2VFVkVOVF9HUk9VUF9XQUlUX0JJVFNfRU5EKCB4RXZlbnRHcm91cCwgdXhCaXRzVG9XYWl0Rm9yLCB4VGltZW91dE9jY3VycmVkICk7CisKKwkvKiBQcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gdHJhY2UgbWFjcm9zIGFyZSBub3QgdXNlZC4gKi8KKwkoIHZvaWQgKSB4VGltZW91dE9jY3VycmVkOworCisJcmV0dXJuIHV4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0V2ZW50Qml0c190IHhFdmVudEdyb3VwQ2xlYXJCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvQ2xlYXIgKQoreworRXZlbnRHcm91cF90ICpweEV2ZW50Qml0cyA9ICggRXZlbnRHcm91cF90ICogKSB4RXZlbnRHcm91cDsKK0V2ZW50Qml0c190IHV4UmV0dXJuOworCisJLyogQ2hlY2sgdGhlIHVzZXIgaXMgbm90IGF0dGVtcHRpbmcgdG8gY2xlYXIgdGhlIGJpdHMgdXNlZCBieSB0aGUga2VybmVsCisJaXRzZWxmLiAqLworCWNvbmZpZ0FTU0VSVCggeEV2ZW50R3JvdXAgKTsKKwljb25maWdBU1NFUlQoICggdXhCaXRzVG9DbGVhciAmIGV2ZW50RVZFTlRfQklUU19DT05UUk9MX0JZVEVTICkgPT0gMCApOworCisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJeworCQl0cmFjZUVWRU5UX0dST1VQX0NMRUFSX0JJVFMoIHhFdmVudEdyb3VwLCB1eEJpdHNUb0NsZWFyICk7CisKKwkJLyogVGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSBldmVudCBncm91cCB2YWx1ZSBwcmlvciB0byB0aGUgYml0cyBiZWluZworCQljbGVhcmVkLiAqLworCQl1eFJldHVybiA9IHB4RXZlbnRCaXRzLT51eEV2ZW50Qml0czsKKworCQkvKiBDbGVhciB0aGUgYml0cy4gKi8KKwkJcHhFdmVudEJpdHMtPnV4RXZlbnRCaXRzICY9IH51eEJpdHNUb0NsZWFyOworCX0KKwl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJcmV0dXJuIHV4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSAmJiAoIElOQ0xVREVfeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbCA9PSAxICkgJiYgKCBjb25maWdVU0VfVElNRVJTID09IDEgKSApCisKKwlCYXNlVHlwZV90IHhFdmVudEdyb3VwQ2xlYXJCaXRzRnJvbUlTUiggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb0NsZWFyICkKKwl7CisJCUJhc2VUeXBlX3QgeFJldHVybjsKKworCQl0cmFjZUVWRU5UX0dST1VQX0NMRUFSX0JJVFNfRlJPTV9JU1IoIHhFdmVudEdyb3VwLCB1eEJpdHNUb0NsZWFyICk7CisJCXhSZXR1cm4gPSB4VGltZXJQZW5kRnVuY3Rpb25DYWxsRnJvbUlTUiggdkV2ZW50R3JvdXBDbGVhckJpdHNDYWxsYmFjaywgKCB2b2lkICogKSB4RXZlbnRHcm91cCwgKCB1aW50MzJfdCApIHV4Qml0c1RvQ2xlYXIsIE5VTEwgKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0V2ZW50Qml0c190IHhFdmVudEdyb3VwR2V0Qml0c0Zyb21JU1IoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCApCit7CitVQmFzZVR5cGVfdCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzOworRXZlbnRHcm91cF90ICpweEV2ZW50Qml0cyA9ICggRXZlbnRHcm91cF90ICogKSB4RXZlbnRHcm91cDsKK0V2ZW50Qml0c190IHV4UmV0dXJuOworCisJdXhTYXZlZEludGVycnVwdFN0YXR1cyA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCXV4UmV0dXJuID0gcHhFdmVudEJpdHMtPnV4RXZlbnRCaXRzOworCX0KKwlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgKTsKKworCXJldHVybiB1eFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitFdmVudEJpdHNfdCB4RXZlbnRHcm91cFNldEJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9TZXQgKQoreworTGlzdEl0ZW1fdCAqcHhMaXN0SXRlbSwgKnB4TmV4dDsKK0xpc3RJdGVtX3QgY29uc3QgKnB4TGlzdEVuZDsKK0xpc3RfdCAqcHhMaXN0OworRXZlbnRCaXRzX3QgdXhCaXRzVG9DbGVhciA9IDAsIHV4Qml0c1dhaXRlZEZvciwgdXhDb250cm9sQml0czsKK0V2ZW50R3JvdXBfdCAqcHhFdmVudEJpdHMgPSAoIEV2ZW50R3JvdXBfdCAqICkgeEV2ZW50R3JvdXA7CitCYXNlVHlwZV90IHhNYXRjaEZvdW5kID0gcGRGQUxTRTsKKworCS8qIENoZWNrIHRoZSB1c2VyIGlzIG5vdCBhdHRlbXB0aW5nIHRvIHNldCB0aGUgYml0cyB1c2VkIGJ5IHRoZSBrZXJuZWwKKwlpdHNlbGYuICovCisJY29uZmlnQVNTRVJUKCB4RXZlbnRHcm91cCApOworCWNvbmZpZ0FTU0VSVCggKCB1eEJpdHNUb1NldCAmIGV2ZW50RVZFTlRfQklUU19DT05UUk9MX0JZVEVTICkgPT0gMCApOworCisJcHhMaXN0ID0gJiggcHhFdmVudEJpdHMtPnhUYXNrc1dhaXRpbmdGb3JCaXRzICk7CisJcHhMaXN0RW5kID0gbGlzdEdFVF9FTkRfTUFSS0VSKCBweExpc3QgKTsgLypsaW50ICFlODI2ICFlNzQwIFRoZSBtaW5pIGxpc3Qgc3RydWN0dXJlIGlzIHVzZWQgYXMgdGhlIGxpc3QgZW5kIHRvIHNhdmUgUkFNLiAgVGhpcyBpcyBjaGVja2VkIGFuZCB2YWxpZC4gKi8KKwl2VGFza1N1c3BlbmRBbGwoKTsKKwl7CisJCXRyYWNlRVZFTlRfR1JPVVBfU0VUX0JJVFMoIHhFdmVudEdyb3VwLCB1eEJpdHNUb1NldCApOworCisJCXB4TGlzdEl0ZW0gPSBsaXN0R0VUX0hFQURfRU5UUlkoIHB4TGlzdCApOworCisJCS8qIFNldCB0aGUgYml0cy4gKi8KKwkJcHhFdmVudEJpdHMtPnV4RXZlbnRCaXRzIHw9IHV4Qml0c1RvU2V0OworCisJCS8qIFNlZSBpZiB0aGUgbmV3IGJpdCB2YWx1ZSBzaG91bGQgdW5ibG9jayBhbnkgdGFza3MuICovCisJCXdoaWxlKCBweExpc3RJdGVtICE9IHB4TGlzdEVuZCApCisJCXsKKwkJCXB4TmV4dCA9IGxpc3RHRVRfTkVYVCggcHhMaXN0SXRlbSApOworCQkJdXhCaXRzV2FpdGVkRm9yID0gbGlzdEdFVF9MSVNUX0lURU1fVkFMVUUoIHB4TGlzdEl0ZW0gKTsKKwkJCXhNYXRjaEZvdW5kID0gcGRGQUxTRTsKKworCQkJLyogU3BsaXQgdGhlIGJpdHMgd2FpdGVkIGZvciBmcm9tIHRoZSBjb250cm9sIGJpdHMuICovCisJCQl1eENvbnRyb2xCaXRzID0gdXhCaXRzV2FpdGVkRm9yICYgZXZlbnRFVkVOVF9CSVRTX0NPTlRST0xfQllURVM7CisJCQl1eEJpdHNXYWl0ZWRGb3IgJj0gfmV2ZW50RVZFTlRfQklUU19DT05UUk9MX0JZVEVTOworCisJCQlpZiggKCB1eENvbnRyb2xCaXRzICYgZXZlbnRXQUlUX0ZPUl9BTExfQklUUyApID09ICggRXZlbnRCaXRzX3QgKSAwICkKKwkJCXsKKwkJCQkvKiBKdXN0IGxvb2tpbmcgZm9yIHNpbmdsZSBiaXQgYmVpbmcgc2V0LiAqLworCQkJCWlmKCAoIHV4Qml0c1dhaXRlZEZvciAmIHB4RXZlbnRCaXRzLT51eEV2ZW50Qml0cyApICE9ICggRXZlbnRCaXRzX3QgKSAwICkKKwkJCQl7CisJCQkJCXhNYXRjaEZvdW5kID0gcGRUUlVFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiggKCB1eEJpdHNXYWl0ZWRGb3IgJiBweEV2ZW50Qml0cy0+dXhFdmVudEJpdHMgKSA9PSB1eEJpdHNXYWl0ZWRGb3IgKQorCQkJeworCQkJCS8qIEFsbCBiaXRzIGFyZSBzZXQuICovCisJCQkJeE1hdGNoRm91bmQgPSBwZFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogTmVlZCBhbGwgYml0cyB0byBiZSBzZXQsIGJ1dCBub3QgYWxsIHRoZSBiaXRzIHdlcmUgc2V0LiAqLworCQkJfQorCisJCQlpZiggeE1hdGNoRm91bmQgIT0gcGRGQUxTRSApCisJCQl7CisJCQkJLyogVGhlIGJpdHMgbWF0Y2guICBTaG91bGQgdGhlIGJpdHMgYmUgY2xlYXJlZCBvbiBleGl0PyAqLworCQkJCWlmKCAoIHV4Q29udHJvbEJpdHMgJiBldmVudENMRUFSX0VWRU5UU19PTl9FWElUX0JJVCApICE9ICggRXZlbnRCaXRzX3QgKSAwICkKKwkJCQl7CisJCQkJCXV4Qml0c1RvQ2xlYXIgfD0gdXhCaXRzV2FpdGVkRm9yOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCisJCQkJLyogU3RvcmUgdGhlIGFjdHVhbCBldmVudCBmbGFnIHZhbHVlIGluIHRoZSB0YXNrJ3MgZXZlbnQgbGlzdAorCQkJCWl0ZW0gYmVmb3JlIHJlbW92aW5nIHRoZSB0YXNrIGZyb20gdGhlIGV2ZW50IGxpc3QuICBUaGUKKwkJCQlldmVudFVOQkxPQ0tFRF9EVUVfVE9fQklUX1NFVCBiaXQgaXMgc2V0IHNvIHRoZSB0YXNrIGtub3dzCisJCQkJdGhhdCBpcyB3YXMgdW5ibG9ja2VkIGR1ZSB0byBpdHMgcmVxdWlyZWQgYml0cyBtYXRjaGluZywgcmF0aGVyCisJCQkJdGhhbiBiZWNhdXNlIGl0IHRpbWVkIG91dC4gKi8KKwkJCQl2VGFza1JlbW92ZUZyb21Vbm9yZGVyZWRFdmVudExpc3QoIHB4TGlzdEl0ZW0sIHB4RXZlbnRCaXRzLT51eEV2ZW50Qml0cyB8IGV2ZW50VU5CTE9DS0VEX0RVRV9UT19CSVRfU0VUICk7CisJCQl9CisKKwkJCS8qIE1vdmUgb250byB0aGUgbmV4dCBsaXN0IGl0ZW0uICBOb3RlIHB4TGlzdEl0ZW0tPnB4TmV4dCBpcyBub3QKKwkJCXVzZWQgaGVyZSBhcyB0aGUgbGlzdCBpdGVtIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBldmVudCBsaXN0CisJCQlhbmQgaW5zZXJ0ZWQgaW50byB0aGUgcmVhZHkvcGVuZGluZyByZWFkaW5nIGxpc3QuICovCisJCQlweExpc3RJdGVtID0gcHhOZXh0OworCQl9CisKKwkJLyogQ2xlYXIgYW55IGJpdHMgdGhhdCBtYXRjaGVkIHdoZW4gdGhlIGV2ZW50Q0xFQVJfRVZFTlRTX09OX0VYSVRfQklUCisJCWJpdCB3YXMgc2V0IGluIHRoZSBjb250cm9sIHdvcmQuICovCisJCXB4RXZlbnRCaXRzLT51eEV2ZW50Qml0cyAmPSB+dXhCaXRzVG9DbGVhcjsKKwl9CisJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKworCXJldHVybiBweEV2ZW50Qml0cy0+dXhFdmVudEJpdHM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2RXZlbnRHcm91cERlbGV0ZSggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwICkKK3sKK0V2ZW50R3JvdXBfdCAqcHhFdmVudEJpdHMgPSAoIEV2ZW50R3JvdXBfdCAqICkgeEV2ZW50R3JvdXA7Citjb25zdCBMaXN0X3QgKnB4VGFza3NXYWl0aW5nRm9yQml0cyA9ICYoIHB4RXZlbnRCaXRzLT54VGFza3NXYWl0aW5nRm9yQml0cyApOworCisJdlRhc2tTdXNwZW5kQWxsKCk7CisJeworCQl0cmFjZUVWRU5UX0dST1VQX0RFTEVURSggeEV2ZW50R3JvdXAgKTsKKworCQl3aGlsZSggbGlzdENVUlJFTlRfTElTVF9MRU5HVEgoIHB4VGFza3NXYWl0aW5nRm9yQml0cyApID4gKCBVQmFzZVR5cGVfdCApIDAgKQorCQl7CisJCQkvKiBVbmJsb2NrIHRoZSB0YXNrLCByZXR1cm5pbmcgMCBhcyB0aGUgZXZlbnQgbGlzdCBpcyBiZWluZyBkZWxldGVkCisJCQlhbmQgY2Fubm90IHRoZXJlZm9yZSBoYXZlIGFueSBiaXRzIHNldC4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggcHhUYXNrc1dhaXRpbmdGb3JCaXRzLT54TGlzdEVuZC5weE5leHQgIT0gKCBjb25zdCBMaXN0SXRlbV90ICogKSAmKCBweFRhc2tzV2FpdGluZ0ZvckJpdHMtPnhMaXN0RW5kICkgKTsKKwkJCXZUYXNrUmVtb3ZlRnJvbVVub3JkZXJlZEV2ZW50TGlzdCggcHhUYXNrc1dhaXRpbmdGb3JCaXRzLT54TGlzdEVuZC5weE5leHQsIGV2ZW50VU5CTE9DS0VEX0RVRV9UT19CSVRfU0VUICk7CisJCX0KKworCQkjaWYoICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAwICkgKQorCQl7CisJCQkvKiBUaGUgZXZlbnQgZ3JvdXAgY2FuIG9ubHkgaGF2ZSBiZWVuIGFsbG9jYXRlZCBkeW5hbWljYWxseSAtIGZyZWUKKwkJCWl0IGFnYWluLiAqLworCQkJdlBvcnRGcmVlKCBweEV2ZW50Qml0cyApOworCQl9CisJCSNlbGlmKCAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICkKKwkJeworCQkJLyogVGhlIGV2ZW50IGdyb3VwIGNvdWxkIGhhdmUgYmVlbiBhbGxvY2F0ZWQgc3RhdGljYWxseSBvcgorCQkJZHluYW1pY2FsbHksIHNvIGNoZWNrIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGZyZWUgdGhlIG1lbW9yeS4gKi8KKwkJCWlmKCBweEV2ZW50Qml0cy0+dWNTdGF0aWNhbGx5QWxsb2NhdGVkID09ICggdWludDhfdCApIHBkRkFMU0UgKQorCQkJeworCQkJCXZQb3J0RnJlZSggcHhFdmVudEJpdHMgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OICovCisJfQorCSggdm9pZCApIHhUYXNrUmVzdW1lQWxsKCk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRm9yIGludGVybmFsIHVzZSBvbmx5IC0gZXhlY3V0ZSBhICdzZXQgYml0cycgY29tbWFuZCB0aGF0IHdhcyBwZW5kZWQgZnJvbQorYW4gaW50ZXJydXB0LiAqLwordm9pZCB2RXZlbnRHcm91cFNldEJpdHNDYWxsYmFjayggdm9pZCAqcHZFdmVudEdyb3VwLCBjb25zdCB1aW50MzJfdCB1bEJpdHNUb1NldCApCit7CisJKCB2b2lkICkgeEV2ZW50R3JvdXBTZXRCaXRzKCBwdkV2ZW50R3JvdXAsICggRXZlbnRCaXRzX3QgKSB1bEJpdHNUb1NldCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZvciBpbnRlcm5hbCB1c2Ugb25seSAtIGV4ZWN1dGUgYSAnY2xlYXIgYml0cycgY29tbWFuZCB0aGF0IHdhcyBwZW5kZWQgZnJvbQorYW4gaW50ZXJydXB0LiAqLwordm9pZCB2RXZlbnRHcm91cENsZWFyQml0c0NhbGxiYWNrKCB2b2lkICpwdkV2ZW50R3JvdXAsIGNvbnN0IHVpbnQzMl90IHVsQml0c1RvQ2xlYXIgKQoreworCSggdm9pZCApIHhFdmVudEdyb3VwQ2xlYXJCaXRzKCBwdkV2ZW50R3JvdXAsICggRXZlbnRCaXRzX3QgKSB1bEJpdHNUb0NsZWFyICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIEJhc2VUeXBlX3QgcHJ2VGVzdFdhaXRDb25kaXRpb24oIGNvbnN0IEV2ZW50Qml0c190IHV4Q3VycmVudEV2ZW50Qml0cywgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBjb25zdCBCYXNlVHlwZV90IHhXYWl0Rm9yQWxsQml0cyApCit7CitCYXNlVHlwZV90IHhXYWl0Q29uZGl0aW9uTWV0ID0gcGRGQUxTRTsKKworCWlmKCB4V2FpdEZvckFsbEJpdHMgPT0gcGRGQUxTRSApCisJeworCQkvKiBUYXNrIG9ubHkgaGFzIHRvIHdhaXQgZm9yIG9uZSBiaXQgd2l0aGluIHV4Qml0c1RvV2FpdEZvciB0byBiZQorCQlzZXQuICBJcyBvbmUgYWxyZWFkeSBzZXQ/ICovCisJCWlmKCAoIHV4Q3VycmVudEV2ZW50Qml0cyAmIHV4Qml0c1RvV2FpdEZvciApICE9ICggRXZlbnRCaXRzX3QgKSAwICkKKwkJeworCQkJeFdhaXRDb25kaXRpb25NZXQgPSBwZFRSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLyogVGFzayBoYXMgdG8gd2FpdCBmb3IgYWxsIHRoZSBiaXRzIGluIHV4Qml0c1RvV2FpdEZvciB0byBiZSBzZXQuCisJCUFyZSB0aGV5IHNldCBhbHJlYWR5PyAqLworCQlpZiggKCB1eEN1cnJlbnRFdmVudEJpdHMgJiB1eEJpdHNUb1dhaXRGb3IgKSA9PSB1eEJpdHNUb1dhaXRGb3IgKQorCQl7CisJCQl4V2FpdENvbmRpdGlvbk1ldCA9IHBkVFJVRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKworCXJldHVybiB4V2FpdENvbmRpdGlvbk1ldDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkgJiYgKCBJTkNMVURFX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwgPT0gMSApICYmICggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkgKQorCisJQmFzZVR5cGVfdCB4RXZlbnRHcm91cFNldEJpdHNGcm9tSVNSKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvU2V0LCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkKKwl7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCisJCXRyYWNlRVZFTlRfR1JPVVBfU0VUX0JJVFNfRlJPTV9JU1IoIHhFdmVudEdyb3VwLCB1eEJpdHNUb1NldCApOworCQl4UmV0dXJuID0geFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbEZyb21JU1IoIHZFdmVudEdyb3VwU2V0Qml0c0NhbGxiYWNrLCAoIHZvaWQgKiApIHhFdmVudEdyb3VwLCAoIHVpbnQzMl90ICkgdXhCaXRzVG9TZXQsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEpCisKKwlVQmFzZVR5cGVfdCB1eEV2ZW50R3JvdXBHZXROdW1iZXIoIHZvaWQqIHhFdmVudEdyb3VwICkKKwl7CisJVUJhc2VUeXBlX3QgeFJldHVybjsKKwlFdmVudEdyb3VwX3QgKnB4RXZlbnRCaXRzID0gKCBFdmVudEdyb3VwX3QgKiApIHhFdmVudEdyb3VwOworCisJCWlmKCB4RXZlbnRHcm91cCA9PSBOVUxMICkKKwkJeworCQkJeFJldHVybiA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4UmV0dXJuID0gcHhFdmVudEJpdHMtPnV4RXZlbnRHcm91cE51bWJlcjsKKwkJfQorCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKworCXZvaWQgdkV2ZW50R3JvdXBTZXROdW1iZXIoIHZvaWQgKiB4RXZlbnRHcm91cCwgVUJhc2VUeXBlX3QgdXhFdmVudEdyb3VwTnVtYmVyICkKKwl7CisJCSggKCBFdmVudEdyb3VwX3QgKiApIHhFdmVudEdyb3VwICktPnV4RXZlbnRHcm91cE51bWJlciA9IHV4RXZlbnRHcm91cE51bWJlcjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL0ZyZWVSVE9TLmggYi9Tb3VyY2UvaW5jbHVkZS9GcmVlUlRPUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDE3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvaW5jbHVkZS9GcmVlUlRPUy5oCkBAIC0wLDAgKzEsMTE2OCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgSU5DX0ZSRUVSVE9TX0gKKyNkZWZpbmUgSU5DX0ZSRUVSVE9TX0gKKworLyoKKyAqIEluY2x1ZGUgdGhlIGdlbmVyaWMgaGVhZGVycyByZXF1aXJlZCBmb3IgdGhlIEZyZWVSVE9TIHBvcnQgYmVpbmcgdXNlZC4KKyAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKgorICogSWYgc3RkaW50LmggY2Fubm90IGJlIGxvY2F0ZWQgdGhlbjoKKyAqICAgKyBJZiB1c2luZyBHQ0MgZW5zdXJlIHRoZSAtbm9zdGRpbnQgb3B0aW9ucyBpcyAqbm90KiBiZWluZyB1c2VkLgorICogICArIEVuc3VyZSB0aGUgcHJvamVjdCdzIGluY2x1ZGUgcGF0aCBpbmNsdWRlcyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHlvdXIKKyAqICAgICBjb21waWxlciBzdG9yZXMgc3RkaW50LmguCisgKiAgICsgU2V0IGFueSBjb21waWxlciBvcHRpb25zIG5lY2Vzc2FyeSBmb3IgaXQgdG8gc3VwcG9ydCBDOTksIGFzIHRlY2huaWNhbGx5CisgKiAgICAgc3RkaW50LmggaXMgb25seSBtYW5kYXRvcnkgd2l0aCBDOTkgKEZyZWVSVE9TIGRvZXMgbm90IHJlcXVpcmUgQzk5IGluIGFueQorICogICAgIG90aGVyIHdheSkuCisgKiAgICsgVGhlIEZyZWVSVE9TIGRvd25sb2FkIGluY2x1ZGVzIGEgc2ltcGxlIHN0ZGludC5oIGRlZmluaXRpb24gdGhhdCBjYW4gYmUKKyAqICAgICB1c2VkIGluIGNhc2VzIHdoZXJlIG5vbmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvbXBpbGVyLiAgVGhlIGZpbGVzIG9ubHkKKyAqICAgICBjb250YWlucyB0aGUgdHlwZWRlZnMgcmVxdWlyZWQgdG8gYnVpbGQgRnJlZVJUT1MuICBSZWFkIHRoZSBpbnN0cnVjdGlvbnMKKyAqICAgICBpbiBGcmVlUlRPUy9zb3VyY2Uvc3RkaW50LnJlYWRtZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGludC5oPiAvKiBSRUFEIENPTU1FTlQgQUJPVkUuICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQXBwbGljYXRpb24gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb25zLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TQ29uZmlnLmgiCisKKy8qIEJhc2ljIEZyZWVSVE9TIGRlZmluaXRpb25zLiAqLworI2luY2x1ZGUgInByb2pkZWZzLmgiCisKKy8qIERlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBwb3J0IGJlaW5nIHVzZWQuICovCisjaW5jbHVkZSAicG9ydGFibGUuaCIKKworLyogTXVzdCBiZSBkZWZhdWx0ZWQgYmVmb3JlIGNvbmZpZ1VTRV9ORVdMSUJfUkVFTlRSQU5UIGlzIHVzZWQgYmVsb3cuICovCisjaWZuZGVmIGNvbmZpZ1VTRV9ORVdMSUJfUkVFTlRSQU5UCisJI2RlZmluZSBjb25maWdVU0VfTkVXTElCX1JFRU5UUkFOVCAwCisjZW5kaWYKKworLyogUmVxdWlyZWQgaWYgc3RydWN0IF9yZWVudCBpcyB1c2VkLiAqLworI2lmICggY29uZmlnVVNFX05FV0xJQl9SRUVOVFJBTlQgPT0gMSApCisJI2luY2x1ZGUgPHJlZW50Lmg+CisjZW5kaWYKKy8qCisgKiBDaGVjayBhbGwgdGhlIHJlcXVpcmVkIGFwcGxpY2F0aW9uIHNwZWNpZmljIG1hY3JvcyBoYXZlIGJlZW4gZGVmaW5lZC4KKyAqIFRoZXNlIG1hY3JvcyBhcmUgYXBwbGljYXRpb24gc3BlY2lmaWMgYW5kIChhcyBkb3dubG9hZGVkKSBhcmUgZGVmaW5lZAorICogd2l0aGluIEZyZWVSVE9TQ29uZmlnLmguCisgKi8KKworI2lmbmRlZiBjb25maWdNSU5JTUFMX1NUQUNLX1NJWkUKKwkjZXJyb3IgTWlzc2luZyBkZWZpbml0aW9uOiAgY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFIGRlZmluZXMgdGhlIHNpemUgKGluIHdvcmRzKSBvZiB0aGUgc3RhY2sgYWxsb2NhdGVkIHRvIHRoZSBpZGxlIHRhc2suICBSZWZlciB0byB0aGUgZGVtbyBwcm9qZWN0IHByb3ZpZGVkIGZvciB5b3VyIHBvcnQgZm9yIGEgc3VpdGFibGUgdmFsdWUuCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdNQVhfUFJJT1JJVElFUworCSNlcnJvciBNaXNzaW5nIGRlZmluaXRpb246ICBjb25maWdNQVhfUFJJT1JJVElFUyBtdXN0IGJlIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaC4gIFNlZSB0aGUgQ29uZmlndXJhdGlvbiBzZWN0aW9uIG9mIHRoZSBGcmVlUlRPUyBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKyNlbmRpZgorCisjaWYgY29uZmlnTUFYX1BSSU9SSVRJRVMgPCAxCisJI2Vycm9yIGNvbmZpZ01BWF9QUklPUklUSUVTIG11c3QgYmUgZGVmaW5lZCB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4KKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1VTRV9QUkVFTVBUSU9OCisJI2Vycm9yIE1pc3NpbmcgZGVmaW5pdGlvbjogIGNvbmZpZ1VTRV9QUkVFTVBUSU9OIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oIGFzIGVpdGhlciAxIG9yIDAuICBTZWUgdGhlIENvbmZpZ3VyYXRpb24gc2VjdGlvbiBvZiB0aGUgRnJlZVJUT1MgQVBJIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdVU0VfSURMRV9IT09LCisJI2Vycm9yIE1pc3NpbmcgZGVmaW5pdGlvbjogIGNvbmZpZ1VTRV9JRExFX0hPT0sgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmggYXMgZWl0aGVyIDEgb3IgMC4gIFNlZSB0aGUgQ29uZmlndXJhdGlvbiBzZWN0aW9uIG9mIHRoZSBGcmVlUlRPUyBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1VTRV9USUNLX0hPT0sKKwkjZXJyb3IgTWlzc2luZyBkZWZpbml0aW9uOiAgY29uZmlnVVNFX1RJQ0tfSE9PSyBtdXN0IGJlIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaCBhcyBlaXRoZXIgMSBvciAwLiAgU2VlIHRoZSBDb25maWd1cmF0aW9uIHNlY3Rpb24gb2YgdGhlIEZyZWVSVE9TIEFQSSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnVVNFXzE2X0JJVF9USUNLUworCSNlcnJvciBNaXNzaW5nIGRlZmluaXRpb246ICBjb25maWdVU0VfMTZfQklUX1RJQ0tTIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oIGFzIGVpdGhlciAxIG9yIDAuICBTZWUgdGhlIENvbmZpZ3VyYXRpb24gc2VjdGlvbiBvZiB0aGUgRnJlZVJUT1MgQVBJIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdVU0VfQ09fUk9VVElORVMKKwkjZGVmaW5lIGNvbmZpZ1VTRV9DT19ST1VUSU5FUyAwCisjZW5kaWYKKworI2lmbmRlZiBJTkNMVURFX3ZUYXNrUHJpb3JpdHlTZXQKKwkjZGVmaW5lIElOQ0xVREVfdlRhc2tQcmlvcml0eVNldCAwCisjZW5kaWYKKworI2lmbmRlZiBJTkNMVURFX3V4VGFza1ByaW9yaXR5R2V0CisJI2RlZmluZSBJTkNMVURFX3V4VGFza1ByaW9yaXR5R2V0IDAKKyNlbmRpZgorCisjaWZuZGVmIElOQ0xVREVfdlRhc2tEZWxldGUKKwkjZGVmaW5lIElOQ0xVREVfdlRhc2tEZWxldGUgMAorI2VuZGlmCisKKyNpZm5kZWYgSU5DTFVERV92VGFza1N1c3BlbmQKKwkjZGVmaW5lIElOQ0xVREVfdlRhc2tTdXNwZW5kIDAKKyNlbmRpZgorCisjaWZuZGVmIElOQ0xVREVfdlRhc2tEZWxheVVudGlsCisJI2RlZmluZSBJTkNMVURFX3ZUYXNrRGVsYXlVbnRpbCAwCisjZW5kaWYKKworI2lmbmRlZiBJTkNMVURFX3ZUYXNrRGVsYXkKKwkjZGVmaW5lIElOQ0xVREVfdlRhc2tEZWxheSAwCisjZW5kaWYKKworI2lmbmRlZiBJTkNMVURFX3hUYXNrR2V0SWRsZVRhc2tIYW5kbGUKKwkjZGVmaW5lIElOQ0xVREVfeFRhc2tHZXRJZGxlVGFza0hhbmRsZSAwCisjZW5kaWYKKworI2lmbmRlZiBJTkNMVURFX3hUYXNrQWJvcnREZWxheQorCSNkZWZpbmUgSU5DTFVERV94VGFza0Fib3J0RGVsYXkgMAorI2VuZGlmCisKKyNpZm5kZWYgSU5DTFVERV94UXVldWVHZXRNdXRleEhvbGRlcgorCSNkZWZpbmUgSU5DTFVERV94UXVldWVHZXRNdXRleEhvbGRlciAwCisjZW5kaWYKKworI2lmbmRlZiBJTkNMVURFX3hTZW1hcGhvcmVHZXRNdXRleEhvbGRlcgorCSNkZWZpbmUgSU5DTFVERV94U2VtYXBob3JlR2V0TXV0ZXhIb2xkZXIgSU5DTFVERV94UXVldWVHZXRNdXRleEhvbGRlcgorI2VuZGlmCisKKyNpZm5kZWYgSU5DTFVERV94VGFza0dldEhhbmRsZQorCSNkZWZpbmUgSU5DTFVERV94VGFza0dldEhhbmRsZSAwCisjZW5kaWYKKworI2lmbmRlZiBJTkNMVURFX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyaworCSNkZWZpbmUgSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgMAorI2VuZGlmCisKKyNpZm5kZWYgSU5DTFVERV9lVGFza0dldFN0YXRlCisJI2RlZmluZSBJTkNMVURFX2VUYXNrR2V0U3RhdGUgMAorI2VuZGlmCisKKyNpZm5kZWYgSU5DTFVERV94VGFza1Jlc3VtZUZyb21JU1IKKwkjZGVmaW5lIElOQ0xVREVfeFRhc2tSZXN1bWVGcm9tSVNSIDEKKyNlbmRpZgorCisjaWZuZGVmIElOQ0xVREVfeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbAorCSNkZWZpbmUgSU5DTFVERV94VGltZXJQZW5kRnVuY3Rpb25DYWxsIDAKKyNlbmRpZgorCisjaWZuZGVmIElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZQorCSNkZWZpbmUgSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlIDAKKyNlbmRpZgorCisjaWZuZGVmIElOQ0xVREVfeFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZQorCSNkZWZpbmUgSU5DTFVERV94VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlIDAKKyNlbmRpZgorCisjaWYgY29uZmlnVVNFX0NPX1JPVVRJTkVTICE9IDAKKwkjaWZuZGVmIGNvbmZpZ01BWF9DT19ST1VUSU5FX1BSSU9SSVRJRVMKKwkJI2Vycm9yIGNvbmZpZ01BWF9DT19ST1VUSU5FX1BSSU9SSVRJRVMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4KKwkjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1VTRV9EQUVNT05fVEFTS19TVEFSVFVQX0hPT0sKKwkjZGVmaW5lIGNvbmZpZ1VTRV9EQUVNT05fVEFTS19TVEFSVFVQX0hPT0sgMAorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnVVNFX0FQUExJQ0FUSU9OX1RBU0tfVEFHCisJI2RlZmluZSBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgMAorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnTlVNX1RIUkVBRF9MT0NBTF9TVE9SQUdFX1BPSU5URVJTCisJI2RlZmluZSBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgMAorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTCisJI2RlZmluZSBjb25maWdVU0VfUkVDVVJTSVZFX01VVEVYRVMgMAorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnVVNFX01VVEVYRVMKKwkjZGVmaW5lIGNvbmZpZ1VTRV9NVVRFWEVTIDAKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1VTRV9USU1FUlMKKwkjZGVmaW5lIGNvbmZpZ1VTRV9USU1FUlMgMAorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnVVNFX0NPVU5USU5HX1NFTUFQSE9SRVMKKwkjZGVmaW5lIGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTIDAKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1VTRV9BTFRFUk5BVElWRV9BUEkKKwkjZGVmaW5lIGNvbmZpZ1VTRV9BTFRFUk5BVElWRV9BUEkgMAorI2VuZGlmCisKKyNpZm5kZWYgcG9ydENSSVRJQ0FMX05FU1RJTkdfSU5fVENCCisJI2RlZmluZSBwb3J0Q1JJVElDQUxfTkVTVElOR19JTl9UQ0IgMAorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnTUFYX1RBU0tfTkFNRV9MRU4KKwkjZGVmaW5lIGNvbmZpZ01BWF9UQVNLX05BTUVfTEVOIDE2CisjZW5kaWYKKworI2lmbmRlZiBjb25maWdJRExFX1NIT1VMRF9ZSUVMRAorCSNkZWZpbmUgY29uZmlnSURMRV9TSE9VTERfWUlFTEQJCTEKKyNlbmRpZgorCisjaWYgY29uZmlnTUFYX1RBU0tfTkFNRV9MRU4gPCAxCisJI2Vycm9yIGNvbmZpZ01BWF9UQVNLX05BTUVfTEVOIG11c3QgYmUgc2V0IHRvIGEgbWluaW11bSBvZiAxIGluIEZyZWVSVE9TQ29uZmlnLmgKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ0FTU0VSVAorCSNkZWZpbmUgY29uZmlnQVNTRVJUKCB4ICkKKwkjZGVmaW5lIGNvbmZpZ0FTU0VSVF9ERUZJTkVEIDAKKyNlbHNlCisJI2RlZmluZSBjb25maWdBU1NFUlRfREVGSU5FRCAxCisjZW5kaWYKKworLyogVGhlIHRpbWVycyBtb2R1bGUgcmVsaWVzIG9uIHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKS4gKi8KKyNpZiBjb25maWdVU0VfVElNRVJTID09IDEKKworCSNpZm5kZWYgY29uZmlnVElNRVJfVEFTS19QUklPUklUWQorCQkjZXJyb3IgSWYgY29uZmlnVVNFX1RJTUVSUyBpcyBzZXQgdG8gMSB0aGVuIGNvbmZpZ1RJTUVSX1RBU0tfUFJJT1JJVFkgbXVzdCBhbHNvIGJlIGRlZmluZWQuCisJI2VuZGlmIC8qIGNvbmZpZ1RJTUVSX1RBU0tfUFJJT1JJVFkgKi8KKworCSNpZm5kZWYgY29uZmlnVElNRVJfUVVFVUVfTEVOR1RICisJCSNlcnJvciBJZiBjb25maWdVU0VfVElNRVJTIGlzIHNldCB0byAxIHRoZW4gY29uZmlnVElNRVJfUVVFVUVfTEVOR1RIIG11c3QgYWxzbyBiZSBkZWZpbmVkLgorCSNlbmRpZiAvKiBjb25maWdUSU1FUl9RVUVVRV9MRU5HVEggKi8KKworCSNpZm5kZWYgY29uZmlnVElNRVJfVEFTS19TVEFDS19ERVBUSAorCQkjZXJyb3IgSWYgY29uZmlnVVNFX1RJTUVSUyBpcyBzZXQgdG8gMSB0aGVuIGNvbmZpZ1RJTUVSX1RBU0tfU1RBQ0tfREVQVEggbXVzdCBhbHNvIGJlIGRlZmluZWQuCisJI2VuZGlmIC8qIGNvbmZpZ1RJTUVSX1RBU0tfU1RBQ0tfREVQVEggKi8KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USU1FUlMgKi8KKworI2lmbmRlZiBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSCisJI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkgMAorI2VuZGlmCisKKyNpZm5kZWYgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSCisJI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHV4U2F2ZWRTdGF0dXNWYWx1ZSApICggdm9pZCApIHV4U2F2ZWRTdGF0dXNWYWx1ZQorI2VuZGlmCisKKyNpZm5kZWYgcG9ydENMRUFOX1VQX1RDQgorCSNkZWZpbmUgcG9ydENMRUFOX1VQX1RDQiggcHhUQ0IgKSAoIHZvaWQgKSBweFRDQgorI2VuZGlmCisKKyNpZm5kZWYgcG9ydFBSRV9UQVNLX0RFTEVURV9IT09LCisJI2RlZmluZSBwb3J0UFJFX1RBU0tfREVMRVRFX0hPT0soIHB2VGFza1RvRGVsZXRlLCBweFlpZWxkUGVuZGluZyApCisjZW5kaWYKKworI2lmbmRlZiBwb3J0U0VUVVBfVENCCisJI2RlZmluZSBwb3J0U0VUVVBfVENCKCBweFRDQiApICggdm9pZCApIHB4VENCCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFCisJI2RlZmluZSBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFIDBVCisjZW5kaWYKKworI2lmICggY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA8IDEgKQorCSNkZWZpbmUgdlF1ZXVlQWRkVG9SZWdpc3RyeSggeFF1ZXVlLCBwY05hbWUgKQorCSNkZWZpbmUgdlF1ZXVlVW5yZWdpc3RlclF1ZXVlKCB4UXVldWUgKQorCSNkZWZpbmUgcGNRdWV1ZUdldE5hbWUoIHhRdWV1ZSApCisjZW5kaWYKKworI2lmbmRlZiBwb3J0UE9JTlRFUl9TSVpFX1RZUEUKKwkjZGVmaW5lIHBvcnRQT0lOVEVSX1NJWkVfVFlQRSB1aW50MzJfdAorI2VuZGlmCisKKy8qIFJlbW92ZSBhbnkgdW51c2VkIHRyYWNlIG1hY3Jvcy4gKi8KKyNpZm5kZWYgdHJhY2VTVEFSVAorCS8qIFVzZWQgdG8gcGVyZm9ybSBhbnkgbmVjZXNzYXJ5IGluaXRpYWxpc2F0aW9uIC0gZm9yIGV4YW1wbGUsIG9wZW4gYSBmaWxlCisJaW50byB3aGljaCB0cmFjZSBpcyB0byBiZSB3cml0dGVuLiAqLworCSNkZWZpbmUgdHJhY2VTVEFSVCgpCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZUVORAorCS8qIFVzZSB0byBjbG9zZSBhIHRyYWNlLCBmb3IgZXhhbXBsZSBjbG9zZSBhIGZpbGUgaW50byB3aGljaCB0cmFjZSBoYXMgYmVlbgorCXdyaXR0ZW4uICovCisJI2RlZmluZSB0cmFjZUVORCgpCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVRBU0tfU1dJVENIRURfSU4KKwkvKiBDYWxsZWQgYWZ0ZXIgYSB0YXNrIGhhcyBiZWVuIHNlbGVjdGVkIHRvIHJ1bi4gIHB4Q3VycmVudFRDQiBob2xkcyBhIHBvaW50ZXIKKwl0byB0aGUgdGFzayBjb250cm9sIGJsb2NrIG9mIHRoZSBzZWxlY3RlZCB0YXNrLiAqLworCSNkZWZpbmUgdHJhY2VUQVNLX1NXSVRDSEVEX0lOKCkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlSU5DUkVBU0VfVElDS19DT1VOVAorCS8qIENhbGxlZCBiZWZvcmUgc3RlcHBpbmcgdGhlIHRpY2sgY291bnQgYWZ0ZXIgd2FraW5nIGZyb20gdGlja2xlc3MgaWRsZQorCXNsZWVwLiAqLworCSNkZWZpbmUgdHJhY2VJTkNSRUFTRV9USUNLX0NPVU5UKCB4ICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlTE9XX1BPV0VSX0lETEVfQkVHSU4KKwkvKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGVudGVyaW5nIHRpY2tsZXNzIGlkbGUuICovCisJI2RlZmluZSB0cmFjZUxPV19QT1dFUl9JRExFX0JFR0lOKCkKKyNlbmRpZgorCisjaWZuZGVmCXRyYWNlTE9XX1BPV0VSX0lETEVfRU5ECisJLyogQ2FsbGVkIHdoZW4gcmV0dXJuaW5nIHRvIHRoZSBJZGxlIHRhc2sgYWZ0ZXIgYSB0aWNrbGVzcyBpZGxlLiAqLworCSNkZWZpbmUgdHJhY2VMT1dfUE9XRVJfSURMRV9FTkQoKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX1NXSVRDSEVEX09VVAorCS8qIENhbGxlZCBiZWZvcmUgYSB0YXNrIGhhcyBiZWVuIHNlbGVjdGVkIHRvIHJ1bi4gIHB4Q3VycmVudFRDQiBob2xkcyBhIHBvaW50ZXIKKwl0byB0aGUgdGFzayBjb250cm9sIGJsb2NrIG9mIHRoZSB0YXNrIGJlaW5nIHN3aXRjaGVkIG91dC4gKi8KKwkjZGVmaW5lIHRyYWNlVEFTS19TV0lUQ0hFRF9PVVQoKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX1BSSU9SSVRZX0lOSEVSSVQKKwkvKiBDYWxsZWQgd2hlbiBhIHRhc2sgYXR0ZW1wdHMgdG8gdGFrZSBhIG11dGV4IHRoYXQgaXMgYWxyZWFkeSBoZWxkIGJ5IGEKKwlsb3dlciBwcmlvcml0eSB0YXNrLiAgcHhUQ0JPZk11dGV4SG9sZGVyIGlzIGEgcG9pbnRlciB0byB0aGUgVENCIG9mIHRoZSB0YXNrCisJdGhhdCBob2xkcyB0aGUgbXV0ZXguICB1eEluaGVyaXRlZFByaW9yaXR5IGlzIHRoZSBwcmlvcml0eSB0aGUgbXV0ZXggaG9sZGVyCisJd2lsbCBpbmhlcml0ICh0aGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sgdGhhdCBpcyBhdHRlbXB0aW5nIHRvIG9idGFpbiB0aGUKKwltdXRlZC4gKi8KKwkjZGVmaW5lIHRyYWNlVEFTS19QUklPUklUWV9JTkhFUklUKCBweFRDQk9mTXV0ZXhIb2xkZXIsIHV4SW5oZXJpdGVkUHJpb3JpdHkgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX1BSSU9SSVRZX0RJU0lOSEVSSVQKKwkvKiBDYWxsZWQgd2hlbiBhIHRhc2sgcmVsZWFzZXMgYSBtdXRleCwgdGhlIGhvbGRpbmcgb2Ygd2hpY2ggaGFkIHJlc3VsdGVkIGluCisJdGhlIHRhc2sgaW5oZXJpdGluZyB0aGUgcHJpb3JpdHkgb2YgYSBoaWdoZXIgcHJpb3JpdHkgdGFzay4KKwlweFRDQk9mTXV0ZXhIb2xkZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBUQ0Igb2YgdGhlIHRhc2sgdGhhdCBpcyByZWxlYXNpbmcgdGhlCisJbXV0ZXguICB1eE9yaWdpbmFsUHJpb3JpdHkgaXMgdGhlIHRhc2sncyBjb25maWd1cmVkIChiYXNlKSBwcmlvcml0eS4gKi8KKwkjZGVmaW5lIHRyYWNlVEFTS19QUklPUklUWV9ESVNJTkhFUklUKCBweFRDQk9mTXV0ZXhIb2xkZXIsIHV4T3JpZ2luYWxQcmlvcml0eSApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZUJMT0NLSU5HX09OX1FVRVVFX1JFQ0VJVkUKKwkvKiBUYXNrIGlzIGFib3V0IHRvIGJsb2NrIGJlY2F1c2UgaXQgY2Fubm90IHJlYWQgZnJvbSBhCisJcXVldWUvbXV0ZXgvc2VtYXBob3JlLiAgcHhRdWV1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIHF1ZXVlL211dGV4L3NlbWFwaG9yZQorCXVwb24gd2hpY2ggdGhlIHJlYWQgd2FzIGF0dGVtcHRlZC4gIHB4Q3VycmVudFRDQiBwb2ludHMgdG8gdGhlIFRDQiBvZiB0aGUKKwl0YXNrIHRoYXQgYXR0ZW1wdGVkIHRoZSByZWFkLiAqLworCSNkZWZpbmUgdHJhY2VCTE9DS0lOR19PTl9RVUVVRV9SRUNFSVZFKCBweFF1ZXVlICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlQkxPQ0tJTkdfT05fUVVFVUVfUEVFSworCS8qIFRhc2sgaXMgYWJvdXQgdG8gYmxvY2sgYmVjYXVzZSBpdCBjYW5ub3QgcmVhZCBmcm9tIGEKKwlxdWV1ZS9tdXRleC9zZW1hcGhvcmUuICBweFF1ZXVlIGlzIGEgcG9pbnRlciB0byB0aGUgcXVldWUvbXV0ZXgvc2VtYXBob3JlCisJdXBvbiB3aGljaCB0aGUgcmVhZCB3YXMgYXR0ZW1wdGVkLiAgcHhDdXJyZW50VENCIHBvaW50cyB0byB0aGUgVENCIG9mIHRoZQorCXRhc2sgdGhhdCBhdHRlbXB0ZWQgdGhlIHJlYWQuICovCisJI2RlZmluZSB0cmFjZUJMT0NLSU5HX09OX1FVRVVFX1BFRUsoIHB4UXVldWUgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VCTE9DS0lOR19PTl9RVUVVRV9TRU5ECisJLyogVGFzayBpcyBhYm91dCB0byBibG9jayBiZWNhdXNlIGl0IGNhbm5vdCB3cml0ZSB0byBhCisJcXVldWUvbXV0ZXgvc2VtYXBob3JlLiAgcHhRdWV1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIHF1ZXVlL211dGV4L3NlbWFwaG9yZQorCXVwb24gd2hpY2ggdGhlIHdyaXRlIHdhcyBhdHRlbXB0ZWQuICBweEN1cnJlbnRUQ0IgcG9pbnRzIHRvIHRoZSBUQ0Igb2YgdGhlCisJdGFzayB0aGF0IGF0dGVtcHRlZCB0aGUgd3JpdGUuICovCisJI2RlZmluZSB0cmFjZUJMT0NLSU5HX09OX1FVRVVFX1NFTkQoIHB4UXVldWUgKQorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XCisJI2RlZmluZSBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgMAorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnUkVDT1JEX1NUQUNLX0hJR0hfQUREUkVTUworCSNkZWZpbmUgY29uZmlnUkVDT1JEX1NUQUNLX0hJR0hfQUREUkVTUyAwCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdJTkNMVURFX0ZSRUVSVE9TX1RBU0tfQ19BRERJVElPTlNfSAorCSNkZWZpbmUgY29uZmlnSU5DTFVERV9GUkVFUlRPU19UQVNLX0NfQURESVRJT05TX0ggMAorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZXZlbnQgbWFjcm9zIGFyZSBlbWJlZGRlZCBpbiB0aGUga2VybmVsIEFQSSBjYWxscy4gKi8KKworI2lmbmRlZiB0cmFjZU1PVkVEX1RBU0tfVE9fUkVBRFlfU1RBVEUKKwkjZGVmaW5lIHRyYWNlTU9WRURfVEFTS19UT19SRUFEWV9TVEFURSggcHhUQ0IgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VQT1NUX01PVkVEX1RBU0tfVE9fUkVBRFlfU1RBVEUKKwkjZGVmaW5lIHRyYWNlUE9TVF9NT1ZFRF9UQVNLX1RPX1JFQURZX1NUQVRFKCBweFRDQiApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVFVRVVFX0NSRUFURQorCSNkZWZpbmUgdHJhY2VRVUVVRV9DUkVBVEUoIHB4TmV3UXVldWUgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VRVUVVRV9DUkVBVEVfRkFJTEVECisJI2RlZmluZSB0cmFjZVFVRVVFX0NSRUFURV9GQUlMRUQoIHVjUXVldWVUeXBlICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlQ1JFQVRFX01VVEVYCisJI2RlZmluZSB0cmFjZUNSRUFURV9NVVRFWCggcHhOZXdRdWV1ZSApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZUNSRUFURV9NVVRFWF9GQUlMRUQKKwkjZGVmaW5lIHRyYWNlQ1JFQVRFX01VVEVYX0ZBSUxFRCgpCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZUdJVkVfTVVURVhfUkVDVVJTSVZFCisJI2RlZmluZSB0cmFjZUdJVkVfTVVURVhfUkVDVVJTSVZFKCBweE11dGV4ICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlR0lWRV9NVVRFWF9SRUNVUlNJVkVfRkFJTEVECisJI2RlZmluZSB0cmFjZUdJVkVfTVVURVhfUkVDVVJTSVZFX0ZBSUxFRCggcHhNdXRleCApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVRBS0VfTVVURVhfUkVDVVJTSVZFCisJI2RlZmluZSB0cmFjZVRBS0VfTVVURVhfUkVDVVJTSVZFKCBweE11dGV4ICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlVEFLRV9NVVRFWF9SRUNVUlNJVkVfRkFJTEVECisJI2RlZmluZSB0cmFjZVRBS0VfTVVURVhfUkVDVVJTSVZFX0ZBSUxFRCggcHhNdXRleCApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZUNSRUFURV9DT1VOVElOR19TRU1BUEhPUkUKKwkjZGVmaW5lIHRyYWNlQ1JFQVRFX0NPVU5USU5HX1NFTUFQSE9SRSgpCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZUNSRUFURV9DT1VOVElOR19TRU1BUEhPUkVfRkFJTEVECisJI2RlZmluZSB0cmFjZUNSRUFURV9DT1VOVElOR19TRU1BUEhPUkVfRkFJTEVEKCkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlUVVFVUVfU0VORAorCSNkZWZpbmUgdHJhY2VRVUVVRV9TRU5EKCBweFF1ZXVlICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlUVVFVUVfU0VORF9GQUlMRUQKKwkjZGVmaW5lIHRyYWNlUVVFVUVfU0VORF9GQUlMRUQoIHB4UXVldWUgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VRVUVVRV9SRUNFSVZFCisJI2RlZmluZSB0cmFjZVFVRVVFX1JFQ0VJVkUoIHB4UXVldWUgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VRVUVVRV9QRUVLCisJI2RlZmluZSB0cmFjZVFVRVVFX1BFRUsoIHB4UXVldWUgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VRVUVVRV9QRUVLX0ZBSUxFRAorCSNkZWZpbmUgdHJhY2VRVUVVRV9QRUVLX0ZBSUxFRCggcHhRdWV1ZSApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVFVRVVFX1BFRUtfRlJPTV9JU1IKKwkjZGVmaW5lIHRyYWNlUVVFVUVfUEVFS19GUk9NX0lTUiggcHhRdWV1ZSApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVFVRVVFX1JFQ0VJVkVfRkFJTEVECisJI2RlZmluZSB0cmFjZVFVRVVFX1JFQ0VJVkVfRkFJTEVEKCBweFF1ZXVlICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlUVVFVUVfU0VORF9GUk9NX0lTUgorCSNkZWZpbmUgdHJhY2VRVUVVRV9TRU5EX0ZST01fSVNSKCBweFF1ZXVlICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlUVVFVUVfU0VORF9GUk9NX0lTUl9GQUlMRUQKKwkjZGVmaW5lIHRyYWNlUVVFVUVfU0VORF9GUk9NX0lTUl9GQUlMRUQoIHB4UXVldWUgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VRVUVVRV9SRUNFSVZFX0ZST01fSVNSCisJI2RlZmluZSB0cmFjZVFVRVVFX1JFQ0VJVkVfRlJPTV9JU1IoIHB4UXVldWUgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VRVUVVRV9SRUNFSVZFX0ZST01fSVNSX0ZBSUxFRAorCSNkZWZpbmUgdHJhY2VRVUVVRV9SRUNFSVZFX0ZST01fSVNSX0ZBSUxFRCggcHhRdWV1ZSApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVFVRVVFX1BFRUtfRlJPTV9JU1JfRkFJTEVECisJI2RlZmluZSB0cmFjZVFVRVVFX1BFRUtfRlJPTV9JU1JfRkFJTEVEKCBweFF1ZXVlICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlUVVFVUVfREVMRVRFCisJI2RlZmluZSB0cmFjZVFVRVVFX0RFTEVURSggcHhRdWV1ZSApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVRBU0tfQ1JFQVRFCisJI2RlZmluZSB0cmFjZVRBU0tfQ1JFQVRFKCBweE5ld1RDQiApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVRBU0tfQ1JFQVRFX0ZBSUxFRAorCSNkZWZpbmUgdHJhY2VUQVNLX0NSRUFURV9GQUlMRUQoKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX0RFTEVURQorCSNkZWZpbmUgdHJhY2VUQVNLX0RFTEVURSggcHhUYXNrVG9EZWxldGUgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX0RFTEFZX1VOVElMCisJI2RlZmluZSB0cmFjZVRBU0tfREVMQVlfVU5USUwoIHggKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX0RFTEFZCisJI2RlZmluZSB0cmFjZVRBU0tfREVMQVkoKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX1BSSU9SSVRZX1NFVAorCSNkZWZpbmUgdHJhY2VUQVNLX1BSSU9SSVRZX1NFVCggcHhUYXNrLCB1eE5ld1ByaW9yaXR5ICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlVEFTS19TVVNQRU5ECisJI2RlZmluZSB0cmFjZVRBU0tfU1VTUEVORCggcHhUYXNrVG9TdXNwZW5kICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlVEFTS19SRVNVTUUKKwkjZGVmaW5lIHRyYWNlVEFTS19SRVNVTUUoIHB4VGFza1RvUmVzdW1lICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlVEFTS19SRVNVTUVfRlJPTV9JU1IKKwkjZGVmaW5lIHRyYWNlVEFTS19SRVNVTUVfRlJPTV9JU1IoIHB4VGFza1RvUmVzdW1lICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlVEFTS19JTkNSRU1FTlRfVElDSworCSNkZWZpbmUgdHJhY2VUQVNLX0lOQ1JFTUVOVF9USUNLKCB4VGlja0NvdW50ICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlVElNRVJfQ1JFQVRFCisJI2RlZmluZSB0cmFjZVRJTUVSX0NSRUFURSggcHhOZXdUaW1lciApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVRJTUVSX0NSRUFURV9GQUlMRUQKKwkjZGVmaW5lIHRyYWNlVElNRVJfQ1JFQVRFX0ZBSUxFRCgpCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVRJTUVSX0NPTU1BTkRfU0VORAorCSNkZWZpbmUgdHJhY2VUSU1FUl9DT01NQU5EX1NFTkQoIHhUaW1lciwgeE1lc3NhZ2VJRCwgeE1lc3NhZ2VWYWx1ZVZhbHVlLCB4UmV0dXJuICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlVElNRVJfRVhQSVJFRAorCSNkZWZpbmUgdHJhY2VUSU1FUl9FWFBJUkVEKCBweFRpbWVyICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlVElNRVJfQ09NTUFORF9SRUNFSVZFRAorCSNkZWZpbmUgdHJhY2VUSU1FUl9DT01NQU5EX1JFQ0VJVkVEKCBweFRpbWVyLCB4TWVzc2FnZUlELCB4TWVzc2FnZVZhbHVlICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlTUFMTE9DCisgICAgI2RlZmluZSB0cmFjZU1BTExPQyggcHZBZGRyZXNzLCB1aVNpemUgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VGUkVFCisgICAgI2RlZmluZSB0cmFjZUZSRUUoIHB2QWRkcmVzcywgdWlTaXplICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlRVZFTlRfR1JPVVBfQ1JFQVRFCisJI2RlZmluZSB0cmFjZUVWRU5UX0dST1VQX0NSRUFURSggeEV2ZW50R3JvdXAgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VFVkVOVF9HUk9VUF9DUkVBVEVfRkFJTEVECisJI2RlZmluZSB0cmFjZUVWRU5UX0dST1VQX0NSRUFURV9GQUlMRUQoKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VFVkVOVF9HUk9VUF9TWU5DX0JMT0NLCisJI2RlZmluZSB0cmFjZUVWRU5UX0dST1VQX1NZTkNfQkxPQ0soIHhFdmVudEdyb3VwLCB1eEJpdHNUb1NldCwgdXhCaXRzVG9XYWl0Rm9yICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlRVZFTlRfR1JPVVBfU1lOQ19FTkQKKwkjZGVmaW5lIHRyYWNlRVZFTlRfR1JPVVBfU1lOQ19FTkQoIHhFdmVudEdyb3VwLCB1eEJpdHNUb1NldCwgdXhCaXRzVG9XYWl0Rm9yLCB4VGltZW91dE9jY3VycmVkICkgKCB2b2lkICkgeFRpbWVvdXRPY2N1cnJlZAorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VFVkVOVF9HUk9VUF9XQUlUX0JJVFNfQkxPQ0sKKwkjZGVmaW5lIHRyYWNlRVZFTlRfR1JPVVBfV0FJVF9CSVRTX0JMT0NLKCB4RXZlbnRHcm91cCwgdXhCaXRzVG9XYWl0Rm9yICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlRVZFTlRfR1JPVVBfV0FJVF9CSVRTX0VORAorCSNkZWZpbmUgdHJhY2VFVkVOVF9HUk9VUF9XQUlUX0JJVFNfRU5EKCB4RXZlbnRHcm91cCwgdXhCaXRzVG9XYWl0Rm9yLCB4VGltZW91dE9jY3VycmVkICkgKCB2b2lkICkgeFRpbWVvdXRPY2N1cnJlZAorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VFVkVOVF9HUk9VUF9DTEVBUl9CSVRTCisJI2RlZmluZSB0cmFjZUVWRU5UX0dST1VQX0NMRUFSX0JJVFMoIHhFdmVudEdyb3VwLCB1eEJpdHNUb0NsZWFyICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlRVZFTlRfR1JPVVBfQ0xFQVJfQklUU19GUk9NX0lTUgorCSNkZWZpbmUgdHJhY2VFVkVOVF9HUk9VUF9DTEVBUl9CSVRTX0ZST01fSVNSKCB4RXZlbnRHcm91cCwgdXhCaXRzVG9DbGVhciApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZUVWRU5UX0dST1VQX1NFVF9CSVRTCisJI2RlZmluZSB0cmFjZUVWRU5UX0dST1VQX1NFVF9CSVRTKCB4RXZlbnRHcm91cCwgdXhCaXRzVG9TZXQgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VFVkVOVF9HUk9VUF9TRVRfQklUU19GUk9NX0lTUgorCSNkZWZpbmUgdHJhY2VFVkVOVF9HUk9VUF9TRVRfQklUU19GUk9NX0lTUiggeEV2ZW50R3JvdXAsIHV4Qml0c1RvU2V0ICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlRVZFTlRfR1JPVVBfREVMRVRFCisJI2RlZmluZSB0cmFjZUVWRU5UX0dST1VQX0RFTEVURSggeEV2ZW50R3JvdXAgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VQRU5EX0ZVTkNfQ0FMTAorCSNkZWZpbmUgdHJhY2VQRU5EX0ZVTkNfQ0FMTCh4RnVuY3Rpb25Ub1BlbmQsIHB2UGFyYW1ldGVyMSwgdWxQYXJhbWV0ZXIyLCByZXQpCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVBFTkRfRlVOQ19DQUxMX0ZST01fSVNSCisJI2RlZmluZSB0cmFjZVBFTkRfRlVOQ19DQUxMX0ZST01fSVNSKHhGdW5jdGlvblRvUGVuZCwgcHZQYXJhbWV0ZXIxLCB1bFBhcmFtZXRlcjIsIHJldCkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlUVVFVUVfUkVHSVNUUllfQURECisJI2RlZmluZSB0cmFjZVFVRVVFX1JFR0lTVFJZX0FERCh4UXVldWUsIHBjUXVldWVOYW1lKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX05PVElGWV9UQUtFX0JMT0NLCisJI2RlZmluZSB0cmFjZVRBU0tfTk9USUZZX1RBS0VfQkxPQ0soKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX05PVElGWV9UQUtFCisJI2RlZmluZSB0cmFjZVRBU0tfTk9USUZZX1RBS0UoKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX05PVElGWV9XQUlUX0JMT0NLCisJI2RlZmluZSB0cmFjZVRBU0tfTk9USUZZX1dBSVRfQkxPQ0soKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX05PVElGWV9XQUlUCisJI2RlZmluZSB0cmFjZVRBU0tfTk9USUZZX1dBSVQoKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VUQVNLX05PVElGWQorCSNkZWZpbmUgdHJhY2VUQVNLX05PVElGWSgpCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVRBU0tfTk9USUZZX0ZST01fSVNSCisJI2RlZmluZSB0cmFjZVRBU0tfTk9USUZZX0ZST01fSVNSKCkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlVEFTS19OT1RJRllfR0lWRV9GUk9NX0lTUgorCSNkZWZpbmUgdHJhY2VUQVNLX05PVElGWV9HSVZFX0ZST01fSVNSKCkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlU1RSRUFNX0JVRkZFUl9DUkVBVEVfRkFJTEVECisJI2RlZmluZSB0cmFjZVNUUkVBTV9CVUZGRVJfQ1JFQVRFX0ZBSUxFRCggeElzTWVzc2FnZUJ1ZmZlciApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVNUUkVBTV9CVUZGRVJfQ1JFQVRFX1NUQVRJQ19GQUlMRUQKKwkjZGVmaW5lIHRyYWNlU1RSRUFNX0JVRkZFUl9DUkVBVEVfU1RBVElDX0ZBSUxFRCggeFJldHVybiwgeElzTWVzc2FnZUJ1ZmZlciApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVNUUkVBTV9CVUZGRVJfQ1JFQVRFCisJI2RlZmluZSB0cmFjZVNUUkVBTV9CVUZGRVJfQ1JFQVRFKCBweFN0cmVhbUJ1ZmZlciwgeElzTWVzc2FnZUJ1ZmZlciApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVNUUkVBTV9CVUZGRVJfREVMRVRFCisJI2RlZmluZSB0cmFjZVNUUkVBTV9CVUZGRVJfREVMRVRFKCB4U3RyZWFtQnVmZmVyICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlU1RSRUFNX0JVRkZFUl9SRVNFVAorCSNkZWZpbmUgdHJhY2VTVFJFQU1fQlVGRkVSX1JFU0VUKCB4U3RyZWFtQnVmZmVyICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlQkxPQ0tJTkdfT05fU1RSRUFNX0JVRkZFUl9TRU5ECisJI2RlZmluZSB0cmFjZUJMT0NLSU5HX09OX1NUUkVBTV9CVUZGRVJfU0VORCggeFN0cmVhbUJ1ZmZlciApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVNUUkVBTV9CVUZGRVJfU0VORAorCSNkZWZpbmUgdHJhY2VTVFJFQU1fQlVGRkVSX1NFTkQoIHhTdHJlYW1CdWZmZXIsIHhCeXRlc1NlbnQgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VTVFJFQU1fQlVGRkVSX1NFTkRfRkFJTEVECisJI2RlZmluZSB0cmFjZVNUUkVBTV9CVUZGRVJfU0VORF9GQUlMRUQoIHhTdHJlYW1CdWZmZXIgKQorI2VuZGlmCisKKyNpZm5kZWYgdHJhY2VTVFJFQU1fQlVGRkVSX1NFTkRfRlJPTV9JU1IKKwkjZGVmaW5lIHRyYWNlU1RSRUFNX0JVRkZFUl9TRU5EX0ZST01fSVNSKCB4U3RyZWFtQnVmZmVyLCB4Qnl0ZXNTZW50ICkKKyNlbmRpZgorCisjaWZuZGVmIHRyYWNlQkxPQ0tJTkdfT05fU1RSRUFNX0JVRkZFUl9SRUNFSVZFCisJI2RlZmluZSB0cmFjZUJMT0NLSU5HX09OX1NUUkVBTV9CVUZGRVJfUkVDRUlWRSggeFN0cmVhbUJ1ZmZlciApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVNUUkVBTV9CVUZGRVJfUkVDRUlWRQorCSNkZWZpbmUgdHJhY2VTVFJFQU1fQlVGRkVSX1JFQ0VJVkUoIHhTdHJlYW1CdWZmZXIsIHhSZWNlaXZlZExlbmd0aCApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVNUUkVBTV9CVUZGRVJfUkVDRUlWRV9GQUlMRUQKKwkjZGVmaW5lIHRyYWNlU1RSRUFNX0JVRkZFUl9SRUNFSVZFX0ZBSUxFRCggeFN0cmVhbUJ1ZmZlciApCisjZW5kaWYKKworI2lmbmRlZiB0cmFjZVNUUkVBTV9CVUZGRVJfUkVDRUlWRV9GUk9NX0lTUgorCSNkZWZpbmUgdHJhY2VTVFJFQU1fQlVGRkVSX1JFQ0VJVkVfRlJPTV9JU1IoIHhTdHJlYW1CdWZmZXIsIHhSZWNlaXZlZExlbmd0aCApCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdHRU5FUkFURV9SVU5fVElNRV9TVEFUUworCSNkZWZpbmUgY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgMAorI2VuZGlmCisKKyNpZiAoIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTID09IDEgKQorCisJI2lmbmRlZiBwb3J0Q09ORklHVVJFX1RJTUVSX0ZPUl9SVU5fVElNRV9TVEFUUworCQkjZXJyb3IgSWYgY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgaXMgZGVmaW5lZCB0aGVuIHBvcnRDT05GSUdVUkVfVElNRVJfRk9SX1JVTl9USU1FX1NUQVRTIG11c3QgYWxzbyBiZSBkZWZpbmVkLiAgcG9ydENPTkZJR1VSRV9USU1FUl9GT1JfUlVOX1RJTUVfU1RBVFMgc2hvdWxkIGNhbGwgYSBwb3J0IGxheWVyIGZ1bmN0aW9uIHRvIHNldHVwIGEgcGVyaXBoZXJhbCB0aW1lci9jb3VudGVyIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCBhcyB0aGUgcnVuIHRpbWUgY291bnRlciB0aW1lIGJhc2UuCisJI2VuZGlmIC8qIHBvcnRDT05GSUdVUkVfVElNRVJfRk9SX1JVTl9USU1FX1NUQVRTICovCisKKwkjaWZuZGVmIHBvcnRHRVRfUlVOX1RJTUVfQ09VTlRFUl9WQUxVRQorCQkjaWZuZGVmIHBvcnRBTFRfR0VUX1JVTl9USU1FX0NPVU5URVJfVkFMVUUKKwkJCSNlcnJvciBJZiBjb25maWdHRU5FUkFURV9SVU5fVElNRV9TVEFUUyBpcyBkZWZpbmVkIHRoZW4gZWl0aGVyIHBvcnRHRVRfUlVOX1RJTUVfQ09VTlRFUl9WQUxVRSBvciBwb3J0QUxUX0dFVF9SVU5fVElNRV9DT1VOVEVSX1ZBTFVFIG11c3QgYWxzbyBiZSBkZWZpbmVkLiAgU2VlIHRoZSBleGFtcGxlcyBwcm92aWRlZCBhbmQgdGhlIEZyZWVSVE9TIHdlYiBzaXRlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCQkjZW5kaWYgLyogcG9ydEFMVF9HRVRfUlVOX1RJTUVfQ09VTlRFUl9WQUxVRSAqLworCSNlbmRpZiAvKiBwb3J0R0VUX1JVTl9USU1FX0NPVU5URVJfVkFMVUUgKi8KKworI2VuZGlmIC8qIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTICovCisKKyNpZm5kZWYgcG9ydENPTkZJR1VSRV9USU1FUl9GT1JfUlVOX1RJTUVfU1RBVFMKKwkjZGVmaW5lIHBvcnRDT05GSUdVUkVfVElNRVJfRk9SX1JVTl9USU1FX1NUQVRTKCkKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1VTRV9NQUxMT0NfRkFJTEVEX0hPT0sKKwkjZGVmaW5lIGNvbmZpZ1VTRV9NQUxMT0NfRkFJTEVEX0hPT0sgMAorI2VuZGlmCisKKyNpZm5kZWYgcG9ydFBSSVZJTEVHRV9CSVQKKwkjZGVmaW5lIHBvcnRQUklWSUxFR0VfQklUICggKCBVQmFzZVR5cGVfdCApIDB4MDAgKQorI2VuZGlmCisKKyNpZm5kZWYgcG9ydFlJRUxEX1dJVEhJTl9BUEkKKwkjZGVmaW5lIHBvcnRZSUVMRF9XSVRISU5fQVBJIHBvcnRZSUVMRAorI2VuZGlmCisKKyNpZm5kZWYgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUAorCSNkZWZpbmUgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCggeEV4cGVjdGVkSWRsZVRpbWUgKQorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnRVhQRUNURURfSURMRV9USU1FX0JFRk9SRV9TTEVFUAorCSNkZWZpbmUgY29uZmlnRVhQRUNURURfSURMRV9USU1FX0JFRk9SRV9TTEVFUCAyCisjZW5kaWYKKworI2lmIGNvbmZpZ0VYUEVDVEVEX0lETEVfVElNRV9CRUZPUkVfU0xFRVAgPCAyCisJI2Vycm9yIGNvbmZpZ0VYUEVDVEVEX0lETEVfVElNRV9CRUZPUkVfU0xFRVAgbXVzdCBub3QgYmUgbGVzcyB0aGFuIDIKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFCisJI2RlZmluZSBjb25maWdVU0VfVElDS0xFU1NfSURMRSAwCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdQUkVfU1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQX1BST0NFU1NJTkcKKwkjZGVmaW5lIGNvbmZpZ1BSRV9TVVBQUkVTU19USUNLU19BTkRfU0xFRVBfUFJPQ0VTU0lORyggeCApCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORworCSNkZWZpbmUgY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoIHggKQorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HCisJI2RlZmluZSBjb25maWdQT1NUX1NMRUVQX1BST0NFU1NJTkcoIHggKQorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnVVNFX1FVRVVFX1NFVFMKKwkjZGVmaW5lIGNvbmZpZ1VTRV9RVUVVRV9TRVRTIDAKKyNlbmRpZgorCisjaWZuZGVmIHBvcnRUQVNLX1VTRVNfRkxPQVRJTkdfUE9JTlQKKwkjZGVmaW5lIHBvcnRUQVNLX1VTRVNfRkxPQVRJTkdfUE9JTlQoKQorI2VuZGlmCisKKyNpZm5kZWYgcG9ydFRBU0tfQ0FMTFNfU0VDVVJFX0ZVTkNUSU9OUworCSNkZWZpbmUgcG9ydFRBU0tfQ0FMTFNfU0VDVVJFX0ZVTkNUSU9OUygpCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdVU0VfVElNRV9TTElDSU5HCisJI2RlZmluZSBjb25maWdVU0VfVElNRV9TTElDSU5HIDEKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ0lOQ0xVREVfQVBQTElDQVRJT05fREVGSU5FRF9QUklWSUxFR0VEX0ZVTkNUSU9OUworCSNkZWZpbmUgY29uZmlnSU5DTFVERV9BUFBMSUNBVElPTl9ERUZJTkVEX1BSSVZJTEVHRURfRlVOQ1RJT05TIDAKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUworCSNkZWZpbmUgY29uZmlnVVNFX1NUQVRTX0ZPUk1BVFRJTkdfRlVOQ1RJT05TIDAKKyNlbmRpZgorCisjaWZuZGVmIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQKKwkjZGVmaW5lIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKQorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZCisJI2RlZmluZSBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgMAorI2VuZGlmCisKKyNpZm5kZWYgbXRDT1ZFUkFHRV9URVNUX01BUktFUgorCSNkZWZpbmUgbXRDT1ZFUkFHRV9URVNUX01BUktFUigpCisjZW5kaWYKKworI2lmbmRlZiBtdENPVkVSQUdFX1RFU1RfREVMQVkKKwkjZGVmaW5lIG10Q09WRVJBR0VfVEVTVF9ERUxBWSgpCisjZW5kaWYKKworI2lmbmRlZiBwb3J0QVNTRVJUX0lGX0lOX0lTUgorCSNkZWZpbmUgcG9ydEFTU0VSVF9JRl9JTl9JU1IoKQorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OCisJI2RlZmluZSBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gMAorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnQVBQTElDQVRJT05fQUxMT0NBVEVEX0hFQVAKKwkjZGVmaW5lIGNvbmZpZ0FQUExJQ0FUSU9OX0FMTE9DQVRFRF9IRUFQIDAKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMKKwkjZGVmaW5lIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgMQorI2VuZGlmCisKKyNpZm5kZWYgcG9ydFRJQ0tfVFlQRV9JU19BVE9NSUMKKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDAKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04KKwkvKiBEZWZhdWx0cyB0byAwIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAqLworCSNkZWZpbmUgY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAwCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTgorCS8qIERlZmF1bHRzIHRvIDEgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICovCisJI2RlZmluZSBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAxCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdTVEFDS19ERVBUSF9UWVBFCisJLyogRGVmYXVsdHMgdG8gdWludDE2X3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbgorCWluIEZyZWVSVE9TQ29uZmlnLmggaWYgdWludDE2X3QgaXMgdG9vIHJlc3RyaWN0aXZlLiAqLworCSNkZWZpbmUgY29uZmlnU1RBQ0tfREVQVEhfVFlQRSB1aW50MTZfdAorI2VuZGlmCisKKy8qIFNhbml0eSBjaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgIT0gMCApCisJI2lmKCBJTkNMVURFX3ZUYXNrU3VzcGVuZCAhPSAxICkKKwkJI2Vycm9yIElOQ0xVREVfdlRhc2tTdXNwZW5kIG11c3QgYmUgc2V0IHRvIDEgaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgaXMgbm90IHNldCB0byAwCisJI2VuZGlmIC8qIElOQ0xVREVfdlRhc2tTdXNwZW5kICovCisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworI2lmKCAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMCApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMCApICkKKwkjZXJyb3IgY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiBhbmQgY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gY2Fubm90IGJvdGggYmUgMCwgYnV0IGNhbiBib3RoIGJlIDEuCisjZW5kaWYKKworI2lmKCAoIGNvbmZpZ1VTRV9SRUNVUlNJVkVfTVVURVhFUyA9PSAxICkgJiYgKCBjb25maWdVU0VfTVVURVhFUyAhPSAxICkgKQorCSNlcnJvciBjb25maWdVU0VfTVVURVhFUyBtdXN0IGJlIHNldCB0byAxIHRvIHVzZSByZWN1cnNpdmUgbXV0ZXhlcworI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnSU5JVElBTF9USUNLX0NPVU5UCisJI2RlZmluZSBjb25maWdJTklUSUFMX1RJQ0tfQ09VTlQgMAorI2VuZGlmCisKKyNpZiggcG9ydFRJQ0tfVFlQRV9JU19BVE9NSUMgPT0gMCApCisJLyogRWl0aGVyIHZhcmlhYmxlcyBvZiB0aWNrIHR5cGUgY2Fubm90IGJlIHJlYWQgYXRvbWljYWxseSwgb3IKKwlwb3J0VElDS19UWVBFX0lTX0FUT01JQyB3YXMgbm90IHNldCAtIG1hcCB0aGUgY3JpdGljYWwgc2VjdGlvbnMgdXNlZCB3aGVuCisJdGhlIHRpY2sgY291bnQgaXMgcmV0dXJuZWQgdG8gdGhlIHN0YW5kYXJkIGNyaXRpY2FsIHNlY3Rpb24gbWFjcm9zLiAqLworCSNkZWZpbmUgcG9ydFRJQ0tfVFlQRV9FTlRFUl9DUklUSUNBTCgpIHBvcnRFTlRFUl9DUklUSUNBTCgpCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0VYSVRfQ1JJVElDQUwoKSBwb3J0RVhJVF9DUklUSUNBTCgpCisJI2RlZmluZSBwb3J0VElDS19UWVBFX1NFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQorCSNkZWZpbmUgcG9ydFRJQ0tfVFlQRV9DTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggeCApIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggKCB4ICkgKQorI2Vsc2UKKwkvKiBUaGUgdGljayB0eXBlIGNhbiBiZSByZWFkIGF0b21pY2FsbHksIHNvIGNyaXRpY2FsIHNlY3Rpb25zIHVzZWQgd2hlbiB0aGUKKwl0aWNrIGNvdW50IGlzIHJldHVybmVkIGNhbiBiZSBkZWZpbmVkIGF3YXkuICovCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0VOVEVSX0NSSVRJQ0FMKCkKKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfRVhJVF9DUklUSUNBTCgpCisJI2RlZmluZSBwb3J0VElDS19UWVBFX1NFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpIDAKKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfQ0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHggKSAoIHZvaWQgKSB4CisjZW5kaWYKKworLyogRGVmaW5pdGlvbnMgdG8gYWxsb3cgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIEZyZWVSVE9TIHZlcnNpb25zIHByaW9yIHRvCitWOCBpZiBkZXNpcmVkLiAqLworI2lmbmRlZiBjb25maWdFTkFCTEVfQkFDS1dBUkRfQ09NUEFUSUJJTElUWQorCSNkZWZpbmUgY29uZmlnRU5BQkxFX0JBQ0tXQVJEX0NPTVBBVElCSUxJVFkgMQorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnUFJJTlRGCisJLyogY29uZmlnUFJJTlRGKCkgd2FzIG5vdCBkZWZpbmVkLCBzbyBkZWZpbmUgaXQgYXdheSB0byBub3RoaW5nLiAgVG8gdXNlCisJY29uZmlnUFJJTlRGKCkgdGhlbiBkZWZpbmUgaXQgYXMgZm9sbG93cyAod2hlcmUgTXlQcmludEZ1bmN0aW9uKCkgaXMKKwlwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd3JpdGVyKToKKworCXZvaWQgTXlQcmludEZ1bmN0aW9uKGNvbnN0IGNoYXIgKnBjRm9ybWF0LCAuLi4gKTsKKwkjZGVmaW5lIGNvbmZpZ1BSSU5URiggWCApICAgTXlQcmludEZ1bmN0aW9uIFgKKworCVRoZW4gY2FsbCBsaWtlIGEgc3RhbmRhcmQgcHJpbnRmKCkgZnVuY3Rpb24sIGJ1dCBwbGFjaW5nIGJyYWNrZXRzIGFyb3VuZAorCWFsbCBwYXJhbWV0ZXJzIHNvIHRoZXkgYXJlIHBhc3NlZCBhcyBhIHNpbmdsZSBwYXJhbWV0ZXIuICBGb3IgZXhhbXBsZToKKwljb25maWdQUklOVEYoICgiVmFsdWUgPSAlZCIsIE15VmFyaWFibGUpICk7ICovCisJI2RlZmluZSBjb25maWdQUklOVEYoIFggKQorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnTUFYCisJLyogVGhlIGFwcGxpY2F0aW9uIHdyaXRlciBoYXMgbm90IHByb3ZpZGVkIHRoZWlyIG93biBNQVggbWFjcm8sIHNvIGRlZmluZQorCXRoZSBmb2xsb3dpbmcgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4gKi8KKwkjZGVmaW5lIGNvbmZpZ01BWCggYSwgYiApICggKCAoIGEgKSA+ICggYiApICkgPyAoIGEgKSA6ICggYiApICkKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ01JTgorCS8qIFRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgaGFzIG5vdCBwcm92aWRlZCB0aGVpciBvd24gTUFYIG1hY3JvLCBzbyBkZWZpbmUKKwl0aGUgZm9sbG93aW5nIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uICovCisJI2RlZmluZSBjb25maWdNSU4oIGEsIGIgKSAoICggKCBhICkgPCAoIGIgKSApID8gKCBhICkgOiAoIGIgKSApCisjZW5kaWYKKworI2lmIGNvbmZpZ0VOQUJMRV9CQUNLV0FSRF9DT01QQVRJQklMSVRZID09IDEKKwkjZGVmaW5lIGVUYXNrU3RhdGVHZXQgZVRhc2tHZXRTdGF0ZQorCSNkZWZpbmUgcG9ydFRpY2tUeXBlIFRpY2tUeXBlX3QKKwkjZGVmaW5lIHhUYXNrSGFuZGxlIFRhc2tIYW5kbGVfdAorCSNkZWZpbmUgeFF1ZXVlSGFuZGxlIFF1ZXVlSGFuZGxlX3QKKwkjZGVmaW5lIHhTZW1hcGhvcmVIYW5kbGUgU2VtYXBob3JlSGFuZGxlX3QKKwkjZGVmaW5lIHhRdWV1ZVNldEhhbmRsZSBRdWV1ZVNldEhhbmRsZV90CisJI2RlZmluZSB4UXVldWVTZXRNZW1iZXJIYW5kbGUgUXVldWVTZXRNZW1iZXJIYW5kbGVfdAorCSNkZWZpbmUgeFRpbWVPdXRUeXBlIFRpbWVPdXRfdAorCSNkZWZpbmUgeE1lbW9yeVJlZ2lvbiBNZW1vcnlSZWdpb25fdAorCSNkZWZpbmUgeFRhc2tQYXJhbWV0ZXJzIFRhc2tQYXJhbWV0ZXJzX3QKKwkjZGVmaW5lIHhUYXNrU3RhdHVzVHlwZQlUYXNrU3RhdHVzX3QKKwkjZGVmaW5lIHhUaW1lckhhbmRsZSBUaW1lckhhbmRsZV90CisJI2RlZmluZSB4Q29Sb3V0aW5lSGFuZGxlIENvUm91dGluZUhhbmRsZV90CisJI2RlZmluZSBwZFRBU0tfSE9PS19DT0RFIFRhc2tIb29rRnVuY3Rpb25fdAorCSNkZWZpbmUgcG9ydFRJQ0tfUkFURV9NUyBwb3J0VElDS19QRVJJT0RfTVMKKwkjZGVmaW5lIHBjVGFza0dldFRhc2tOYW1lIHBjVGFza0dldE5hbWUKKwkjZGVmaW5lIHBjVGltZXJHZXRUaW1lck5hbWUgcGNUaW1lckdldE5hbWUKKwkjZGVmaW5lIHBjUXVldWVHZXRRdWV1ZU5hbWUgcGNRdWV1ZUdldE5hbWUKKwkjZGVmaW5lIHZUYXNrR2V0VGFza0luZm8gdlRhc2tHZXRJbmZvCisKKwkvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGhpbiB0aGUgc2NoZWR1bGVyIGNvZGUgb25seSAtIHRoZXNlIGRlZmluaXRpb25zCisJYXJlIG5vdCByZWFsbHkgcmVxdWlyZWQgYnV0IGFyZSBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzLiAqLworCSNkZWZpbmUgdG1yVElNRVJfQ0FMTEJBQ0sgVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QKKwkjZGVmaW5lIHBkVEFTS19DT0RFIFRhc2tGdW5jdGlvbl90CisJI2RlZmluZSB4TGlzdEl0ZW0gTGlzdEl0ZW1fdAorCSNkZWZpbmUgeExpc3QgTGlzdF90CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX0JBQ0tXQVJEX0NPTVBBVElCSUxJVFkgKi8KKworI2lmKCBjb25maWdVU0VfQUxURVJOQVRJVkVfQVBJICE9IDAgKQorCSNlcnJvciBUaGUgYWx0ZXJuYXRpdmUgQVBJIHdhcyBkZXByZWNhdGVkIHNvbWUgdGltZSBhZ28sIGFuZCB3YXMgcmVtb3ZlZCBpbiBGcmVlUlRPUyBWOS4wIDAKKyNlbmRpZgorCisvKiBTZXQgY29uZmlnVVNFX1RBU0tfRlBVX1NVUFBPUlQgdG8gMCB0byBvbWl0IGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgZXZlbgoraWYgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUgaXMgb3RoZXJ3aXNlIHN1cHBvcnRlZCBieSB0aGUgRnJlZVJUT1MgcG9ydCBpbiB1c2UuCitUaGlzIGNvbnN0YW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIEZyZWVSVE9TIHBvcnRzIHRoYXQgaW5jbHVkZSBmbG9hdGluZworcG9pbnQgc3VwcG9ydC4gKi8KKyNpZm5kZWYgY29uZmlnVVNFX1RBU0tfRlBVX1NVUFBPUlQKKwkjZGVmaW5lIGNvbmZpZ1VTRV9UQVNLX0ZQVV9TVVBQT1JUIDEKKyNlbmRpZgorCisvKgorICogSW4gbGluZSB3aXRoIHNvZnR3YXJlIGVuZ2luZWVyaW5nIGJlc3QgcHJhY3RpY2UsIEZyZWVSVE9TIGltcGxlbWVudHMgYSBzdHJpY3QKKyAqIGRhdGEgaGlkaW5nIHBvbGljeSwgc28gdGhlIHJlYWwgc3RydWN0dXJlcyB1c2VkIGJ5IEZyZWVSVE9TIHRvIG1haW50YWluIHRoZQorICogc3RhdGUgb2YgdGFza3MsIHF1ZXVlcywgc2VtYXBob3JlcywgZXRjLiBhcmUgbm90IGFjY2Vzc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uCisgKiBjb2RlLiAgSG93ZXZlciwgaWYgdGhlIGFwcGxpY2F0aW9uIHdyaXRlciB3YW50cyB0byBzdGF0aWNhbGx5IGFsbG9jYXRlIHN1Y2gKKyAqIGFuIG9iamVjdCB0aGVuIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgbmVlZHMgdG8gYmUga25vdy4gIER1bW15IHN0cnVjdHVyZXMKKyAqIHRoYXQgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgc2FtZSBzaXplIGFuZCBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIHRoZQorICogcmVhbCBvYmplY3RzIGFyZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuICBUaGUgZHVtbXkgbGlzdCBhbmQgbGlzdCBpdGVtCisgKiBzdHJ1Y3R1cmVzIGJlbG93IGFyZSB1c2VkIGZvciBpbmNsdXNpb24gaW4gc3VjaCBhIGR1bW15IHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHhTVEFUSUNfTElTVF9JVEVNCit7CisJVGlja1R5cGVfdCB4RHVtbXkxOworCXZvaWQgKnB2RHVtbXkyWyA0IF07Cit9OwordHlwZWRlZiBzdHJ1Y3QgeFNUQVRJQ19MSVNUX0lURU0gU3RhdGljTGlzdEl0ZW1fdDsKKworLyogU2VlIHRoZSBjb21tZW50cyBhYm92ZSB0aGUgc3RydWN0IHhTVEFUSUNfTElTVF9JVEVNIGRlZmluaXRpb24uICovCitzdHJ1Y3QgeFNUQVRJQ19NSU5JX0xJU1RfSVRFTQoreworCVRpY2tUeXBlX3QgeER1bW15MTsKKwl2b2lkICpwdkR1bW15MlsgMiBdOworfTsKK3R5cGVkZWYgc3RydWN0IHhTVEFUSUNfTUlOSV9MSVNUX0lURU0gU3RhdGljTWluaUxpc3RJdGVtX3Q7CisKKy8qIFNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIHN0cnVjdCB4U1RBVElDX0xJU1RfSVRFTSBkZWZpbml0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgeFNUQVRJQ19MSVNUCit7CisJVUJhc2VUeXBlX3QgdXhEdW1teTE7CisJdm9pZCAqcHZEdW1teTI7CisJU3RhdGljTWluaUxpc3RJdGVtX3QgeER1bW15MzsKK30gU3RhdGljTGlzdF90OworCisvKgorICogSW4gbGluZSB3aXRoIHNvZnR3YXJlIGVuZ2luZWVyaW5nIGJlc3QgcHJhY3RpY2UsIGVzcGVjaWFsbHkgd2hlbiBzdXBwbHlpbmcgYQorICogbGlicmFyeSB0aGF0IGlzIGxpa2VseSB0byBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zLCBGcmVlUlRPUyBpbXBsZW1lbnRzIGEKKyAqIHN0cmljdCBkYXRhIGhpZGluZyBwb2xpY3kuICBUaGlzIG1lYW5zIHRoZSBUYXNrIHN0cnVjdHVyZSB1c2VkIGludGVybmFsbHkgYnkKKyAqIEZyZWVSVE9TIGlzIG5vdCBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9uIGNvZGUuICBIb3dldmVyLCBpZiB0aGUgYXBwbGljYXRpb24KKyAqIHdyaXRlciB3YW50cyB0byBzdGF0aWNhbGx5IGFsbG9jYXRlIHRoZSBtZW1vcnkgcmVxdWlyZWQgdG8gY3JlYXRlIGEgdGFzayB0aGVuCisgKiB0aGUgc2l6ZSBvZiB0aGUgdGFzayBvYmplY3QgbmVlZHMgdG8gYmUga25vdy4gIFRoZSBTdGF0aWNUYXNrX3Qgc3RydWN0dXJlCisgKiBiZWxvdyBpcyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlLiAgSXRzIHNpemVzIGFuZCBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFyZQorICogZ3VhcmFudGVlZCB0byBtYXRjaCB0aG9zZSBvZiB0aGUgZ2VudWluZSBzdHJ1Y3R1cmUsIG5vIG1hdHRlciB3aGljaAorICogYXJjaGl0ZWN0dXJlIGlzIGJlaW5nIHVzZWQsIGFuZCBubyBtYXR0ZXIgaG93IHRoZSB2YWx1ZXMgaW4gRnJlZVJUT1NDb25maWcuaAorICogYXJlIHNldC4gIEl0cyBjb250ZW50cyBhcmUgc29tZXdoYXQgb2JmdXNjYXRlZCBpbiB0aGUgaG9wZSB1c2VycyB3aWxsCisgKiByZWNvZ25pc2UgdGhhdCBpdCB3b3VsZCBiZSB1bndpc2UgdG8gbWFrZSBkaXJlY3QgdXNlIG9mIHRoZSBzdHJ1Y3R1cmUgbWVtYmVycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeFNUQVRJQ19UQ0IKK3sKKwl2b2lkCQkJCSpweER1bW15MTsKKwkjaWYgKCBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDEgKQorCQl4TVBVX1NFVFRJTkdTCXhEdW1teTI7CisJI2VuZGlmCisJU3RhdGljTGlzdEl0ZW1fdAl4RHVtbXkzWyAyIF07CisJVUJhc2VUeXBlX3QJCQl1eER1bW15NTsKKwl2b2lkCQkJCSpweER1bW15NjsKKwl1aW50OF90CQkJCXVjRHVtbXk3WyBjb25maWdNQVhfVEFTS19OQU1FX0xFTiBdOworCSNpZiAoICggcG9ydFNUQUNLX0dST1dUSCA+IDAgKSB8fCAoIGNvbmZpZ1JFQ09SRF9TVEFDS19ISUdIX0FERFJFU1MgPT0gMSApICkKKwkJdm9pZAkJCSpweER1bW15ODsKKwkjZW5kaWYKKwkjaWYgKCBwb3J0Q1JJVElDQUxfTkVTVElOR19JTl9UQ0IgPT0gMSApCisJCVVCYXNlVHlwZV90CQl1eER1bW15OTsKKwkjZW5kaWYKKwkjaWYgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisJCVVCYXNlVHlwZV90CQl1eER1bW15MTBbIDIgXTsKKwkjZW5kaWYKKwkjaWYgKCBjb25maWdVU0VfTVVURVhFUyA9PSAxICkKKwkJVUJhc2VUeXBlX3QJCXV4RHVtbXkxMlsgMiBdOworCSNlbmRpZgorCSNpZiAoIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyA9PSAxICkKKwkJdm9pZAkJCSpweER1bW15MTQ7CisJI2VuZGlmCisJI2lmKCBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgPiAwICkKKwkJdm9pZAkJCSpwdkR1bW15MTVbIGNvbmZpZ05VTV9USFJFQURfTE9DQUxfU1RPUkFHRV9QT0lOVEVSUyBdOworCSNlbmRpZgorCSNpZiAoIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTID09IDEgKQorCQl1aW50MzJfdAkJdWxEdW1teTE2OworCSNlbmRpZgorCSNpZiAoIGNvbmZpZ1VTRV9ORVdMSUJfUkVFTlRSQU5UID09IDEgKQorCQlzdHJ1Y3QJX3JlZW50CXhEdW1teTE3OworCSNlbmRpZgorCSNpZiAoIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgPT0gMSApCisJCXVpbnQzMl90IAkJdWxEdW1teTE4OworCQl1aW50OF90IAkJdWNEdW1teTE5OworCSNlbmRpZgorCSNpZiggKCAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkgfHwgKCBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDEgKSApCisJCXVpbnQ4X3QJCQl1eER1bW15MjA7CisJI2VuZGlmCisKKwkjaWYoIElOQ0xVREVfeFRhc2tBYm9ydERlbGF5ID09IDEgKQorCQl1aW50OF90IHVjRHVtbXkyMTsKKwkjZW5kaWYKKworfSBTdGF0aWNUYXNrX3Q7CisKKy8qCisgKiBJbiBsaW5lIHdpdGggc29mdHdhcmUgZW5naW5lZXJpbmcgYmVzdCBwcmFjdGljZSwgZXNwZWNpYWxseSB3aGVuIHN1cHBseWluZyBhCisgKiBsaWJyYXJ5IHRoYXQgaXMgbGlrZWx5IHRvIGNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMsIEZyZWVSVE9TIGltcGxlbWVudHMgYQorICogc3RyaWN0IGRhdGEgaGlkaW5nIHBvbGljeS4gIFRoaXMgbWVhbnMgdGhlIFF1ZXVlIHN0cnVjdHVyZSB1c2VkIGludGVybmFsbHkgYnkKKyAqIEZyZWVSVE9TIGlzIG5vdCBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9uIGNvZGUuICBIb3dldmVyLCBpZiB0aGUgYXBwbGljYXRpb24KKyAqIHdyaXRlciB3YW50cyB0byBzdGF0aWNhbGx5IGFsbG9jYXRlIHRoZSBtZW1vcnkgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcXVldWUKKyAqIHRoZW4gdGhlIHNpemUgb2YgdGhlIHF1ZXVlIG9iamVjdCBuZWVkcyB0byBiZSBrbm93LiAgVGhlIFN0YXRpY1F1ZXVlX3QKKyAqIHN0cnVjdHVyZSBiZWxvdyBpcyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlLiAgSXRzIHNpemVzIGFuZCBhbGlnbm1lbnQKKyAqIHJlcXVpcmVtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBtYXRjaCB0aG9zZSBvZiB0aGUgZ2VudWluZSBzdHJ1Y3R1cmUsIG5vCisgKiBtYXR0ZXIgd2hpY2ggYXJjaGl0ZWN0dXJlIGlzIGJlaW5nIHVzZWQsIGFuZCBubyBtYXR0ZXIgaG93IHRoZSB2YWx1ZXMgaW4KKyAqIEZyZWVSVE9TQ29uZmlnLmggYXJlIHNldC4gIEl0cyBjb250ZW50cyBhcmUgc29tZXdoYXQgb2JmdXNjYXRlZCBpbiB0aGUgaG9wZQorICogdXNlcnMgd2lsbCByZWNvZ25pc2UgdGhhdCBpdCB3b3VsZCBiZSB1bndpc2UgdG8gbWFrZSBkaXJlY3QgdXNlIG9mIHRoZQorICogc3RydWN0dXJlIG1lbWJlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhTVEFUSUNfUVVFVUUKK3sKKwl2b2lkICpwdkR1bW15MVsgMyBdOworCisJdW5pb24KKwl7CisJCXZvaWQgKnB2RHVtbXkyOworCQlVQmFzZVR5cGVfdCB1eER1bW15MjsKKwl9IHU7CisKKwlTdGF0aWNMaXN0X3QgeER1bW15M1sgMiBdOworCVVCYXNlVHlwZV90IHV4RHVtbXk0WyAzIF07CisJdWludDhfdCB1Y0R1bW15NVsgMiBdOworCisJI2lmKCAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKKwkJdWludDhfdCB1Y0R1bW15NjsKKwkjZW5kaWYKKworCSNpZiAoIGNvbmZpZ1VTRV9RVUVVRV9TRVRTID09IDEgKQorCQl2b2lkICpwdkR1bW15NzsKKwkjZW5kaWYKKworCSNpZiAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwkJVUJhc2VUeXBlX3QgdXhEdW1teTg7CisJCXVpbnQ4X3QgdWNEdW1teTk7CisJI2VuZGlmCisKK30gU3RhdGljUXVldWVfdDsKK3R5cGVkZWYgU3RhdGljUXVldWVfdCBTdGF0aWNTZW1hcGhvcmVfdDsKKworLyoKKyAqIEluIGxpbmUgd2l0aCBzb2Z0d2FyZSBlbmdpbmVlcmluZyBiZXN0IHByYWN0aWNlLCBlc3BlY2lhbGx5IHdoZW4gc3VwcGx5aW5nIGEKKyAqIGxpYnJhcnkgdGhhdCBpcyBsaWtlbHkgdG8gY2hhbmdlIGluIGZ1dHVyZSB2ZXJzaW9ucywgRnJlZVJUT1MgaW1wbGVtZW50cyBhCisgKiBzdHJpY3QgZGF0YSBoaWRpbmcgcG9saWN5LiAgVGhpcyBtZWFucyB0aGUgZXZlbnQgZ3JvdXAgc3RydWN0dXJlIHVzZWQKKyAqIGludGVybmFsbHkgYnkgRnJlZVJUT1MgaXMgbm90IGFjY2Vzc2libGUgdG8gYXBwbGljYXRpb24gY29kZS4gIEhvd2V2ZXIsIGlmCisgKiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIHdhbnRzIHRvIHN0YXRpY2FsbHkgYWxsb2NhdGUgdGhlIG1lbW9yeSByZXF1aXJlZCB0bworICogY3JlYXRlIGFuIGV2ZW50IGdyb3VwIHRoZW4gdGhlIHNpemUgb2YgdGhlIGV2ZW50IGdyb3VwIG9iamVjdCBuZWVkcyB0byBiZQorICoga25vdy4gIFRoZSBTdGF0aWNFdmVudEdyb3VwX3Qgc3RydWN0dXJlIGJlbG93IGlzIHByb3ZpZGVkIGZvciB0aGlzIHB1cnBvc2UuCisgKiBJdHMgc2l6ZXMgYW5kIGFsaWdubWVudCByZXF1aXJlbWVudHMgYXJlIGd1YXJhbnRlZWQgdG8gbWF0Y2ggdGhvc2Ugb2YgdGhlCisgKiBnZW51aW5lIHN0cnVjdHVyZSwgbm8gbWF0dGVyIHdoaWNoIGFyY2hpdGVjdHVyZSBpcyBiZWluZyB1c2VkLCBhbmQgbm8gbWF0dGVyCisgKiBob3cgdGhlIHZhbHVlcyBpbiBGcmVlUlRPU0NvbmZpZy5oIGFyZSBzZXQuICBJdHMgY29udGVudHMgYXJlIHNvbWV3aGF0CisgKiBvYmZ1c2NhdGVkIGluIHRoZSBob3BlIHVzZXJzIHdpbGwgcmVjb2duaXNlIHRoYXQgaXQgd291bGQgYmUgdW53aXNlIHRvIG1ha2UKKyAqIGRpcmVjdCB1c2Ugb2YgdGhlIHN0cnVjdHVyZSBtZW1iZXJzLgorICovCit0eXBlZGVmIHN0cnVjdCB4U1RBVElDX0VWRU5UX0dST1VQCit7CisJVGlja1R5cGVfdCB4RHVtbXkxOworCVN0YXRpY0xpc3RfdCB4RHVtbXkyOworCisJI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisJCVVCYXNlVHlwZV90IHV4RHVtbXkzOworCSNlbmRpZgorCisJI2lmKCAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKKwkJCXVpbnQ4X3QgdWNEdW1teTQ7CisJI2VuZGlmCisKK30gU3RhdGljRXZlbnRHcm91cF90OworCisvKgorICogSW4gbGluZSB3aXRoIHNvZnR3YXJlIGVuZ2luZWVyaW5nIGJlc3QgcHJhY3RpY2UsIGVzcGVjaWFsbHkgd2hlbiBzdXBwbHlpbmcgYQorICogbGlicmFyeSB0aGF0IGlzIGxpa2VseSB0byBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zLCBGcmVlUlRPUyBpbXBsZW1lbnRzIGEKKyAqIHN0cmljdCBkYXRhIGhpZGluZyBwb2xpY3kuICBUaGlzIG1lYW5zIHRoZSBzb2Z0d2FyZSB0aW1lciBzdHJ1Y3R1cmUgdXNlZAorICogaW50ZXJuYWxseSBieSBGcmVlUlRPUyBpcyBub3QgYWNjZXNzaWJsZSB0byBhcHBsaWNhdGlvbiBjb2RlLiAgSG93ZXZlciwgaWYKKyAqIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgd2FudHMgdG8gc3RhdGljYWxseSBhbGxvY2F0ZSB0aGUgbWVtb3J5IHJlcXVpcmVkIHRvCisgKiBjcmVhdGUgYSBzb2Z0d2FyZSB0aW1lciB0aGVuIHRoZSBzaXplIG9mIHRoZSBxdWV1ZSBvYmplY3QgbmVlZHMgdG8gYmUga25vdy4KKyAqIFRoZSBTdGF0aWNUaW1lcl90IHN0cnVjdHVyZSBiZWxvdyBpcyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlLiAgSXRzIHNpemVzCisgKiBhbmQgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBtYXRjaCB0aG9zZSBvZiB0aGUgZ2VudWluZQorICogc3RydWN0dXJlLCBubyBtYXR0ZXIgd2hpY2ggYXJjaGl0ZWN0dXJlIGlzIGJlaW5nIHVzZWQsIGFuZCBubyBtYXR0ZXIgaG93IHRoZQorICogdmFsdWVzIGluIEZyZWVSVE9TQ29uZmlnLmggYXJlIHNldC4gIEl0cyBjb250ZW50cyBhcmUgc29tZXdoYXQgb2JmdXNjYXRlZCBpbgorICogdGhlIGhvcGUgdXNlcnMgd2lsbCByZWNvZ25pc2UgdGhhdCBpdCB3b3VsZCBiZSB1bndpc2UgdG8gbWFrZSBkaXJlY3QgdXNlIG9mCisgKiB0aGUgc3RydWN0dXJlIG1lbWJlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhTVEFUSUNfVElNRVIKK3sKKwl2b2lkCQkJCSpwdkR1bW15MTsKKwlTdGF0aWNMaXN0SXRlbV90CXhEdW1teTI7CisJVGlja1R5cGVfdAkJCXhEdW1teTM7CisJVUJhc2VUeXBlX3QJCQl1eER1bW15NDsKKwl2b2lkIAkJCQkqcHZEdW1teTVbIDIgXTsKKwkjaWYoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwkJVUJhc2VUeXBlX3QJCXV4RHVtbXk2OworCSNlbmRpZgorCisJI2lmKCAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKKwkJdWludDhfdCAJCXVjRHVtbXk3OworCSNlbmRpZgorCit9IFN0YXRpY1RpbWVyX3Q7CisKKy8qCisqIEluIGxpbmUgd2l0aCBzb2Z0d2FyZSBlbmdpbmVlcmluZyBiZXN0IHByYWN0aWNlLCBlc3BlY2lhbGx5IHdoZW4gc3VwcGx5aW5nIGEKKyogbGlicmFyeSB0aGF0IGlzIGxpa2VseSB0byBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zLCBGcmVlUlRPUyBpbXBsZW1lbnRzIGEKKyogc3RyaWN0IGRhdGEgaGlkaW5nIHBvbGljeS4gIFRoaXMgbWVhbnMgdGhlIHN0cmVhbSBidWZmZXIgc3RydWN0dXJlIHVzZWQKKyogaW50ZXJuYWxseSBieSBGcmVlUlRPUyBpcyBub3QgYWNjZXNzaWJsZSB0byBhcHBsaWNhdGlvbiBjb2RlLiAgSG93ZXZlciwgaWYKKyogdGhlIGFwcGxpY2F0aW9uIHdyaXRlciB3YW50cyB0byBzdGF0aWNhbGx5IGFsbG9jYXRlIHRoZSBtZW1vcnkgcmVxdWlyZWQgdG8KKyogY3JlYXRlIGEgc3RyZWFtIGJ1ZmZlciB0aGVuIHRoZSBzaXplIG9mIHRoZSBzdHJlYW0gYnVmZmVyIG9iamVjdCBuZWVkcyB0byBiZQorKiBrbm93LiAgVGhlIFN0YXRpY1N0cmVhbUJ1ZmZlcl90IHN0cnVjdHVyZSBiZWxvdyBpcyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlLgorKiBJdHMgc2l6ZSBhbmQgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBtYXRjaCB0aG9zZSBvZiB0aGUKKyogZ2VudWluZSBzdHJ1Y3R1cmUsIG5vIG1hdHRlciB3aGljaCBhcmNoaXRlY3R1cmUgaXMgYmVpbmcgdXNlZCwgYW5kIG5vIG1hdHRlcgorKiBob3cgdGhlIHZhbHVlcyBpbiBGcmVlUlRPU0NvbmZpZy5oIGFyZSBzZXQuICBJdHMgY29udGVudHMgYXJlIHNvbWV3aGF0CisqIG9iZnVzY2F0ZWQgaW4gdGhlIGhvcGUgdXNlcnMgd2lsbCByZWNvZ25pc2UgdGhhdCBpdCB3b3VsZCBiZSB1bndpc2UgdG8gbWFrZQorKiBkaXJlY3QgdXNlIG9mIHRoZSBzdHJ1Y3R1cmUgbWVtYmVycy4KKyovCit0eXBlZGVmIHN0cnVjdCB4U1RBVElDX1NUUkVBTV9CVUZGRVIKK3sKKwlzaXplX3QgdXhEdW1teTFbIDQgXTsKKwl2b2lkICogcHZEdW1teTJbIDMgXTsKKwl1aW50OF90IHVjRHVtbXkzOworCSNpZiAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwkJVUJhc2VUeXBlX3QgdXhEdW1teTQ7CisJI2VuZGlmCit9IFN0YXRpY1N0cmVhbUJ1ZmZlcl90OworCisvKiBNZXNzYWdlIGJ1ZmZlcnMgYXJlIGJ1aWx0IG9uIHN0cmVhbSBidWZmZXJzLiAqLwordHlwZWRlZiBTdGF0aWNTdHJlYW1CdWZmZXJfdCBTdGF0aWNNZXNzYWdlQnVmZmVyX3Q7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBJTkNfRlJFRVJUT1NfSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9GcmVlUlRPU0NvbmZpZ190ZW1wbGF0ZS5oIGIvU291cmNlL2luY2x1ZGUvRnJlZVJUT1NDb25maWdfdGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVmNWE0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL2luY2x1ZGUvRnJlZVJUT1NDb25maWdfdGVtcGxhdGUuaApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgRlJFRVJUT1NfQ09ORklHX0gKKyNkZWZpbmUgRlJFRVJUT1NfQ09ORklHX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogdGhpcyBpcyBhIHRlbXBsYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMKKyAqCisgKiBUaGVzZSBkZWZpbml0aW9ucyBzaG91bGQgYmUgYWRqdXN0ZWQgZm9yIHlvdXIgcGFydGljdWxhciBoYXJkd2FyZSBhbmQKKyAqIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4KKyAqCisgKiBUaGVzZSBwYXJhbWV0ZXJzIGFuZCBtb3JlIGFyZSBkZXNjcmliZWQgd2l0aGluIHRoZSAnY29uZmlndXJhdGlvbicgc2VjdGlvbiBvZiB0aGUKKyAqIEZyZWVSVE9TIEFQSSBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBvbiB0aGUgRnJlZVJUT1Mub3JnIHdlYiBzaXRlLgorICoKKyAqIFNlZSBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTAuaHRtbAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRW5zdXJlIHN0ZGludCBpcyBvbmx5IHVzZWQgYnkgdGhlIGNvbXBpbGVyLCBhbmQgbm90IHRoZSBhc3NlbWJsZXIuICovCisjaWYgZGVmaW5lZChfX0lDQ0FSTV9fKSB8fCBkZWZpbmVkKF9fQ0NfQVJNKSB8fCBkZWZpbmVkKF9fR05VQ19fKQorICNpbmNsdWRlIDxzdGRpbnQuaD4KKyBleHRlcm4gdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrOworI2VuZGlmCisKKy8qICBDTVNJUy1SVE9TdjIgZGVmaW5lcyA1NiBsZXZlbHMgb2YgcHJpb3JpdGllcy4gVG8gYmUgYWJsZSB0byB1c2UgdGhlbQorICogIGFsbCBhbmQgYXZvaWQgYXBwbGljYXRpb24gbWlzYmVoYXZpb3IsIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTgorICogIG11c3QgYmUgc2V0IHRvIDAgYW5kIGNvbmZpZ01BWF9QUklPUklUSUVTIHRvIDU2CisgKgorICovCisvKiAjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTgkwKi8KKy8qICNkZWZpbmUgY29uZmlnTUFYX1BSSU9SSVRJRVMJCQkJCSggNTYgKSAqLworI2RlZmluZSBjb25maWdVU0VfUFJFRU1QVElPTiAgICAgICAgICAgICAgMQorI2RlZmluZSBjb25maWdVU0VfSURMRV9IT09LICAgICAgICAgICAgICAgMAorI2RlZmluZSBjb25maWdVU0VfVElDS19IT09LICAgICAgICAgICAgICAgMAorI2RlZmluZSBjb25maWdNQVhfUFJJT1JJVElFUyAgICAgICAgICAgICAgKDcpCisjZGVmaW5lIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gICAwCisjZGVmaW5lIGNvbmZpZ0NQVV9DTE9DS19IWiAgICAgICAgICAgICAgICAoU3lzdGVtQ29yZUNsb2NrKQorI2RlZmluZSBjb25maWdUSUNLX1JBVEVfSFogICAgICAgICAgICAgICAgKChUaWNrVHlwZV90KTEwMDApCisjZGVmaW5lIGNvbmZpZ01JTklNQUxfU1RBQ0tfU0laRSAgICAgICAgICAoKHVpbnQxNl90KTEyOCkKKyNkZWZpbmUgY29uZmlnVE9UQUxfSEVBUF9TSVpFICAgICAgICAgICAgICgoc2l6ZV90KSgxNSAqIDEwMjQpKQorI2RlZmluZSBjb25maWdNQVhfVEFTS19OQU1FX0xFTiAgICAgICAgICAgKDE2KQorI2RlZmluZSBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgICAgICAgICAgMQorI2RlZmluZSBjb25maWdVU0VfMTZfQklUX1RJQ0tTICAgICAgICAgICAgMAorI2RlZmluZSBjb25maWdJRExFX1NIT1VMRF9ZSUVMRCAgICAgICAgICAgMQorI2RlZmluZSBjb25maWdVU0VfTVVURVhFUyAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFICAgICAgICAgOAorI2RlZmluZSBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgICAgMAorI2RlZmluZSBjb25maWdVU0VfUkVDVVJTSVZFX01VVEVYRVMgICAgICAgMQorI2RlZmluZSBjb25maWdVU0VfTUFMTE9DX0ZBSUxFRF9IT09LICAgICAgMAorI2RlZmluZSBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgICAgMAorI2RlZmluZSBjb25maWdVU0VfQ09VTlRJTkdfU0VNQVBIT1JFUyAgICAgMQorI2RlZmluZSBjb25maWdHRU5FUkFURV9SVU5fVElNRV9TVEFUUyAgICAgMAorCisvKiBDby1yb3V0aW5lIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBjb25maWdVU0VfQ09fUk9VVElORVMgICAgICAgICAgIDAKKyNkZWZpbmUgY29uZmlnTUFYX0NPX1JPVVRJTkVfUFJJT1JJVElFUyAoMikKKworLyogU29mdHdhcmUgdGltZXIgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIGNvbmZpZ1VTRV9USU1FUlMgICAgICAgICAgICAgMAorI2RlZmluZSBjb25maWdUSU1FUl9UQVNLX1BSSU9SSVRZICAgICgyKQorI2RlZmluZSBjb25maWdUSU1FUl9RVUVVRV9MRU5HVEggICAgIDEwCisjZGVmaW5lIGNvbmZpZ1RJTUVSX1RBU0tfU1RBQ0tfREVQVEggKGNvbmZpZ01JTklNQUxfU1RBQ0tfU0laRSAqIDIpCisKKy8qIFNldCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRvIDEgdG8gaW5jbHVkZSB0aGUgQVBJIGZ1bmN0aW9uLCBvciB6ZXJvCit0byBleGNsdWRlIHRoZSBBUEkgZnVuY3Rpb24uICovCisjZGVmaW5lIElOQ0xVREVfdlRhc2tQcmlvcml0eVNldCAgICAgICAxCisjZGVmaW5lIElOQ0xVREVfdXhUYXNrUHJpb3JpdHlHZXQgICAgICAxCisjZGVmaW5lIElOQ0xVREVfdlRhc2tEZWxldGUgICAgICAgICAgICAxCisjZGVmaW5lIElOQ0xVREVfdlRhc2tDbGVhblVwUmVzb3VyY2VzICAwCisjZGVmaW5lIElOQ0xVREVfdlRhc2tTdXNwZW5kICAgICAgICAgICAxCisjZGVmaW5lIElOQ0xVREVfdlRhc2tEZWxheVVudGlsICAgICAgICAwCisjZGVmaW5lIElOQ0xVREVfdlRhc2tEZWxheSAgICAgICAgICAgICAxCisjZGVmaW5lIElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSAxCisKKy8qLS0tLS0tLS0tLS0tLSBDTVNJUy1SVE9TIFYyIHNwZWNpZmljIGRlZmluZXMgLS0tLS0tLS0tLS0qLworLyogV2hlbiB1c2luZyBDTVNJUy1SVE9TdjIgc2V0IGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gdG8gMQorICogaXMgbWFuZGF0b3J5IHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzLgorICogQ01TSVMtUlRPUyBWMiBpbXBsbWVudGF0aW9uIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgZGVmaW5lcworICoKKyNkZWZpbmUgY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAgICAgICAgICAxICAgPC0tIGNtc2lzX29zIHRocmVhZHMgYXJlIGNyZWF0ZWQgdXNpbmcgeFRhc2tDcmVhdGVTdGF0aWMoKSBBUEkKKyNkZWZpbmUgY29uZmlnTUFYX1BSSU9SSVRJRVMgICAgICAgICAgICAgICAgICAgICg1NikgPC0tIFByaW9yaXR5IHJhbmdlIGluIENNU0lTLVJUT1MgVjIgaXMgWzAgLi4gNTZdCisjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAwICAgIDwtLSB3aGVuIHNldCB0byAxLCBjb25maWdNQVhfUFJJT1JJVElFUyBjYW4ndCBiZSBtb3JlIHRoYW4gMzIgd2hpY2ggaXMgbm90IHN1aXRhYmxlIGZvciB0aGUgbmV3IENNU0lTLVJUT1MgdjIgcHJpb3JpdHkgcmFuZ2UKKyovCisKKy8qIHRoZSBDTVNJUy1SVE9TIFYyIEZyZWVSVE9TIHdyYXBwZXIgaXMgZGVwZW5kZW50IG9uIHRoZSBoZWFwIGltcGxlbWVudGF0aW9uIHVzZWQKKyAqIGJ5IHRoZSBhcHBsaWNhdGlvbiB0aHVzIHRoZSBjb3JyZWN0IGRlZmluZSBuZWVkIHRvIGJlIGVuYWJsZWQgZnJvbSB0aGUgbGlzdAorICogYmVsb3cKKyAqCisvL2RlZmluZSBVU0VfRnJlZVJUT1NfSEVBUF8xCisvL2RlZmluZSBVU0VfRnJlZVJUT1NfSEVBUF8yCisvL2RlZmluZSBVU0VfRnJlZVJUT1NfSEVBUF8zCisvL2RlZmluZSBVU0VfRnJlZVJUT1NfSEVBUF80CisvL2RlZmluZSBVU0VfRnJlZVJUT1NfSEVBUF81CisKKyovCisKKworLyogQ29ydGV4LU0gc3BlY2lmaWMgZGVmaW5pdGlvbnMuICovCisjaWZkZWYgX19OVklDX1BSSU9fQklUUworIC8qIF9fQlZJQ19QUklPX0JJVFMgd2lsbCBiZSBzcGVjaWZpZWQgd2hlbiBDTVNJUyBpcyBiZWluZyB1c2VkLiAqLworICNkZWZpbmUgY29uZmlnUFJJT19CSVRTICAgICAgICAgX19OVklDX1BSSU9fQklUUworI2Vsc2UKKyAjZGVmaW5lIGNvbmZpZ1BSSU9fQklUUyAgICAgICAgIDQgICAgICAgIC8qIDE1IHByaW9yaXR5IGxldmVscyAqLworI2VuZGlmCisKKy8qIFRoZSBsb3dlc3QgaW50ZXJydXB0IHByaW9yaXR5IHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBjYWxsIHRvIGEgInNldCBwcmlvcml0eSIKK2Z1bmN0aW9uLiAqLworI2RlZmluZSBjb25maWdMSUJSQVJZX0xPV0VTVF9JTlRFUlJVUFRfUFJJT1JJVFkgICAweGYKKworLyogVGhlIGhpZ2hlc3QgaW50ZXJydXB0IHByaW9yaXR5IHRoYXQgY2FuIGJlIHVzZWQgYnkgYW55IGludGVycnVwdCBzZXJ2aWNlCityb3V0aW5lIHRoYXQgbWFrZXMgY2FsbHMgdG8gaW50ZXJydXB0IHNhZmUgRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucy4gIERPIE5PVCBDQUxMCitJTlRFUlJVUFQgU0FGRSBGUkVFUlRPUyBBUEkgRlVOQ1RJT05TIEZST00gQU5ZIElOVEVSUlVQVCBUSEFUIEhBUyBBIEhJR0hFUgorUFJJT1JJVFkgVEhBTiBUSElTISAoaGlnaGVyIHByaW9yaXRpZXMgYXJlIGxvd2VyIG51bWVyaWMgdmFsdWVzLiAqLworI2RlZmluZSBjb25maWdMSUJSQVJZX01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSA1CisKKy8qIEludGVycnVwdCBwcmlvcml0aWVzIHVzZWQgYnkgdGhlIGtlcm5lbCBwb3J0IGxheWVyIGl0c2VsZi4gIFRoZXNlIGFyZSBnZW5lcmljCit0byBhbGwgQ29ydGV4LU0gcG9ydHMsIGFuZCBkbyBub3QgcmVseSBvbiBhbnkgcGFydGljdWxhciBsaWJyYXJ5IGZ1bmN0aW9ucy4gKi8KKyNkZWZpbmUgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSAgICggY29uZmlnTElCUkFSWV9MT1dFU1RfSU5URVJSVVBUX1BSSU9SSVRZIDw8ICg4IC0gY29uZmlnUFJJT19CSVRTKSApCisvKiAhISEhIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBtdXN0IG5vdCBiZSBzZXQgdG8gemVybyAhISEhCitTZWUgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbC4gKi8KKyNkZWZpbmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZICAoIGNvbmZpZ0xJQlJBUllfTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIDw8ICg4IC0gY29uZmlnUFJJT19CSVRTKSApCisKKy8qIE5vcm1hbCBhc3NlcnQoKSBzZW1hbnRpY3Mgd2l0aG91dCByZWx5aW5nIG9uIHRoZSBwcm92aXNpb24gb2YgYW4gYXNzZXJ0LmgKK2hlYWRlciBmaWxlLiAqLworI2RlZmluZSBjb25maWdBU1NFUlQoIHggKSBpZiggKCB4ICkgPT0gMCApIHsgdGFza0RJU0FCTEVfSU5URVJSVVBUUygpOyBmb3IoIDs7ICk7IH0KKworLyogRGVmaW5pdGlvbnMgdGhhdCBtYXAgdGhlIEZyZWVSVE9TIHBvcnQgaW50ZXJydXB0IGhhbmRsZXJzIHRvIHRoZWlyIENNU0lTCisgICBzdGFuZGFyZCBuYW1lcy4gKi8KKyNkZWZpbmUgdlBvcnRTVkNIYW5kbGVyICAgIFNWQ19IYW5kbGVyCisjZGVmaW5lIHhQb3J0UGVuZFNWSGFuZGxlciBQZW5kU1ZfSGFuZGxlcgorCisvKiBJTVBPUlRBTlQ6IEZyZWVSVE9TIGlzIHVzaW5nIHRoZSBTeXNUaWNrIGFzIGludGVybmFsIHRpbWUgYmFzZSwgdGh1cyBtYWtlIHN1cmUgdGhlIHN5c3RlbSBhbmQgcGVyaXBoZXJpYWxzIGFyZQorICAgICAgICAgICAgICB1c2luZyBhIGRpZmZlcmVudCB0aW1lIGJhc2UgKFRJTSBiYXNlZCBmb3IgZXhhbXBsZSkuCisgKi8KKyNkZWZpbmUgeFBvcnRTeXNUaWNrSGFuZGxlciBTeXNUaWNrX0hhbmRsZXIKKworI2VuZGlmIC8qIEZSRUVSVE9TX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL1N0YWNrTWFjcm9zLmggYi9Tb3VyY2UvaW5jbHVkZS9TdGFja01hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNGYwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvaW5jbHVkZS9TdGFja01hY3Jvcy5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBTVEFDS19NQUNST1NfSAorI2RlZmluZSBTVEFDS19NQUNST1NfSAorCisjaWZuZGVmIF9NU0NfVkVSIC8qIFZpc3VhbCBTdHVkaW8gZG9lc24ndCBzdXBwb3J0ICN3YXJuaW5nLiAqLworCSN3YXJuaW5nIFRoZSBuYW1lIG9mIHRoaXMgZmlsZSBoYXMgY2hhbmdlZCB0byBzdGFja19tYWNyb3MuaC4gIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIGFjY29yZGluZ2x5LiAgVGhpcyBzb3VyY2UgZmlsZSAod2hpY2ggaGFzIHRoZSBvcmlnaW5hbCBuYW1lKSB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHJlbGVhc2VkLgorI2VuZGlmCisKKy8qCisgKiBDYWxsIHRoZSBzdGFjayBvdmVyZmxvdyBob29rIGZ1bmN0aW9uIGlmIHRoZSBzdGFjayBvZiB0aGUgdGFzayBiZWluZyBzd2FwcGVkCisgKiBvdXQgaXMgY3VycmVudGx5IG92ZXJmbG93ZWQsIG9yIGxvb2tzIGxpa2UgaXQgbWlnaHQgaGF2ZSBvdmVyZmxvd2VkIGluIHRoZQorICogcGFzdC4KKyAqCisgKiBTZXR0aW5nIGNvbmZpZ0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVyB0byAxIHdpbGwgY2F1c2UgdGhlIG1hY3JvIHRvIGNoZWNrCisgKiB0aGUgY3VycmVudCBzdGFjayBzdGF0ZSBvbmx5IC0gY29tcGFyaW5nIHRoZSBjdXJyZW50IHRvcCBvZiBzdGFjayB2YWx1ZSB0bworICogdGhlIHN0YWNrIGxpbWl0LiAgU2V0dGluZyBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgdG8gZ3JlYXRlciB0aGFuIDEKKyAqIHdpbGwgYWxzbyBjYXVzZSB0aGUgbGFzdCBmZXcgc3RhY2sgYnl0ZXMgdG8gYmUgY2hlY2tlZCB0byBlbnN1cmUgdGhlIHZhbHVlCisgKiB0byB3aGljaCB0aGUgYnl0ZXMgd2VyZSBzZXQgd2hlbiB0aGUgdGFzayB3YXMgY3JlYXRlZCBoYXZlIG5vdCBiZWVuCisgKiBvdmVyd3JpdHRlbi4gIE5vdGUgdGhpcyBzZWNvbmQgdGVzdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBhbiBvdmVyZmxvd2VkCisgKiBzdGFjayB3aWxsIGFsd2F5cyBiZSByZWNvZ25pc2VkLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID09IDEgKSAmJiAoIHBvcnRTVEFDS19HUk9XVEggPCAwICkgKQorCisJLyogT25seSB0aGUgY3VycmVudCBzdGFjayBzdGF0ZSBpcyB0byBiZSBjaGVja2VkLiAqLworCSNkZWZpbmUgdGFza0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVygpCQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJLyogSXMgdGhlIGN1cnJlbnRseSBzYXZlZCBzdGFjayBwb2ludGVyIHdpdGhpbiB0aGUgc3RhY2sgbGltaXQ/ICovCQkJCQkJCQlcCisJCWlmKCBweEN1cnJlbnRUQ0ItPnB4VG9wT2ZTdGFjayA8PSBweEN1cnJlbnRUQ0ItPnB4U3RhY2sgKQkJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQl2QXBwbGljYXRpb25TdGFja092ZXJmbG93SG9vayggKCBUYXNrSGFuZGxlX3QgKSBweEN1cnJlbnRUQ0IsIHB4Q3VycmVudFRDQi0+cGNUYXNrTmFtZSApOwlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJfQorCisjZW5kaWYgLyogY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID09IDEgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID09IDEgKSAmJiAoIHBvcnRTVEFDS19HUk9XVEggPiAwICkgKQorCisJLyogT25seSB0aGUgY3VycmVudCBzdGFjayBzdGF0ZSBpcyB0byBiZSBjaGVja2VkLiAqLworCSNkZWZpbmUgdGFza0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVygpCQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkvKiBJcyB0aGUgY3VycmVudGx5IHNhdmVkIHN0YWNrIHBvaW50ZXIgd2l0aGluIHRoZSBzdGFjayBsaW1pdD8gKi8JCQkJCQkJCVwKKwkJaWYoIHB4Q3VycmVudFRDQi0+cHhUb3BPZlN0YWNrID49IHB4Q3VycmVudFRDQi0+cHhFbmRPZlN0YWNrICkJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQl2QXBwbGljYXRpb25TdGFja092ZXJmbG93SG9vayggKCBUYXNrSGFuZGxlX3QgKSBweEN1cnJlbnRUQ0IsIHB4Q3VycmVudFRDQi0+cGNUYXNrTmFtZSApOwlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJfQorCisjZW5kaWYgLyogY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID09IDEgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID4gMSApICYmICggcG9ydFNUQUNLX0dST1dUSCA8IDAgKSApCisKKwkjZGVmaW5lIHRhc2tDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1coKQkJCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCWNvbnN0IHVpbnQzMl90ICogY29uc3QgcHVsU3RhY2sgPSAoIHVpbnQzMl90ICogKSBweEN1cnJlbnRUQ0ItPnB4U3RhY2s7CQkJCQkJCVwKKwkJY29uc3QgdWludDMyX3QgdWxDaGVja1ZhbHVlID0gKCB1aW50MzJfdCApIDB4YTVhNWE1YTU7CQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJaWYoICggcHVsU3RhY2tbIDAgXSAhPSB1bENoZWNrVmFsdWUgKSB8fAkJCQkJCQkJCQkJCVwKKwkJCSggcHVsU3RhY2tbIDEgXSAhPSB1bENoZWNrVmFsdWUgKSB8fAkJCQkJCQkJCQkJCVwKKwkJCSggcHVsU3RhY2tbIDIgXSAhPSB1bENoZWNrVmFsdWUgKSB8fAkJCQkJCQkJCQkJCVwKKwkJCSggcHVsU3RhY2tbIDMgXSAhPSB1bENoZWNrVmFsdWUgKSApCQkJCQkJCQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJdkFwcGxpY2F0aW9uU3RhY2tPdmVyZmxvd0hvb2soICggVGFza0hhbmRsZV90ICkgcHhDdXJyZW50VENCLCBweEN1cnJlbnRUQ0ItPnBjVGFza05hbWUgKTsJXAorCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCX0KKworI2VuZGlmIC8qICNpZiggY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID4gMSApICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCAoIGNvbmZpZ0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVyA+IDEgKSAmJiAoIHBvcnRTVEFDS19HUk9XVEggPiAwICkgKQorCisJI2RlZmluZSB0YXNrQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XKCkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlpbnQ4X3QgKnBjRW5kT2ZTdGFjayA9ICggaW50OF90ICogKSBweEN1cnJlbnRUQ0ItPnB4RW5kT2ZTdGFjazsJCQkJCQkJCQkJCQkJCQkJCQlcCisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgdWNFeHBlY3RlZFN0YWNrQnl0ZXNbXSA9IHsJdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFLAkJXAorCQkJCQkJCQkJCQkJCXRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSwJCVwKKwkJCQkJCQkJCQkJCQl0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsCQlcCisJCQkJCQkJCQkJCQkJdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFLAkJXAorCQkJCQkJCQkJCQkJCXRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSB9OwlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJcGNFbmRPZlN0YWNrIC09IHNpemVvZiggdWNFeHBlY3RlZFN0YWNrQnl0ZXMgKTsJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkvKiBIYXMgdGhlIGV4dHJlbWl0eSBvZiB0aGUgdGFzayBzdGFjayBldmVyIGJlZW4gd3JpdHRlbiBvdmVyPyAqLwkJCQkJCQkJCQkJCQkJCQlcCisJCWlmKCBtZW1jbXAoICggdm9pZCAqICkgcGNFbmRPZlN0YWNrLCAoIHZvaWQgKiApIHVjRXhwZWN0ZWRTdGFja0J5dGVzLCBzaXplb2YoIHVjRXhwZWN0ZWRTdGFja0J5dGVzICkgKSAhPSAwICkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJdkFwcGxpY2F0aW9uU3RhY2tPdmVyZmxvd0hvb2soICggVGFza0hhbmRsZV90ICkgcHhDdXJyZW50VENCLCBweEN1cnJlbnRUQ0ItPnBjVGFza05hbWUgKTsJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl9CisKKyNlbmRpZiAvKiAjaWYoIGNvbmZpZ0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVyA+IDEgKSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFJlbW92ZSBzdGFjayBvdmVyZmxvdyBtYWNybyBpZiBub3QgYmVpbmcgdXNlZC4gKi8KKyNpZm5kZWYgdGFza0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVworCSNkZWZpbmUgdGFza0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVygpCisjZW5kaWYKKworCisKKyNlbmRpZiAvKiBTVEFDS19NQUNST1NfSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9jcm91dGluZS5oIGIvU291cmNlL2luY2x1ZGUvY3JvdXRpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM1NGQyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL2luY2x1ZGUvY3JvdXRpbmUuaApAQCAtMCwwICsxLDcyMCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgQ09fUk9VVElORV9ICisjZGVmaW5lIENPX1JPVVRJTkVfSAorCisjaWZuZGVmIElOQ19GUkVFUlRPU19ICisJI2Vycm9yICJpbmNsdWRlIEZyZWVSVE9TLmggbXVzdCBhcHBlYXIgaW4gc291cmNlIGZpbGVzIGJlZm9yZSBpbmNsdWRlIGNyb3V0aW5lLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImxpc3QuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBVc2VkIHRvIGhpZGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjby1yb3V0aW5lIGNvbnRyb2wgYmxvY2suICBUaGUKK2NvbnRyb2wgYmxvY2sgc3RydWN0dXJlIGhvd2V2ZXIgaGFzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBoZWFkZXIgZHVlIHRvCit0aGUgbWFjcm8gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvLXJvdXRpbmUgZnVuY3Rpb25hbGl0eS4gKi8KK3R5cGVkZWYgdm9pZCAqIENvUm91dGluZUhhbmRsZV90OworCisvKiBEZWZpbmVzIHRoZSBwcm90b3R5cGUgdG8gd2hpY2ggY28tcm91dGluZSBmdW5jdGlvbnMgbXVzdCBjb25mb3JtLiAqLwordHlwZWRlZiB2b2lkICgqY3JDT1JPVVRJTkVfQ09ERSkoIENvUm91dGluZUhhbmRsZV90LCBVQmFzZVR5cGVfdCApOworCit0eXBlZGVmIHN0cnVjdCBjb3JDb1JvdXRpbmVDb250cm9sQmxvY2sKK3sKKwljckNPUk9VVElORV9DT0RFIAlweENvUm91dGluZUZ1bmN0aW9uOworCUxpc3RJdGVtX3QJCQl4R2VuZXJpY0xpc3RJdGVtOwkvKjwgTGlzdCBpdGVtIHVzZWQgdG8gcGxhY2UgdGhlIENSQ0IgaW4gcmVhZHkgYW5kIGJsb2NrZWQgcXVldWVzLiAqLworCUxpc3RJdGVtX3QJCQl4RXZlbnRMaXN0SXRlbTsJCS8qPCBMaXN0IGl0ZW0gdXNlZCB0byBwbGFjZSB0aGUgQ1JDQiBpbiBldmVudCBsaXN0cy4gKi8KKwlVQmFzZVR5cGVfdCAJCXV4UHJpb3JpdHk7CQkJLyo8IFRoZSBwcmlvcml0eSBvZiB0aGUgY28tcm91dGluZSBpbiByZWxhdGlvbiB0byBvdGhlciBjby1yb3V0aW5lcy4gKi8KKwlVQmFzZVR5cGVfdCAJCXV4SW5kZXg7CQkJLyo8IFVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBjby1yb3V0aW5lcyB3aGVuIG11bHRpcGxlIGNvLXJvdXRpbmVzIHVzZSB0aGUgc2FtZSBjby1yb3V0aW5lIGZ1bmN0aW9uLiAqLworCXVpbnQxNl90IAkJCXV4U3RhdGU7CQkJLyo8IFVzZWQgaW50ZXJuYWxseSBieSB0aGUgY28tcm91dGluZSBpbXBsZW1lbnRhdGlvbi4gKi8KK30gQ1JDQl90OyAvKiBDby1yb3V0aW5lIGNvbnRyb2wgYmxvY2suICBOb3RlIG11c3QgYmUgaWRlbnRpY2FsIGluIHNpemUgZG93biB0byB1eFByaW9yaXR5IHdpdGggVENCX3QuICovCisKKy8qKgorICogY3JvdXRpbmUuIGgKKyAqPHByZT4KKyBCYXNlVHlwZV90IHhDb1JvdXRpbmVDcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckNPUk9VVElORV9DT0RFIHB4Q29Sb3V0aW5lQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVCYXNlVHlwZV90IHV4UHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQmFzZVR5cGVfdCB1eEluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTs8L3ByZT4KKyAqCisgKiBDcmVhdGUgYSBuZXcgY28tcm91dGluZSBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGNvLXJvdXRpbmVzIHRoYXQgYXJlCisgKiByZWFkeSB0byBydW4uCisgKgorICogQHBhcmFtIHB4Q29Sb3V0aW5lQ29kZSBQb2ludGVyIHRvIHRoZSBjby1yb3V0aW5lIGZ1bmN0aW9uLiAgQ28tcm91dGluZQorICogZnVuY3Rpb25zIHJlcXVpcmUgc3BlY2lhbCBzeW50YXggLSBzZWUgdGhlIGNvLXJvdXRpbmUgc2VjdGlvbiBvZiB0aGUgV0VCCisgKiBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIEBwYXJhbSB1eFByaW9yaXR5IFRoZSBwcmlvcml0eSB3aXRoIHJlc3BlY3QgdG8gb3RoZXIgY28tcm91dGluZXMgYXQgd2hpY2gKKyAqICB0aGUgY28tcm91dGluZSB3aWxsIHJ1bi4KKyAqCisgKiBAcGFyYW0gdXhJbmRleCBVc2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IGNvLXJvdXRpbmVzIHRoYXQKKyAqIGV4ZWN1dGUgdGhlIHNhbWUgZnVuY3Rpb24uICBTZWUgdGhlIGV4YW1wbGUgYmVsb3cgYW5kIHRoZSBjby1yb3V0aW5lIHNlY3Rpb24KKyAqIG9mIHRoZSBXRUIgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcmV0dXJuIHBkUEFTUyBpZiB0aGUgY28tcm91dGluZSB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW5kIGFkZGVkIHRvIGEgcmVhZHkKKyAqIGxpc3QsIG90aGVyd2lzZSBhbiBlcnJvciBjb2RlIGRlZmluZWQgd2l0aCBQcm9qRGVmcy5oLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIC8vIENvLXJvdXRpbmUgdG8gYmUgY3JlYXRlZC4KKyB2b2lkIHZGbGFzaENvUm91dGluZSggQ29Sb3V0aW5lSGFuZGxlX3QgeEhhbmRsZSwgVUJhc2VUeXBlX3QgdXhJbmRleCApCisgeworIC8vIFZhcmlhYmxlcyBpbiBjby1yb3V0aW5lcyBtdXN0IGJlIGRlY2xhcmVkIHN0YXRpYyBpZiB0aGV5IG11c3QgbWFpbnRhaW4gdmFsdWUgYWNyb3NzIGEgYmxvY2tpbmcgY2FsbC4KKyAvLyBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5IGZvciBjb25zdCB2YXJpYWJsZXMuCisgc3RhdGljIGNvbnN0IGNoYXIgY0xlZFRvRmxhc2hbIDIgXSA9IHsgNSwgNiB9OworIHN0YXRpYyBjb25zdCBUaWNrVHlwZV90IHV4Rmxhc2hSYXRlc1sgMiBdID0geyAyMDAsIDQwMCB9OworCisgICAgIC8vIE11c3Qgc3RhcnQgZXZlcnkgY28tcm91dGluZSB3aXRoIGEgY2FsbCB0byBjclNUQVJUKCk7CisgICAgIGNyU1RBUlQoIHhIYW5kbGUgKTsKKworICAgICBmb3IoIDs7ICkKKyAgICAgeworICAgICAgICAgLy8gVGhpcyBjby1yb3V0aW5lIGp1c3QgZGVsYXlzIGZvciBhIGZpeGVkIHBlcmlvZCwgdGhlbiB0b2dnbGVzCisgICAgICAgICAvLyBhbiBMRUQuICBUd28gY28tcm91dGluZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhpcyBmdW5jdGlvbiwgc28KKyAgICAgICAgIC8vIHRoZSB1eEluZGV4IHBhcmFtZXRlciBpcyB1c2VkIHRvIHRlbGwgdGhlIGNvLXJvdXRpbmUgd2hpY2gKKyAgICAgICAgIC8vIExFRCB0byBmbGFzaCBhbmQgaG93IGludDMyX3QgdG8gZGVsYXkuICBUaGlzIGFzc3VtZXMgeFF1ZXVlIGhhcworICAgICAgICAgLy8gYWxyZWFkeSBiZWVuIGNyZWF0ZWQuCisgICAgICAgICB2UGFyVGVzdFRvZ2dsZUxFRCggY0xlZFRvRmxhc2hbIHV4SW5kZXggXSApOworICAgICAgICAgY3JERUxBWSggeEhhbmRsZSwgdXhGbGFzaFJhdGVzWyB1eEluZGV4IF0gKTsKKyAgICAgfQorCisgICAgIC8vIE11c3QgZW5kIGV2ZXJ5IGNvLXJvdXRpbmUgd2l0aCBhIGNhbGwgdG8gY3JFTkQoKTsKKyAgICAgY3JFTkQoKTsKKyB9CisKKyAvLyBGdW5jdGlvbiB0aGF0IGNyZWF0ZXMgdHdvIGNvLXJvdXRpbmVzLgorIHZvaWQgdk90aGVyRnVuY3Rpb24oIHZvaWQgKQorIHsKKyB1aW50OF90IHVjUGFyYW1ldGVyVG9QYXNzOworIFRhc2tIYW5kbGVfdCB4SGFuZGxlOworCisgICAgIC8vIENyZWF0ZSB0d28gY28tcm91dGluZXMgYXQgcHJpb3JpdHkgMC4gIFRoZSBmaXJzdCBpcyBnaXZlbiBpbmRleCAwCisgICAgIC8vIHNvIChmcm9tIHRoZSBjb2RlIGFib3ZlKSB0b2dnbGVzIExFRCA1IGV2ZXJ5IDIwMCB0aWNrcy4gIFRoZSBzZWNvbmQKKyAgICAgLy8gaXMgZ2l2ZW4gaW5kZXggMSBzbyB0b2dnbGVzIExFRCA2IGV2ZXJ5IDQwMCB0aWNrcy4KKyAgICAgZm9yKCB1eEluZGV4ID0gMDsgdXhJbmRleCA8IDI7IHV4SW5kZXgrKyApCisgICAgIHsKKyAgICAgICAgIHhDb1JvdXRpbmVDcmVhdGUoIHZGbGFzaENvUm91dGluZSwgMCwgdXhJbmRleCApOworICAgICB9CisgfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeENvUm91dGluZUNyZWF0ZSB4Q29Sb3V0aW5lQ3JlYXRlCisgKiBcaW5ncm91cCBUYXNrcworICovCitCYXNlVHlwZV90IHhDb1JvdXRpbmVDcmVhdGUoIGNyQ09ST1VUSU5FX0NPREUgcHhDb1JvdXRpbmVDb2RlLCBVQmFzZVR5cGVfdCB1eFByaW9yaXR5LCBVQmFzZVR5cGVfdCB1eEluZGV4ICk7CisKKworLyoqCisgKiBjcm91dGluZS4gaAorICo8cHJlPgorIHZvaWQgdkNvUm91dGluZVNjaGVkdWxlKCB2b2lkICk7PC9wcmU+CisgKgorICogUnVuIGEgY28tcm91dGluZS4KKyAqCisgKiB2Q29Sb3V0aW5lU2NoZWR1bGUoKSBleGVjdXRlcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBjby1yb3V0aW5lIHRoYXQgaXMgYWJsZQorICogdG8gcnVuLiAgVGhlIGNvLXJvdXRpbmUgd2lsbCBleGVjdXRlIHVudGlsIGl0IGVpdGhlciBibG9ja3MsIHlpZWxkcyBvciBpcworICogcHJlZW1wdGVkIGJ5IGEgdGFzay4gIENvLXJvdXRpbmVzIGV4ZWN1dGUgY29vcGVyYXRpdmVseSBzbyBvbmUKKyAqIGNvLXJvdXRpbmUgY2Fubm90IGJlIHByZWVtcHRlZCBieSBhbm90aGVyLCBidXQgY2FuIGJlIHByZWVtcHRlZCBieSBhIHRhc2suCisgKgorICogSWYgYW4gYXBwbGljYXRpb24gY29tcHJpc2VzIG9mIGJvdGggdGFza3MgYW5kIGNvLXJvdXRpbmVzIHRoZW4KKyAqIHZDb1JvdXRpbmVTY2hlZHVsZSBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGlkbGUgdGFzayAoaW4gYW4gaWRsZSB0YXNrCisgKiBob29rKS4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKyAvLyBUaGlzIGlkbGUgdGFzayBob29rIHdpbGwgc2NoZWR1bGUgYSBjby1yb3V0aW5lIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuCisgLy8gVGhlIHJlc3Qgb2YgdGhlIGlkbGUgdGFzayB3aWxsIGV4ZWN1dGUgYmV0d2VlbiBjby1yb3V0aW5lIGNhbGxzLgorIHZvaWQgdkFwcGxpY2F0aW9uSWRsZUhvb2soIHZvaWQgKQorIHsKKwl2Q29Sb3V0aW5lU2NoZWR1bGUoKTsKKyB9CisKKyAvLyBBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgZG8gbm90IHJlcXVpcmUgYW55IG90aGVyIHBhcnQgb2YgdGhlIGlkbGUgdGFzayB0bworIC8vIGV4ZWN1dGUsIHRoZSBpZGxlIHRhc2sgaG9vayBjYW4gY2FsbCB2Q29Sb3V0aW5lU2NoZWR1bGVyKCkgd2l0aGluIGFuCisgLy8gaW5maW5pdGUgbG9vcC4KKyB2b2lkIHZBcHBsaWNhdGlvbklkbGVIb29rKCB2b2lkICkKKyB7CisgICAgZm9yKCA7OyApCisgICAgeworICAgICAgICB2Q29Sb3V0aW5lU2NoZWR1bGUoKTsKKyAgICB9CisgfQorIDwvcHJlPgorICogXGRlZmdyb3VwIHZDb1JvdXRpbmVTY2hlZHVsZSB2Q29Sb3V0aW5lU2NoZWR1bGUKKyAqIFxpbmdyb3VwIFRhc2tzCisgKi8KK3ZvaWQgdkNvUm91dGluZVNjaGVkdWxlKCB2b2lkICk7CisKKy8qKgorICogY3JvdXRpbmUuIGgKKyAqIDxwcmU+CisgY3JTVEFSVCggQ29Sb3V0aW5lSGFuZGxlX3QgeEhhbmRsZSApOzwvcHJlPgorICoKKyAqIFRoaXMgbWFjcm8gTVVTVCBhbHdheXMgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhIGNvLXJvdXRpbmUgZnVuY3Rpb24uCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+CisgLy8gQ28tcm91dGluZSB0byBiZSBjcmVhdGVkLgorIHZvaWQgdkFDb1JvdXRpbmUoIENvUm91dGluZUhhbmRsZV90IHhIYW5kbGUsIFVCYXNlVHlwZV90IHV4SW5kZXggKQorIHsKKyAvLyBWYXJpYWJsZXMgaW4gY28tcm91dGluZXMgbXVzdCBiZSBkZWNsYXJlZCBzdGF0aWMgaWYgdGhleSBtdXN0IG1haW50YWluIHZhbHVlIGFjcm9zcyBhIGJsb2NraW5nIGNhbGwuCisgc3RhdGljIGludDMyX3QgdWxBVmFyaWFibGU7CisKKyAgICAgLy8gTXVzdCBzdGFydCBldmVyeSBjby1yb3V0aW5lIHdpdGggYSBjYWxsIHRvIGNyU1RBUlQoKTsKKyAgICAgY3JTVEFSVCggeEhhbmRsZSApOworCisgICAgIGZvciggOzsgKQorICAgICB7CisgICAgICAgICAgLy8gQ28tcm91dGluZSBmdW5jdGlvbmFsaXR5IGdvZXMgaGVyZS4KKyAgICAgfQorCisgICAgIC8vIE11c3QgZW5kIGV2ZXJ5IGNvLXJvdXRpbmUgd2l0aCBhIGNhbGwgdG8gY3JFTkQoKTsKKyAgICAgY3JFTkQoKTsKKyB9PC9wcmU+CisgKiBcZGVmZ3JvdXAgY3JTVEFSVCBjclNUQVJUCisgKiBcaW5ncm91cCBUYXNrcworICovCisjZGVmaW5lIGNyU1RBUlQoIHB4Q1JDQiApIHN3aXRjaCggKCAoIENSQ0JfdCAqICkoIHB4Q1JDQiApICktPnV4U3RhdGUgKSB7IGNhc2UgMDoKKworLyoqCisgKiBjcm91dGluZS4gaAorICogPHByZT4KKyBjckVORCgpOzwvcHJlPgorICoKKyAqIFRoaXMgbWFjcm8gTVVTVCBhbHdheXMgYmUgY2FsbGVkIGF0IHRoZSBlbmQgb2YgYSBjby1yb3V0aW5lIGZ1bmN0aW9uLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIC8vIENvLXJvdXRpbmUgdG8gYmUgY3JlYXRlZC4KKyB2b2lkIHZBQ29Sb3V0aW5lKCBDb1JvdXRpbmVIYW5kbGVfdCB4SGFuZGxlLCBVQmFzZVR5cGVfdCB1eEluZGV4ICkKKyB7CisgLy8gVmFyaWFibGVzIGluIGNvLXJvdXRpbmVzIG11c3QgYmUgZGVjbGFyZWQgc3RhdGljIGlmIHRoZXkgbXVzdCBtYWludGFpbiB2YWx1ZSBhY3Jvc3MgYSBibG9ja2luZyBjYWxsLgorIHN0YXRpYyBpbnQzMl90IHVsQVZhcmlhYmxlOworCisgICAgIC8vIE11c3Qgc3RhcnQgZXZlcnkgY28tcm91dGluZSB3aXRoIGEgY2FsbCB0byBjclNUQVJUKCk7CisgICAgIGNyU1RBUlQoIHhIYW5kbGUgKTsKKworICAgICBmb3IoIDs7ICkKKyAgICAgeworICAgICAgICAgIC8vIENvLXJvdXRpbmUgZnVuY3Rpb25hbGl0eSBnb2VzIGhlcmUuCisgICAgIH0KKworICAgICAvLyBNdXN0IGVuZCBldmVyeSBjby1yb3V0aW5lIHdpdGggYSBjYWxsIHRvIGNyRU5EKCk7CisgICAgIGNyRU5EKCk7CisgfTwvcHJlPgorICogXGRlZmdyb3VwIGNyU1RBUlQgY3JTVEFSVAorICogXGluZ3JvdXAgVGFza3MKKyAqLworI2RlZmluZSBjckVORCgpIH0KKworLyoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBieSB0aGUgY28tcm91dGluZSBpbXBsZW1lbnRhdGlvbgorICogb25seS4gIFRoZSBtYWNyb3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IGFwcGxpY2F0aW9uIHdyaXRlcnMuCisgKi8KKyNkZWZpbmUgY3JTRVRfU1RBVEUwKCB4SGFuZGxlICkgKCAoIENSQ0JfdCAqICkoIHhIYW5kbGUgKSApLT51eFN0YXRlID0gKF9fTElORV9fICogMik7IHJldHVybjsgY2FzZSAoX19MSU5FX18gKiAyKToKKyNkZWZpbmUgY3JTRVRfU1RBVEUxKCB4SGFuZGxlICkgKCAoIENSQ0JfdCAqICkoIHhIYW5kbGUgKSApLT51eFN0YXRlID0gKChfX0xJTkVfXyAqIDIpKzEpOyByZXR1cm47IGNhc2UgKChfX0xJTkVfXyAqIDIpKzEpOgorCisvKioKKyAqIGNyb3V0aW5lLiBoCisgKjxwcmU+CisgY3JERUxBWSggQ29Sb3V0aW5lSGFuZGxlX3QgeEhhbmRsZSwgVGlja1R5cGVfdCB4VGlja3NUb0RlbGF5ICk7PC9wcmU+CisgKgorICogRGVsYXkgYSBjby1yb3V0aW5lIGZvciBhIGZpeGVkIHBlcmlvZCBvZiB0aW1lLgorICoKKyAqIGNyREVMQVkgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGNvLXJvdXRpbmUgZnVuY3Rpb24gaXRzZWxmIC0gbm90CisgKiBmcm9tIHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgY28tcm91dGluZSBmdW5jdGlvbi4gIFRoaXMgaXMgYmVjYXVzZQorICogY28tcm91dGluZXMgZG8gbm90IG1haW50YWluIHRoZWlyIG93biBzdGFjay4KKyAqCisgKiBAcGFyYW0geEhhbmRsZSBUaGUgaGFuZGxlIG9mIHRoZSBjby1yb3V0aW5lIHRvIGRlbGF5LiAgVGhpcyBpcyB0aGUgeEhhbmRsZQorICogcGFyYW1ldGVyIG9mIHRoZSBjby1yb3V0aW5lIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB4VGlja1RvRGVsYXkgVGhlIG51bWJlciBvZiB0aWNrcyB0aGF0IHRoZSBjby1yb3V0aW5lIHNob3VsZCBkZWxheQorICogZm9yLiAgVGhlIGFjdHVhbCBhbW91bnQgb2YgdGltZSB0aGlzIGVxdWF0ZXMgdG8gaXMgZGVmaW5lZCBieQorICogY29uZmlnVElDS19SQVRFX0haIChzZXQgaW4gRnJlZVJUT1NDb25maWcuaCkuICBUaGUgY29uc3RhbnQgcG9ydFRJQ0tfUEVSSU9EX01TCisgKiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IHRpY2tzIHRvIG1pbGxpc2Vjb25kcy4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKyAvLyBDby1yb3V0aW5lIHRvIGJlIGNyZWF0ZWQuCisgdm9pZCB2QUNvUm91dGluZSggQ29Sb3V0aW5lSGFuZGxlX3QgeEhhbmRsZSwgVUJhc2VUeXBlX3QgdXhJbmRleCApCisgeworIC8vIFZhcmlhYmxlcyBpbiBjby1yb3V0aW5lcyBtdXN0IGJlIGRlY2xhcmVkIHN0YXRpYyBpZiB0aGV5IG11c3QgbWFpbnRhaW4gdmFsdWUgYWNyb3NzIGEgYmxvY2tpbmcgY2FsbC4KKyAvLyBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5IGZvciBjb25zdCB2YXJpYWJsZXMuCisgLy8gV2UgYXJlIHRvIGRlbGF5IGZvciAyMDBtcy4KKyBzdGF0aWMgY29uc3QgeFRpY2tUeXBlIHhEZWxheVRpbWUgPSAyMDAgLyBwb3J0VElDS19QRVJJT0RfTVM7CisKKyAgICAgLy8gTXVzdCBzdGFydCBldmVyeSBjby1yb3V0aW5lIHdpdGggYSBjYWxsIHRvIGNyU1RBUlQoKTsKKyAgICAgY3JTVEFSVCggeEhhbmRsZSApOworCisgICAgIGZvciggOzsgKQorICAgICB7CisgICAgICAgIC8vIERlbGF5IGZvciAyMDBtcy4KKyAgICAgICAgY3JERUxBWSggeEhhbmRsZSwgeERlbGF5VGltZSApOworCisgICAgICAgIC8vIERvIHNvbWV0aGluZyBoZXJlLgorICAgICB9CisKKyAgICAgLy8gTXVzdCBlbmQgZXZlcnkgY28tcm91dGluZSB3aXRoIGEgY2FsbCB0byBjckVORCgpOworICAgICBjckVORCgpOworIH08L3ByZT4KKyAqIFxkZWZncm91cCBjckRFTEFZIGNyREVMQVkKKyAqIFxpbmdyb3VwIFRhc2tzCisgKi8KKyNkZWZpbmUgY3JERUxBWSggeEhhbmRsZSwgeFRpY2tzVG9EZWxheSApCQkJCQkJCQkJCQkJXAorCWlmKCAoIHhUaWNrc1RvRGVsYXkgKSA+IDAgKQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQl2Q29Sb3V0aW5lQWRkVG9EZWxheWVkTGlzdCggKCB4VGlja3NUb0RlbGF5ICksIE5VTEwgKTsJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJY3JTRVRfU1RBVEUwKCAoIHhIYW5kbGUgKSApOworCisvKioKKyAqIDxwcmU+CisgY3JRVUVVRV9TRU5EKAorICAgICAgICAgICAgICAgICAgQ29Sb3V0aW5lSGFuZGxlX3QgeEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgIFF1ZXVlSGFuZGxlX3QgcHhRdWV1ZSwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKnB2SXRlbVRvUXVldWUsCisgICAgICAgICAgICAgICAgICBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCwKKyAgICAgICAgICAgICAgICAgIEJhc2VUeXBlX3QgKnB4UmVzdWx0CisgICAgICAgICAgICAgKTwvcHJlPgorICoKKyAqIFRoZSBtYWNybydzIGNyUVVFVUVfU0VORCgpIGFuZCBjclFVRVVFX1JFQ0VJVkUoKSBhcmUgdGhlIGNvLXJvdXRpbmUKKyAqIGVxdWl2YWxlbnQgdG8gdGhlIHhRdWV1ZVNlbmQoKSBhbmQgeFF1ZXVlUmVjZWl2ZSgpIGZ1bmN0aW9ucyB1c2VkIGJ5IHRhc2tzLgorICoKKyAqIGNyUVVFVUVfU0VORCBhbmQgY3JRVUVVRV9SRUNFSVZFIGNhbiBvbmx5IGJlIHVzZWQgZnJvbSBhIGNvLXJvdXRpbmUgd2hlcmVhcworICogeFF1ZXVlU2VuZCgpIGFuZCB4UXVldWVSZWNlaXZlKCkgY2FuIG9ubHkgYmUgdXNlZCBmcm9tIHRhc2tzLgorICoKKyAqIGNyUVVFVUVfU0VORCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgY28tcm91dGluZSBmdW5jdGlvbiBpdHNlbGYgLSBub3QKKyAqIGZyb20gd2l0aGluIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBjby1yb3V0aW5lIGZ1bmN0aW9uLiAgVGhpcyBpcyBiZWNhdXNlCisgKiBjby1yb3V0aW5lcyBkbyBub3QgbWFpbnRhaW4gdGhlaXIgb3duIHN0YWNrLgorICoKKyAqIFNlZSB0aGUgY28tcm91dGluZSBzZWN0aW9uIG9mIHRoZSBXRUIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24KKyAqIHBhc3NpbmcgZGF0YSBiZXR3ZWVuIHRhc2tzIGFuZCBjby1yb3V0aW5lcyBhbmQgYmV0d2VlbiBJU1IncyBhbmQKKyAqIGNvLXJvdXRpbmVzLgorICoKKyAqIEBwYXJhbSB4SGFuZGxlIFRoZSBoYW5kbGUgb2YgdGhlIGNhbGxpbmcgY28tcm91dGluZS4gIFRoaXMgaXMgdGhlIHhIYW5kbGUKKyAqIHBhcmFtZXRlciBvZiB0aGUgY28tcm91dGluZSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gcHhRdWV1ZSBUaGUgaGFuZGxlIG9mIHRoZSBxdWV1ZSBvbiB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHBvc3RlZC4KKyAqIFRoZSBoYW5kbGUgaXMgb2J0YWluZWQgYXMgdGhlIHJldHVybiB2YWx1ZSB3aGVuIHRoZSBxdWV1ZSBpcyBjcmVhdGVkIHVzaW5nCisgKiB0aGUgeFF1ZXVlQ3JlYXRlKCkgQVBJIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBwdkl0ZW1Ub1F1ZXVlIEEgcG9pbnRlciB0byB0aGUgZGF0YSBiZWluZyBwb3N0ZWQgb250byB0aGUgcXVldWUuCisgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGVhY2ggcXVldWVkIGl0ZW0gaXMgc3BlY2lmaWVkIHdoZW4gdGhlIHF1ZXVlIGlzCisgKiBjcmVhdGVkLiAgVGhpcyBudW1iZXIgb2YgYnl0ZXMgaXMgY29waWVkIGZyb20gcHZJdGVtVG9RdWV1ZSBpbnRvIHRoZSBxdWV1ZQorICogaXRzZWxmLgorICoKKyAqIEBwYXJhbSB4VGlja1RvRGVsYXkgVGhlIG51bWJlciBvZiB0aWNrcyB0aGF0IHRoZSBjby1yb3V0aW5lIHNob3VsZCBibG9jaworICogdG8gd2FpdCBmb3Igc3BhY2UgdG8gYmVjb21lIGF2YWlsYWJsZSBvbiB0aGUgcXVldWUsIHNob3VsZCBzcGFjZSBub3QgYmUKKyAqIGF2YWlsYWJsZSBpbW1lZGlhdGVseS4gVGhlIGFjdHVhbCBhbW91bnQgb2YgdGltZSB0aGlzIGVxdWF0ZXMgdG8gaXMgZGVmaW5lZAorICogYnkgY29uZmlnVElDS19SQVRFX0haIChzZXQgaW4gRnJlZVJUT1NDb25maWcuaCkuICBUaGUgY29uc3RhbnQKKyAqIHBvcnRUSUNLX1BFUklPRF9NUyBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IHRpY2tzIHRvIG1pbGxpc2Vjb25kcyAoc2VlIGV4YW1wbGUKKyAqIGJlbG93KS4KKyAqCisgKiBAcGFyYW0gcHhSZXN1bHQgVGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgcHhSZXN1bHQgd2lsbCBiZSBzZXQgdG8gcGRQQVNTIGlmCisgKiBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcG9zdGVkIG9udG8gdGhlIHF1ZXVlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBzZXQgdG8gYW4KKyAqIGVycm9yIGRlZmluZWQgd2l0aGluIFByb2pEZWZzLmguCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+CisgLy8gQ28tcm91dGluZSBmdW5jdGlvbiB0aGF0IGJsb2NrcyBmb3IgYSBmaXhlZCBwZXJpb2QgdGhlbiBwb3N0cyBhIG51bWJlciBvbnRvCisgLy8gYSBxdWV1ZS4KKyBzdGF0aWMgdm9pZCBwcnZDb1JvdXRpbmVGbGFzaFRhc2soIENvUm91dGluZUhhbmRsZV90IHhIYW5kbGUsIFVCYXNlVHlwZV90IHV4SW5kZXggKQorIHsKKyAvLyBWYXJpYWJsZXMgaW4gY28tcm91dGluZXMgbXVzdCBiZSBkZWNsYXJlZCBzdGF0aWMgaWYgdGhleSBtdXN0IG1haW50YWluIHZhbHVlIGFjcm9zcyBhIGJsb2NraW5nIGNhbGwuCisgc3RhdGljIEJhc2VUeXBlX3QgeE51bWJlclRvUG9zdCA9IDA7Cisgc3RhdGljIEJhc2VUeXBlX3QgeFJlc3VsdDsKKworICAgIC8vIENvLXJvdXRpbmVzIG11c3QgYmVnaW4gd2l0aCBhIGNhbGwgdG8gY3JTVEFSVCgpLgorICAgIGNyU1RBUlQoIHhIYW5kbGUgKTsKKworICAgIGZvciggOzsgKQorICAgIHsKKyAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoZSBxdWV1ZSBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuCisgICAgICAgIGNyUVVFVUVfU0VORCggeEhhbmRsZSwgeENvUm91dGluZVF1ZXVlLCAmeE51bWJlclRvUG9zdCwgTk9fREVMQVksICZ4UmVzdWx0ICk7CisKKyAgICAgICAgaWYoIHhSZXN1bHQgIT0gcGRQQVNTICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIG1lc3NhZ2Ugd2FzIG5vdCBwb3N0ZWQhCisgICAgICAgIH0KKworICAgICAgICAvLyBJbmNyZW1lbnQgdGhlIG51bWJlciB0byBiZSBwb3N0ZWQgb250byB0aGUgcXVldWUuCisgICAgICAgIHhOdW1iZXJUb1Bvc3QrKzsKKworICAgICAgICAvLyBEZWxheSBmb3IgMTAwIHRpY2tzLgorICAgICAgICBjckRFTEFZKCB4SGFuZGxlLCAxMDAgKTsKKyAgICB9CisKKyAgICAvLyBDby1yb3V0aW5lcyBtdXN0IGVuZCB3aXRoIGEgY2FsbCB0byBjckVORCgpLgorICAgIGNyRU5EKCk7CisgfTwvcHJlPgorICogXGRlZmdyb3VwIGNyUVVFVUVfU0VORCBjclFVRVVFX1NFTkQKKyAqIFxpbmdyb3VwIFRhc2tzCisgKi8KKyNkZWZpbmUgY3JRVUVVRV9TRU5EKCB4SGFuZGxlLCBweFF1ZXVlLCBwdkl0ZW1Ub1F1ZXVlLCB4VGlja3NUb1dhaXQsIHB4UmVzdWx0ICkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkqKCBweFJlc3VsdCApID0geFF1ZXVlQ1JTZW5kKCAoIHB4UXVldWUpICwgKCBwdkl0ZW1Ub1F1ZXVlKSAsICggeFRpY2tzVG9XYWl0ICkgKTsJXAorCWlmKCAqKCBweFJlc3VsdCApID09IGVyclFVRVVFX0JMT0NLRUQgKQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQljclNFVF9TVEFURTAoICggeEhhbmRsZSApICk7CQkJCQkJCQkJCQkJCVwKKwkJKnB4UmVzdWx0ID0geFF1ZXVlQ1JTZW5kKCAoIHB4UXVldWUgKSwgKCBwdkl0ZW1Ub1F1ZXVlICksIDAgKTsJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCWlmKCAqcHhSZXN1bHQgPT0gZXJyUVVFVUVfWUlFTEQgKQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJY3JTRVRfU1RBVEUxKCAoIHhIYW5kbGUgKSApOwkJCQkJCQkJCQkJCQlcCisJCSpweFJlc3VsdCA9IHBkUEFTUzsJCQkJCQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQlcCit9CisKKy8qKgorICogY3JvdXRpbmUuIGgKKyAqIDxwcmU+CisgIGNyUVVFVUVfUkVDRUlWRSgKKyAgICAgICAgICAgICAgICAgICAgIENvUm91dGluZUhhbmRsZV90IHhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICBRdWV1ZUhhbmRsZV90IHB4UXVldWUsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICpwdkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0LAorICAgICAgICAgICAgICAgICAgICAgQmFzZVR5cGVfdCAqcHhSZXN1bHQKKyAgICAgICAgICAgICAgICAgKTwvcHJlPgorICoKKyAqIFRoZSBtYWNybydzIGNyUVVFVUVfU0VORCgpIGFuZCBjclFVRVVFX1JFQ0VJVkUoKSBhcmUgdGhlIGNvLXJvdXRpbmUKKyAqIGVxdWl2YWxlbnQgdG8gdGhlIHhRdWV1ZVNlbmQoKSBhbmQgeFF1ZXVlUmVjZWl2ZSgpIGZ1bmN0aW9ucyB1c2VkIGJ5IHRhc2tzLgorICoKKyAqIGNyUVVFVUVfU0VORCBhbmQgY3JRVUVVRV9SRUNFSVZFIGNhbiBvbmx5IGJlIHVzZWQgZnJvbSBhIGNvLXJvdXRpbmUgd2hlcmVhcworICogeFF1ZXVlU2VuZCgpIGFuZCB4UXVldWVSZWNlaXZlKCkgY2FuIG9ubHkgYmUgdXNlZCBmcm9tIHRhc2tzLgorICoKKyAqIGNyUVVFVUVfUkVDRUlWRSBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgY28tcm91dGluZSBmdW5jdGlvbiBpdHNlbGYgLSBub3QKKyAqIGZyb20gd2l0aGluIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBjby1yb3V0aW5lIGZ1bmN0aW9uLiAgVGhpcyBpcyBiZWNhdXNlCisgKiBjby1yb3V0aW5lcyBkbyBub3QgbWFpbnRhaW4gdGhlaXIgb3duIHN0YWNrLgorICoKKyAqIFNlZSB0aGUgY28tcm91dGluZSBzZWN0aW9uIG9mIHRoZSBXRUIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24KKyAqIHBhc3NpbmcgZGF0YSBiZXR3ZWVuIHRhc2tzIGFuZCBjby1yb3V0aW5lcyBhbmQgYmV0d2VlbiBJU1IncyBhbmQKKyAqIGNvLXJvdXRpbmVzLgorICoKKyAqIEBwYXJhbSB4SGFuZGxlIFRoZSBoYW5kbGUgb2YgdGhlIGNhbGxpbmcgY28tcm91dGluZS4gIFRoaXMgaXMgdGhlIHhIYW5kbGUKKyAqIHBhcmFtZXRlciBvZiB0aGUgY28tcm91dGluZSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gcHhRdWV1ZSBUaGUgaGFuZGxlIG9mIHRoZSBxdWV1ZSBmcm9tIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCisgKiBUaGUgaGFuZGxlIGlzIG9idGFpbmVkIGFzIHRoZSByZXR1cm4gdmFsdWUgd2hlbiB0aGUgcXVldWUgaXMgY3JlYXRlZCB1c2luZworICogdGhlIHhRdWV1ZUNyZWF0ZSgpIEFQSSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gcHZCdWZmZXIgVGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSByZWNlaXZlZCBpdGVtIGlzIHRvIGJlIGNvcGllZC4KKyAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZWFjaCBxdWV1ZWQgaXRlbSBpcyBzcGVjaWZpZWQgd2hlbiB0aGUgcXVldWUgaXMKKyAqIGNyZWF0ZWQuICBUaGlzIG51bWJlciBvZiBieXRlcyBpcyBjb3BpZWQgaW50byBwdkJ1ZmZlci4KKyAqCisgKiBAcGFyYW0geFRpY2tUb0RlbGF5IFRoZSBudW1iZXIgb2YgdGlja3MgdGhhdCB0aGUgY28tcm91dGluZSBzaG91bGQgYmxvY2sKKyAqIHRvIHdhaXQgZm9yIGRhdGEgdG8gYmVjb21lIGF2YWlsYWJsZSBmcm9tIHRoZSBxdWV1ZSwgc2hvdWxkIGRhdGEgbm90IGJlCisgKiBhdmFpbGFibGUgaW1tZWRpYXRlbHkuIFRoZSBhY3R1YWwgYW1vdW50IG9mIHRpbWUgdGhpcyBlcXVhdGVzIHRvIGlzIGRlZmluZWQKKyAqIGJ5IGNvbmZpZ1RJQ0tfUkFURV9IWiAoc2V0IGluIEZyZWVSVE9TQ29uZmlnLmgpLiAgVGhlIGNvbnN0YW50CisgKiBwb3J0VElDS19QRVJJT0RfTVMgY2FuIGJlIHVzZWQgdG8gY29udmVydCB0aWNrcyB0byBtaWxsaXNlY29uZHMgKHNlZSB0aGUKKyAqIGNyUVVFVUVfU0VORCBleGFtcGxlKS4KKyAqCisgKiBAcGFyYW0gcHhSZXN1bHQgVGhlIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgcHhSZXN1bHQgd2lsbCBiZSBzZXQgdG8gcGRQQVNTIGlmCisgKiBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmV0cmlldmVkIGZyb20gdGhlIHF1ZXVlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBzZXQgdG8KKyAqIGFuIGVycm9yIGNvZGUgYXMgZGVmaW5lZCB3aXRoaW4gUHJvakRlZnMuaC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorIDxwcmU+CisgLy8gQSBjby1yb3V0aW5lIHJlY2VpdmVzIHRoZSBudW1iZXIgb2YgYW4gTEVEIHRvIGZsYXNoIGZyb20gYSBxdWV1ZS4gIEl0CisgLy8gYmxvY2tzIG9uIHRoZSBxdWV1ZSB1bnRpbCB0aGUgbnVtYmVyIGlzIHJlY2VpdmVkLgorIHN0YXRpYyB2b2lkIHBydkNvUm91dGluZUZsYXNoV29ya1Rhc2soIENvUm91dGluZUhhbmRsZV90IHhIYW5kbGUsIFVCYXNlVHlwZV90IHV4SW5kZXggKQorIHsKKyAvLyBWYXJpYWJsZXMgaW4gY28tcm91dGluZXMgbXVzdCBiZSBkZWNsYXJlZCBzdGF0aWMgaWYgdGhleSBtdXN0IG1haW50YWluIHZhbHVlIGFjcm9zcyBhIGJsb2NraW5nIGNhbGwuCisgc3RhdGljIEJhc2VUeXBlX3QgeFJlc3VsdDsKKyBzdGF0aWMgVUJhc2VUeXBlX3QgdXhMRURUb0ZsYXNoOworCisgICAgLy8gQWxsIGNvLXJvdXRpbmVzIG11c3Qgc3RhcnQgd2l0aCBhIGNhbGwgdG8gY3JTVEFSVCgpLgorICAgIGNyU1RBUlQoIHhIYW5kbGUgKTsKKworICAgIGZvciggOzsgKQorICAgIHsKKyAgICAgICAgLy8gV2FpdCBmb3IgZGF0YSB0byBiZWNvbWUgYXZhaWxhYmxlIG9uIHRoZSBxdWV1ZS4KKyAgICAgICAgY3JRVUVVRV9SRUNFSVZFKCB4SGFuZGxlLCB4Q29Sb3V0aW5lUXVldWUsICZ1eExFRFRvRmxhc2gsIHBvcnRNQVhfREVMQVksICZ4UmVzdWx0ICk7CisKKyAgICAgICAgaWYoIHhSZXN1bHQgPT0gcGRQQVNTICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2UgcmVjZWl2ZWQgdGhlIExFRCB0byBmbGFzaCAtIGZsYXNoIGl0IQorICAgICAgICAgICAgdlBhclRlc3RUb2dnbGVMRUQoIHV4TEVEVG9GbGFzaCApOworICAgICAgICB9CisgICAgfQorCisgICAgY3JFTkQoKTsKKyB9PC9wcmU+CisgKiBcZGVmZ3JvdXAgY3JRVUVVRV9SRUNFSVZFIGNyUVVFVUVfUkVDRUlWRQorICogXGluZ3JvdXAgVGFza3MKKyAqLworI2RlZmluZSBjclFVRVVFX1JFQ0VJVkUoIHhIYW5kbGUsIHB4UXVldWUsIHB2QnVmZmVyLCB4VGlja3NUb1dhaXQsIHB4UmVzdWx0ICkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkqKCBweFJlc3VsdCApID0geFF1ZXVlQ1JSZWNlaXZlKCAoIHB4UXVldWUpICwgKCBwdkJ1ZmZlciApLCAoIHhUaWNrc1RvV2FpdCApICk7CQlcCisJaWYoICooIHB4UmVzdWx0ICkgPT0gZXJyUVVFVUVfQkxPQ0tFRCApIAkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCWNyU0VUX1NUQVRFMCggKCB4SGFuZGxlICkgKTsJCQkJCQkJCQkJCQkJXAorCQkqKCBweFJlc3VsdCApID0geFF1ZXVlQ1JSZWNlaXZlKCAoIHB4UXVldWUpICwgKCBwdkJ1ZmZlciApLCAwICk7CQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCWlmKCAqKCBweFJlc3VsdCApID09IGVyclFVRVVFX1lJRUxEICkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJY3JTRVRfU1RBVEUxKCAoIHhIYW5kbGUgKSApOwkJCQkJCQkJCQkJCQlcCisJCSooIHB4UmVzdWx0ICkgPSBwZFBBU1M7CQkJCQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQlcCit9CisKKy8qKgorICogY3JvdXRpbmUuIGgKKyAqIDxwcmU+CisgIGNyUVVFVUVfU0VORF9GUk9NX0lTUigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUhhbmRsZV90IHB4UXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHZJdGVtVG9RdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVHlwZV90IHhDb1JvdXRpbmVQcmV2aW91c2x5V29rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgKTwvcHJlPgorICoKKyAqIFRoZSBtYWNybydzIGNyUVVFVUVfU0VORF9GUk9NX0lTUigpIGFuZCBjclFVRVVFX1JFQ0VJVkVfRlJPTV9JU1IoKSBhcmUgdGhlCisgKiBjby1yb3V0aW5lIGVxdWl2YWxlbnQgdG8gdGhlIHhRdWV1ZVNlbmRGcm9tSVNSKCkgYW5kIHhRdWV1ZVJlY2VpdmVGcm9tSVNSKCkKKyAqIGZ1bmN0aW9ucyB1c2VkIGJ5IHRhc2tzLgorICoKKyAqIGNyUVVFVUVfU0VORF9GUk9NX0lTUigpIGFuZCBjclFVRVVFX1JFQ0VJVkVfRlJPTV9JU1IoKSBjYW4gb25seSBiZSB1c2VkIHRvCisgKiBwYXNzIGRhdGEgYmV0d2VlbiBhIGNvLXJvdXRpbmUgYW5kIGFuZCBJU1IsIHdoZXJlYXMgeFF1ZXVlU2VuZEZyb21JU1IoKSBhbmQKKyAqIHhRdWV1ZVJlY2VpdmVGcm9tSVNSKCkgY2FuIG9ubHkgYmUgdXNlZCB0byBwYXNzIGRhdGEgYmV0d2VlbiBhIHRhc2sgYW5kIGFuZAorICogSVNSLgorICoKKyAqIGNyUVVFVUVfU0VORF9GUk9NX0lTUiBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBhbiBJU1IgdG8gc2VuZCBkYXRhIHRvIGEgcXVldWUKKyAqIHRoYXQgaXMgYmVpbmcgdXNlZCBmcm9tIHdpdGhpbiBhIGNvLXJvdXRpbmUuCisgKgorICogU2VlIHRoZSBjby1yb3V0aW5lIHNlY3Rpb24gb2YgdGhlIFdFQiBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbgorICogcGFzc2luZyBkYXRhIGJldHdlZW4gdGFza3MgYW5kIGNvLXJvdXRpbmVzIGFuZCBiZXR3ZWVuIElTUidzIGFuZAorICogY28tcm91dGluZXMuCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIHRvIHRoZSBxdWV1ZSBvbiB3aGljaCB0aGUgaXRlbSBpcyB0byBiZSBwb3N0ZWQuCisgKgorICogQHBhcmFtIHB2SXRlbVRvUXVldWUgQSBwb2ludGVyIHRvIHRoZSBpdGVtIHRoYXQgaXMgdG8gYmUgcGxhY2VkIG9uIHRoZQorICogcXVldWUuICBUaGUgc2l6ZSBvZiB0aGUgaXRlbXMgdGhlIHF1ZXVlIHdpbGwgaG9sZCB3YXMgZGVmaW5lZCB3aGVuIHRoZQorICogcXVldWUgd2FzIGNyZWF0ZWQsIHNvIHRoaXMgbWFueSBieXRlcyB3aWxsIGJlIGNvcGllZCBmcm9tIHB2SXRlbVRvUXVldWUKKyAqIGludG8gdGhlIHF1ZXVlIHN0b3JhZ2UgYXJlYS4KKyAqCisgKiBAcGFyYW0geENvUm91dGluZVByZXZpb3VzbHlXb2tlbiBUaGlzIGlzIGluY2x1ZGVkIHNvIGFuIElTUiBjYW4gcG9zdCBvbnRvCisgKiB0aGUgc2FtZSBxdWV1ZSBtdWx0aXBsZSB0aW1lcyBmcm9tIGEgc2luZ2xlIGludGVycnVwdC4gIFRoZSBmaXJzdCBjYWxsCisgKiBzaG91bGQgYWx3YXlzIHBhc3MgaW4gcGRGQUxTRS4gIFN1YnNlcXVlbnQgY2FsbHMgc2hvdWxkIHBhc3MgaW4KKyAqIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBwcmV2aW91cyBjYWxsLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIGEgY28tcm91dGluZSB3YXMgd29rZW4gYnkgcG9zdGluZyBvbnRvIHRoZSBxdWV1ZS4gIFRoaXMgaXMKKyAqIHVzZWQgYnkgdGhlIElTUiB0byBkZXRlcm1pbmUgaWYgYSBjb250ZXh0IHN3aXRjaCBtYXkgYmUgcmVxdWlyZWQgZm9sbG93aW5nCisgKiB0aGUgSVNSLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgPHByZT4KKyAvLyBBIGNvLXJvdXRpbmUgdGhhdCBibG9ja3Mgb24gYSBxdWV1ZSB3YWl0aW5nIGZvciBjaGFyYWN0ZXJzIHRvIGJlIHJlY2VpdmVkLgorIHN0YXRpYyB2b2lkIHZSZWNlaXZpbmdDb1JvdXRpbmUoIENvUm91dGluZUhhbmRsZV90IHhIYW5kbGUsIFVCYXNlVHlwZV90IHV4SW5kZXggKQorIHsKKyBjaGFyIGNSeGVkQ2hhcjsKKyBCYXNlVHlwZV90IHhSZXN1bHQ7CisKKyAgICAgLy8gQWxsIGNvLXJvdXRpbmVzIG11c3Qgc3RhcnQgd2l0aCBhIGNhbGwgdG8gY3JTVEFSVCgpLgorICAgICBjclNUQVJUKCB4SGFuZGxlICk7CisKKyAgICAgZm9yKCA7OyApCisgICAgIHsKKyAgICAgICAgIC8vIFdhaXQgZm9yIGRhdGEgdG8gYmVjb21lIGF2YWlsYWJsZSBvbiB0aGUgcXVldWUuICBUaGlzIGFzc3VtZXMgdGhlCisgICAgICAgICAvLyBxdWV1ZSB4Q29tbXNSeFF1ZXVlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCEKKyAgICAgICAgIGNyUVVFVUVfUkVDRUlWRSggeEhhbmRsZSwgeENvbW1zUnhRdWV1ZSwgJnV4TEVEVG9GbGFzaCwgcG9ydE1BWF9ERUxBWSwgJnhSZXN1bHQgKTsKKworICAgICAgICAgLy8gV2FzIGEgY2hhcmFjdGVyIHJlY2VpdmVkPworICAgICAgICAgaWYoIHhSZXN1bHQgPT0gcGRQQVNTICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBjaGFyYWN0ZXIgaGVyZS4KKyAgICAgICAgIH0KKyAgICAgfQorCisgICAgIC8vIEFsbCBjby1yb3V0aW5lcyBtdXN0IGVuZCB3aXRoIGEgY2FsbCB0byBjckVORCgpLgorICAgICBjckVORCgpOworIH0KKworIC8vIEFuIElTUiB0aGF0IHVzZXMgYSBxdWV1ZSB0byBzZW5kIGNoYXJhY3RlcnMgcmVjZWl2ZWQgb24gYSBzZXJpYWwgcG9ydCB0bworIC8vIGEgY28tcm91dGluZS4KKyB2b2lkIHZVQVJUX0lTUiggdm9pZCApCisgeworIGNoYXIgY1J4ZWRDaGFyOworIEJhc2VUeXBlX3QgeENSV29rZW5CeVBvc3QgPSBwZEZBTFNFOworCisgICAgIC8vIFdlIGxvb3AgYXJvdW5kIHJlYWRpbmcgY2hhcmFjdGVycyB1bnRpbCB0aGVyZSBhcmUgbm9uZSBsZWZ0IGluIHRoZSBVQVJULgorICAgICB3aGlsZSggVUFSVF9SWF9SRUdfTk9UX0VNUFRZKCkgKQorICAgICB7CisgICAgICAgICAvLyBPYnRhaW4gdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBVQVJULgorICAgICAgICAgY1J4ZWRDaGFyID0gVUFSVF9SWF9SRUc7CisKKyAgICAgICAgIC8vIFBvc3QgdGhlIGNoYXJhY3RlciBvbnRvIGEgcXVldWUuICB4Q1JXb2tlbkJ5UG9zdCB3aWxsIGJlIHBkRkFMU0UKKyAgICAgICAgIC8vIHRoZSBmaXJzdCB0aW1lIGFyb3VuZCB0aGUgbG9vcC4gIElmIHRoZSBwb3N0IGNhdXNlcyBhIGNvLXJvdXRpbmUKKyAgICAgICAgIC8vIHRvIGJlIHdva2VuICh1bmJsb2NrZWQpIHRoZW4geENSV29rZW5CeVBvc3Qgd2lsbCBiZSBzZXQgdG8gcGRUUlVFLgorICAgICAgICAgLy8gSW4gdGhpcyBtYW5uZXIgd2UgY2FuIGVuc3VyZSB0aGF0IGlmIG1vcmUgdGhhbiBvbmUgY28tcm91dGluZSBpcworICAgICAgICAgLy8gYmxvY2tlZCBvbiB0aGUgcXVldWUgb25seSBvbmUgaXMgd29rZW4gYnkgdGhpcyBJU1Igbm8gbWF0dGVyIGhvdworICAgICAgICAgLy8gbWFueSBjaGFyYWN0ZXJzIGFyZSBwb3N0ZWQgdG8gdGhlIHF1ZXVlLgorICAgICAgICAgeENSV29rZW5CeVBvc3QgPSBjclFVRVVFX1NFTkRfRlJPTV9JU1IoIHhDb21tc1J4UXVldWUsICZjUnhlZENoYXIsIHhDUldva2VuQnlQb3N0ICk7CisgICAgIH0KKyB9PC9wcmU+CisgKiBcZGVmZ3JvdXAgY3JRVUVVRV9TRU5EX0ZST01fSVNSIGNyUVVFVUVfU0VORF9GUk9NX0lTUgorICogXGluZ3JvdXAgVGFza3MKKyAqLworI2RlZmluZSBjclFVRVVFX1NFTkRfRlJPTV9JU1IoIHB4UXVldWUsIHB2SXRlbVRvUXVldWUsIHhDb1JvdXRpbmVQcmV2aW91c2x5V29rZW4gKSB4UXVldWVDUlNlbmRGcm9tSVNSKCAoIHB4UXVldWUgKSwgKCBwdkl0ZW1Ub1F1ZXVlICksICggeENvUm91dGluZVByZXZpb3VzbHlXb2tlbiApICkKKworCisvKioKKyAqIGNyb3V0aW5lLiBoCisgKiA8cHJlPgorICBjclFVRVVFX1NFTkRfRlJPTV9JU1IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVIYW5kbGVfdCBweFF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB2QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VUeXBlX3QgKiBweENvUm91dGluZVdva2VuCisgICAgICAgICAgICAgICAgICAgICAgICk8L3ByZT4KKyAqCisgKiBUaGUgbWFjcm8ncyBjclFVRVVFX1NFTkRfRlJPTV9JU1IoKSBhbmQgY3JRVUVVRV9SRUNFSVZFX0ZST01fSVNSKCkgYXJlIHRoZQorICogY28tcm91dGluZSBlcXVpdmFsZW50IHRvIHRoZSB4UXVldWVTZW5kRnJvbUlTUigpIGFuZCB4UXVldWVSZWNlaXZlRnJvbUlTUigpCisgKiBmdW5jdGlvbnMgdXNlZCBieSB0YXNrcy4KKyAqCisgKiBjclFVRVVFX1NFTkRfRlJPTV9JU1IoKSBhbmQgY3JRVUVVRV9SRUNFSVZFX0ZST01fSVNSKCkgY2FuIG9ubHkgYmUgdXNlZCB0bworICogcGFzcyBkYXRhIGJldHdlZW4gYSBjby1yb3V0aW5lIGFuZCBhbmQgSVNSLCB3aGVyZWFzIHhRdWV1ZVNlbmRGcm9tSVNSKCkgYW5kCisgKiB4UXVldWVSZWNlaXZlRnJvbUlTUigpIGNhbiBvbmx5IGJlIHVzZWQgdG8gcGFzcyBkYXRhIGJldHdlZW4gYSB0YXNrIGFuZCBhbmQKKyAqIElTUi4KKyAqCisgKiBjclFVRVVFX1JFQ0VJVkVfRlJPTV9JU1IgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gYW4gSVNSIHRvIHJlY2VpdmUgZGF0YQorICogZnJvbSBhIHF1ZXVlIHRoYXQgaXMgYmVpbmcgdXNlZCBmcm9tIHdpdGhpbiBhIGNvLXJvdXRpbmUgKGEgY28tcm91dGluZQorICogcG9zdGVkIHRvIHRoZSBxdWV1ZSkuCisgKgorICogU2VlIHRoZSBjby1yb3V0aW5lIHNlY3Rpb24gb2YgdGhlIFdFQiBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbgorICogcGFzc2luZyBkYXRhIGJldHdlZW4gdGFza3MgYW5kIGNvLXJvdXRpbmVzIGFuZCBiZXR3ZWVuIElTUidzIGFuZAorICogY28tcm91dGluZXMuCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIHRvIHRoZSBxdWV1ZSBvbiB3aGljaCB0aGUgaXRlbSBpcyB0byBiZSBwb3N0ZWQuCisgKgorICogQHBhcmFtIHB2QnVmZmVyIEEgcG9pbnRlciB0byBhIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSByZWNlaXZlZCBpdGVtIHdpbGwgYmUKKyAqIHBsYWNlZC4gIFRoZSBzaXplIG9mIHRoZSBpdGVtcyB0aGUgcXVldWUgd2lsbCBob2xkIHdhcyBkZWZpbmVkIHdoZW4gdGhlCisgKiBxdWV1ZSB3YXMgY3JlYXRlZCwgc28gdGhpcyBtYW55IGJ5dGVzIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIHF1ZXVlIGludG8KKyAqIHB2QnVmZmVyLgorICoKKyAqIEBwYXJhbSBweENvUm91dGluZVdva2VuIEEgY28tcm91dGluZSBtYXkgYmUgYmxvY2tlZCB3YWl0aW5nIGZvciBzcGFjZSB0byBiZWNvbWUKKyAqIGF2YWlsYWJsZSBvbiB0aGUgcXVldWUuICBJZiBjclFVRVVFX1JFQ0VJVkVfRlJPTV9JU1IgY2F1c2VzIHN1Y2ggYQorICogY28tcm91dGluZSB0byB1bmJsb2NrICpweENvUm91dGluZVdva2VuIHdpbGwgZ2V0IHNldCB0byBwZFRSVUUsIG90aGVyd2lzZQorICogKnB4Q29Sb3V0aW5lV29rZW4gd2lsbCByZW1haW4gdW5jaGFuZ2VkLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGFuIGl0ZW0gd2FzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBmcm9tIHRoZSBxdWV1ZSwgb3RoZXJ3aXNlCisgKiBwZEZBTFNFLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgPHByZT4KKyAvLyBBIGNvLXJvdXRpbmUgdGhhdCBwb3N0cyBhIGNoYXJhY3RlciB0byBhIHF1ZXVlIHRoZW4gYmxvY2tzIGZvciBhIGZpeGVkCisgLy8gcGVyaW9kLiAgVGhlIGNoYXJhY3RlciBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUuCisgc3RhdGljIHZvaWQgdlNlbmRpbmdDb1JvdXRpbmUoIENvUm91dGluZUhhbmRsZV90IHhIYW5kbGUsIFVCYXNlVHlwZV90IHV4SW5kZXggKQorIHsKKyAvLyBjQ2hhciBob2xkcyBpdHMgdmFsdWUgd2hpbGUgdGhpcyBjby1yb3V0aW5lIGlzIGJsb2NrZWQgYW5kIG11c3QgdGhlcmVmb3JlCisgLy8gYmUgZGVjbGFyZWQgc3RhdGljLgorIHN0YXRpYyBjaGFyIGNDaGFyVG9UeCA9ICdhJzsKKyBCYXNlVHlwZV90IHhSZXN1bHQ7CisKKyAgICAgLy8gQWxsIGNvLXJvdXRpbmVzIG11c3Qgc3RhcnQgd2l0aCBhIGNhbGwgdG8gY3JTVEFSVCgpLgorICAgICBjclNUQVJUKCB4SGFuZGxlICk7CisKKyAgICAgZm9yKCA7OyApCisgICAgIHsKKyAgICAgICAgIC8vIFNlbmQgdGhlIG5leHQgY2hhcmFjdGVyIHRvIHRoZSBxdWV1ZS4KKyAgICAgICAgIGNyUVVFVUVfU0VORCggeEhhbmRsZSwgeENvUm91dGluZVF1ZXVlLCAmY0NoYXJUb1R4LCBOT19ERUxBWSwgJnhSZXN1bHQgKTsKKworICAgICAgICAgaWYoIHhSZXN1bHQgPT0gcGRQQVNTICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIHdhcyBzdWNjZXNzZnVsbHkgcG9zdGVkIHRvIHRoZSBxdWV1ZS4KKyAgICAgICAgIH0KKwkJIGVsc2UKKwkJIHsKKwkJCS8vIENvdWxkIG5vdCBwb3N0IHRoZSBjaGFyYWN0ZXIgdG8gdGhlIHF1ZXVlLgorCQkgfQorCisgICAgICAgICAvLyBFbmFibGUgdGhlIFVBUlQgVHggaW50ZXJydXB0IHRvIGNhdXNlIGFuIGludGVycnVwdCBpbiB0aGlzCisJCSAvLyBoeXBvdGhldGljYWwgVUFSVC4gIFRoZSBpbnRlcnJ1cHQgd2lsbCBvYnRhaW4gdGhlIGNoYXJhY3RlcgorCQkgLy8gZnJvbSB0aGUgcXVldWUgYW5kIHNlbmQgaXQuCisJCSBFTkFCTEVfUlhfSU5URVJSVVBUKCk7CisKKwkJIC8vIEluY3JlbWVudCB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgdGhlbiBibG9jayBmb3IgYSBmaXhlZCBwZXJpb2QuCisJCSAvLyBjQ2hhclRvVHggd2lsbCBtYWludGFpbiBpdHMgdmFsdWUgYWNyb3NzIHRoZSBkZWxheSBhcyBpdCBpcworCQkgLy8gZGVjbGFyZWQgc3RhdGljLgorCQkgY0NoYXJUb1R4Kys7CisJCSBpZiggY0NoYXJUb1R4ID4gJ3gnICkKKwkJIHsKKwkJCWNDaGFyVG9UeCA9ICdhJzsKKwkJIH0KKwkJIGNyREVMQVkoIDEwMCApOworICAgICB9CisKKyAgICAgLy8gQWxsIGNvLXJvdXRpbmVzIG11c3QgZW5kIHdpdGggYSBjYWxsIHRvIGNyRU5EKCkuCisgICAgIGNyRU5EKCk7CisgfQorCisgLy8gQW4gSVNSIHRoYXQgdXNlcyBhIHF1ZXVlIHRvIHJlY2VpdmUgY2hhcmFjdGVycyB0byBzZW5kIG9uIGEgVUFSVC4KKyB2b2lkIHZVQVJUX0lTUiggdm9pZCApCisgeworIGNoYXIgY0NoYXJUb1R4OworIEJhc2VUeXBlX3QgeENSV29rZW5CeVBvc3QgPSBwZEZBTFNFOworCisgICAgIHdoaWxlKCBVQVJUX1RYX1JFR19FTVBUWSgpICkKKyAgICAgeworICAgICAgICAgLy8gQXJlIHRoZXJlIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBxdWV1ZSB3YWl0aW5nIHRvIGJlIHNlbnQ/CisJCSAvLyB4Q1JXb2tlbkJ5UG9zdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc2V0IHRvIHBkVFJVRSBpZiBhIGNvLXJvdXRpbmUKKwkJIC8vIGlzIHdva2VuIGJ5IHRoZSBwb3N0IC0gZW5zdXJpbmcgdGhhdCBvbmx5IGEgc2luZ2xlIGNvLXJvdXRpbmUgaXMKKwkJIC8vIHdva2VuIG5vIG1hdHRlciBob3cgbWFueSB0aW1lcyB3ZSBnbyBhcm91bmQgdGhpcyBsb29wLgorICAgICAgICAgaWYoIGNyUVVFVUVfUkVDRUlWRV9GUk9NX0lTUiggcHhRdWV1ZSwgJmNDaGFyVG9UeCwgJnhDUldva2VuQnlQb3N0ICkgKQorCQkgeworCQkJIFNFTkRfQ0hBUkFDVEVSKCBjQ2hhclRvVHggKTsKKwkJIH0KKyAgICAgfQorIH08L3ByZT4KKyAqIFxkZWZncm91cCBjclFVRVVFX1JFQ0VJVkVfRlJPTV9JU1IgY3JRVUVVRV9SRUNFSVZFX0ZST01fSVNSCisgKiBcaW5ncm91cCBUYXNrcworICovCisjZGVmaW5lIGNyUVVFVUVfUkVDRUlWRV9GUk9NX0lTUiggcHhRdWV1ZSwgcHZCdWZmZXIsIHB4Q29Sb3V0aW5lV29rZW4gKSB4UXVldWVDUlJlY2VpdmVGcm9tSVNSKCAoIHB4UXVldWUgKSwgKCBwdkJ1ZmZlciApLCAoIHB4Q29Sb3V0aW5lV29rZW4gKSApCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIGNvLXJvdXRpbmUgbWFjcm9zIG9ubHkuCisgKiBUaGUgbWFjcm8gbmF0dXJlIG9mIHRoZSBjby1yb3V0aW5lIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoYXQgdGhlCisgKiBwcm90b3R5cGUgYXBwZWFycyBoZXJlLiAgVGhlIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCBieSBhcHBsaWNhdGlvbgorICogd3JpdGVycy4KKyAqCisgKiBSZW1vdmVzIHRoZSBjdXJyZW50IGNvLXJvdXRpbmUgZnJvbSBpdHMgcmVhZHkgbGlzdCBhbmQgcGxhY2VzIGl0IGluIHRoZQorICogYXBwcm9wcmlhdGUgZGVsYXllZCBsaXN0LgorICovCit2b2lkIHZDb1JvdXRpbmVBZGRUb0RlbGF5ZWRMaXN0KCBUaWNrVHlwZV90IHhUaWNrc1RvRGVsYXksIExpc3RfdCAqcHhFdmVudExpc3QgKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBieSB0aGUgcXVldWUgaW1wbGVtZW50YXRpb24gb25seS4KKyAqIFRoZSBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgYnkgYXBwbGljYXRpb24gd3JpdGVycy4KKyAqCisgKiBSZW1vdmVzIHRoZSBoaWdoZXN0IHByaW9yaXR5IGNvLXJvdXRpbmUgZnJvbSB0aGUgZXZlbnQgbGlzdCBhbmQgcGxhY2VzIGl0IGluCisgKiB0aGUgcGVuZGluZyByZWFkeSBsaXN0LgorICovCitCYXNlVHlwZV90IHhDb1JvdXRpbmVSZW1vdmVGcm9tRXZlbnRMaXN0KCBjb25zdCBMaXN0X3QgKnB4RXZlbnRMaXN0ICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBDT19ST1VUSU5FX0ggKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL2RlcHJlY2F0ZWRfZGVmaW5pdGlvbnMuaCBiL1NvdXJjZS9pbmNsdWRlL2RlcHJlY2F0ZWRfZGVmaW5pdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTI1NjczCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL2luY2x1ZGUvZGVwcmVjYXRlZF9kZWZpbml0aW9ucy5oCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBERVBSRUNBVEVEX0RFRklOSVRJT05TX0gKKyNkZWZpbmUgREVQUkVDQVRFRF9ERUZJTklUSU9OU19ICisKKworLyogRWFjaCBGcmVlUlRPUyBwb3J0IGhhcyBhIHVuaXF1ZSBwb3J0bWFjcm8uaCBoZWFkZXIgZmlsZS4gIE9yaWdpbmFsbHkgYQorcHJlLXByb2Nlc3NvciBkZWZpbml0aW9uIHdhcyB1c2VkIHRvIGVuc3VyZSB0aGUgcHJlLXByb2Nlc3NvciBmb3VuZCB0aGUgY29ycmVjdAorcG9ydG1hY3JvLmggZmlsZSBmb3IgdGhlIHBvcnQgYmVpbmcgdXNlZC4gIFRoYXQgc2NoZW1lIHdhcyBkZXByZWNhdGVkIGluIGZhdm91cgorb2Ygc2V0dGluZyB0aGUgY29tcGlsZXIncyBpbmNsdWRlIHBhdGggc3VjaCB0aGF0IGl0IGZvdW5kIHRoZSBjb3JyZWN0Citwb3J0bWFjcm8uaCBmaWxlIC0gcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIHRoZSBjb25zdGFudCBhbmQgYWxsb3dpbmcgdGhlCitwb3J0bWFjcm8uaCBmaWxlIHRvIGJlIGxvY2F0ZWQgYW55d2hlcmUgaW4gcmVsYXRpb24gdG8gdGhlIHBvcnQgYmVpbmcgdXNlZC4gIFRoZQorZGVmaW5pdGlvbnMgYmVsb3cgcmVtYWluIGluIHRoZSBjb2RlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkuICBOZXcKK3Byb2plY3RzIHNob3VsZCBub3QgdXNlIHRoZW0uICovCisKKyNpZmRlZiBPUEVOX1dBVENPTV9JTkRVU1RSSUFMX1BDX1BPUlQKKwkjaW5jbHVkZSAiLi5cLi5cU291cmNlXHBvcnRhYmxlXG93YXRjb21cMTZiaXRkb3NccGNccG9ydG1hY3JvLmgiCisJdHlwZWRlZiB2b2lkICggX19pbnRlcnJ1cHQgX19mYXIgKnB4SVNSICkoKTsKKyNlbmRpZgorCisjaWZkZWYgT1BFTl9XQVRDT01fRkxBU0hfTElURV8xODZfUE9SVAorCSNpbmNsdWRlICIuLlwuLlxTb3VyY2VccG9ydGFibGVcb3dhdGNvbVwxNmJpdGRvc1xmbHNoMTg2XHBvcnRtYWNyby5oIgorCXR5cGVkZWYgdm9pZCAoIF9faW50ZXJydXB0IF9fZmFyICpweElTUiApKCk7CisjZW5kaWYKKworI2lmZGVmIEdDQ19NRUdBX0FWUgorCSNpbmNsdWRlICIuLi9wb3J0YWJsZS9HQ0MvQVRNZWdhMzIzL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBJQVJfTUVHQV9BVlIKKwkjaW5jbHVkZSAiLi4vcG9ydGFibGUvSUFSL0FUTWVnYTMyMy9wb3J0bWFjcm8uaCIKKyNlbmRpZgorCisjaWZkZWYgTVBMQUJfUElDMjRfUE9SVAorCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvTVBMQUIvUElDMjRfZHNQSUMvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIE1QTEFCX0RTUElDX1BPUlQKKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL01QTEFCL1BJQzI0X2RzUElDL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBNUExBQl9QSUMxOEZfUE9SVAorCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvTVBMQUIvUElDMThGL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBNUExBQl9QSUMzMk1YX1BPUlQKKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL01QTEFCL1BJQzMyTVgvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIF9GRURQSUNDCisJI2luY2x1ZGUgImxpYkZyZWVSVE9TL0luY2x1ZGUvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIFNEQ0NfQ1lHTkFMCisJI2luY2x1ZGUgIi4uLy4uL1NvdXJjZS9wb3J0YWJsZS9TRENDL0N5Z25hbC9wb3J0bWFjcm8uaCIKKyNlbmRpZgorCisjaWZkZWYgR0NDX0FSTTcKKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0dDQy9BUk03X0xQQzIwMDAvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIEdDQ19BUk03X0VDTElQU0UKKwkjaW5jbHVkZSAicG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIFJPV0xFWV9MUEMyM3h4CisJI2luY2x1ZGUgIi4uLy4uL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNN19MUEMyM3h4L3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBJQVJfTVNQNDMwCisJI2luY2x1ZGUgIi4uXC4uXFNvdXJjZVxwb3J0YWJsZVxJQVJcTVNQNDMwXHBvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBHQ0NfTVNQNDMwCisJI2luY2x1ZGUgIi4uLy4uL1NvdXJjZS9wb3J0YWJsZS9HQ0MvTVNQNDMwRjQ0OS9wb3J0bWFjcm8uaCIKKyNlbmRpZgorCisjaWZkZWYgUk9XTEVZX01TUDQzMAorCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvUm93bGV5L01TUDQzMEY0NDkvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIEFSTTdfTFBDMjF4eF9LRUlMX1JWRFMKKwkjaW5jbHVkZSAiLi5cLi5cU291cmNlXHBvcnRhYmxlXFJWRFNcQVJNN19MUEMyMXh4XHBvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBTQU03X0dDQworCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTTdfQVQ5MVNBTTdTL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBTQU03X0lBUgorCSNpbmNsdWRlICIuLlwuLlxTb3VyY2VccG9ydGFibGVcSUFSXEF0bWVsU0FNN1M2NFxwb3J0bWFjcm8uaCIKKyNlbmRpZgorCisjaWZkZWYgU0FNOVhFX0lBUgorCSNpbmNsdWRlICIuLlwuLlxTb3VyY2VccG9ydGFibGVcSUFSXEF0bWVsU0FNOVhFXHBvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBMUEMyMDAwX0lBUgorCSNpbmNsdWRlICIuLlwuLlxTb3VyY2VccG9ydGFibGVcSUFSXExQQzIwMDBccG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIFNUUjcxWF9JQVIKKwkjaW5jbHVkZSAiLi5cLi5cU291cmNlXHBvcnRhYmxlXElBUlxTVFI3MXhccG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIFNUUjc1WF9JQVIKKwkjaW5jbHVkZSAiLi5cLi5cU291cmNlXHBvcnRhYmxlXElBUlxTVFI3NXhccG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIFNUUjc1WF9HQ0MKKwkjaW5jbHVkZSAiLi5cLi5cU291cmNlXHBvcnRhYmxlXEdDQ1xTVFI3NXhccG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIFNUUjkxWF9JQVIKKwkjaW5jbHVkZSAiLi5cLi5cU291cmNlXHBvcnRhYmxlXElBUlxTVFI5MXhccG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIEdDQ19IOFMKKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0dDQy9IOFMyMzI5L3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBHQ0NfQVQ5MUZSNDAwMDgKKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0dDQy9BUk03X0FUOTFGUjQwMDA4L3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBSVkRTX0FSTUNNM19MTTNTMTAyCisJI2luY2x1ZGUgIi4uLy4uL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTMvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIEdDQ19BUk1DTTNfTE0zUzEwMgorCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIEdDQ19BUk1DTTMKKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBJQVJfQVJNX0NNMworCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIElBUl9BUk1DTTNfTE0KKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBIQ1MxMl9DT0RFX1dBUlJJT1IKKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0NvZGVXYXJyaW9yL0hDUzEyL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBNSUNST0JMQVpFX0dDQworCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvR0NDL01pY3JvQmxhemUvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIFRFUk5fRUUKKwkjaW5jbHVkZSAiLi5cLi5cU291cmNlXHBvcnRhYmxlXFBhcmFkaWdtXFRlcm5fRUVcc21hbGxccG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIEdDQ19IQ1MxMgorCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvR0NDL0hDUzEyL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBHQ0NfTUNGNTIzNQorICAgICNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvR0NDL01DRjUyMzUvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIENPTERGSVJFX1YyX0dDQworCSNpbmNsdWRlICIuLi8uLi8uLi9Tb3VyY2UvcG9ydGFibGUvR0NDL0NvbGRGaXJlX1YyL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBDT0xERklSRV9WMl9DT0RFV0FSUklPUgorCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvQ29kZVdhcnJpb3IvQ29sZEZpcmVfVjIvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIEdDQ19QUEM0MDUKKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0dDQy9QUEM0MDVfWGlsaW54L3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBHQ0NfUFBDNDQwCisJI2luY2x1ZGUgIi4uLy4uL1NvdXJjZS9wb3J0YWJsZS9HQ0MvUFBDNDQwX1hpbGlueC9wb3J0bWFjcm8uaCIKKyNlbmRpZgorCisjaWZkZWYgXzE2RlhfU09GVFVORQorCSNpbmNsdWRlICIuLlwuLlxTb3VyY2VccG9ydGFibGVcU29mdHVuZVxNQjk2MzQwXHBvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBCQ0NfSU5EVVNUUklBTF9QQ19QT1JUCisJLyogQSBzaG9ydCBmaWxlIG5hbWUgaGFzIHRvIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIG5vcm1hbAorCUZyZWVSVE9TQ29uZmlnLmggd2hlbiB1c2luZyB0aGUgQm9ybGFuZCBjb21waWxlci4gKi8KKwkjaW5jbHVkZSAiZnJjb25maWcuaCIKKwkjaW5jbHVkZSAiLi5ccG9ydGFibGVcQkNDXDE2Qml0RE9TXFBDXHBydG1hY3JvLmgiCisgICAgdHlwZWRlZiB2b2lkICggX19pbnRlcnJ1cHQgX19mYXIgKnB4SVNSICkoKTsKKyNlbmRpZgorCisjaWZkZWYgQkNDX0ZMQVNIX0xJVEVfMTg2X1BPUlQKKwkvKiBBIHNob3J0IGZpbGUgbmFtZSBoYXMgdG8gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgbm9ybWFsCisJRnJlZVJUT1NDb25maWcuaCB3aGVuIHVzaW5nIHRoZSBCb3JsYW5kIGNvbXBpbGVyLiAqLworCSNpbmNsdWRlICJmcmNvbmZpZy5oIgorCSNpbmNsdWRlICIuLlxwb3J0YWJsZVxCQ0NcMTZCaXRET1NcZmxzaDE4NlxwcnRtYWNyby5oIgorICAgIHR5cGVkZWYgdm9pZCAoIF9faW50ZXJydXB0IF9fZmFyICpweElTUiApKCk7CisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisgICAjaWZkZWYgX19BVlIzMl9BVlIzMkFfXworCSAgICNpbmNsdWRlICJwb3J0bWFjcm8uaCIKKyAgICNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0lDQ0FWUjMyX18KKyAgICNpZmRlZiBfX0NPUkVfXworICAgICAgI2lmIF9fQ09SRV9fID09IF9fQVZSMzJBX18KKwkgICAgICAjaW5jbHVkZSAicG9ydG1hY3JvLmgiCisgICAgICAjZW5kaWYKKyAgICNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfXzkxNDY3RAorCSNpbmNsdWRlICJwb3J0bWFjcm8uaCIKKyNlbmRpZgorCisjaWZkZWYgX185NjM0MAorCSNpbmNsdWRlICJwb3J0bWFjcm8uaCIKKyNlbmRpZgorCisKKyNpZmRlZiBfX0lBUl9WODUwRVNfRngzX18KKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0lBUi9WODUwRVMvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIF9fSUFSX1Y4NTBFU19KeDNfXworCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvSUFSL1Y4NTBFUy9wb3J0bWFjcm8uaCIKKyNlbmRpZgorCisjaWZkZWYgX19JQVJfVjg1MEVTX0p4M19MX18KKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0lBUi9WODUwRVMvcG9ydG1hY3JvLmgiCisjZW5kaWYKKworI2lmZGVmIF9fSUFSX1Y4NTBFU19KeDJfXworCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvSUFSL1Y4NTBFUy9wb3J0bWFjcm8uaCIKKyNlbmRpZgorCisjaWZkZWYgX19JQVJfVjg1MEVTX0h4Ml9fCisJI2luY2x1ZGUgIi4uLy4uL1NvdXJjZS9wb3J0YWJsZS9JQVIvVjg1MEVTL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBfX0lBUl83OEswUl9LeDNfXworCSNpbmNsdWRlICIuLi8uLi9Tb3VyY2UvcG9ydGFibGUvSUFSLzc4SzBSL3BvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZmRlZiBfX0lBUl83OEswUl9LeDNMX18KKwkjaW5jbHVkZSAiLi4vLi4vU291cmNlL3BvcnRhYmxlL0lBUi83OEswUi9wb3J0bWFjcm8uaCIKKyNlbmRpZgorCisjZW5kaWYgLyogREVQUkVDQVRFRF9ERUZJTklUSU9OU19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL2V2ZW50X2dyb3Vwcy5oIGIvU291cmNlL2luY2x1ZGUvZXZlbnRfZ3JvdXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllYzJlNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9pbmNsdWRlL2V2ZW50X2dyb3Vwcy5oCkBAIC0wLDAgKzEsNzU2IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBFVkVOVF9HUk9VUFNfSAorI2RlZmluZSBFVkVOVF9HUk9VUFNfSAorCisjaWZuZGVmIElOQ19GUkVFUlRPU19ICisJI2Vycm9yICJpbmNsdWRlIEZyZWVSVE9TLmgiIG11c3QgYXBwZWFyIGluIHNvdXJjZSBmaWxlcyBiZWZvcmUgImluY2x1ZGUgZXZlbnRfZ3JvdXBzLmgiCisjZW5kaWYKKworLyogRnJlZVJUT1MgaW5jbHVkZXMuICovCisjaW5jbHVkZSAidGltZXJzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBBbiBldmVudCBncm91cCBpcyBhIGNvbGxlY3Rpb24gb2YgYml0cyB0byB3aGljaCBhbiBhcHBsaWNhdGlvbiBjYW4gYXNzaWduIGEKKyAqIG1lYW5pbmcuICBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gbWF5IGNyZWF0ZSBhbiBldmVudCBncm91cCB0byBjb252ZXkKKyAqIHRoZSBzdGF0dXMgb2YgdmFyaW91cyBDQU4gYnVzIHJlbGF0ZWQgZXZlbnRzIGluIHdoaWNoIGJpdCAwIG1pZ2h0IG1lYW4gIkEgQ0FOCisgKiBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpcyByZWFkeSBmb3IgcHJvY2Vzc2luZyIsIGJpdCAxIG1pZ2h0IG1lYW4gIlRoZQorICogYXBwbGljYXRpb24gaGFzIHF1ZXVlZCBhIG1lc3NhZ2UgdGhhdCBpcyByZWFkeSBmb3Igc2VuZGluZyBvbnRvIHRoZSBDQU4KKyAqIG5ldHdvcmsiLCBhbmQgYml0IDIgbWlnaHQgbWVhbiAiSXQgaXMgdGltZSB0byBzZW5kIGEgU1lOQyBtZXNzYWdlIG9udG8gdGhlCisgKiBDQU4gbmV0d29yayIgZXRjLiAgQSB0YXNrIGNhbiB0aGVuIHRlc3QgdGhlIGJpdCB2YWx1ZXMgdG8gc2VlIHdoaWNoIGV2ZW50cworICogYXJlIGFjdGl2ZSwgYW5kIG9wdGlvbmFsbHkgZW50ZXIgdGhlIEJsb2NrZWQgc3RhdGUgdG8gd2FpdCBmb3IgYSBzcGVjaWZpZWQKKyAqIGJpdCBvciBhIGdyb3VwIG9mIHNwZWNpZmllZCBiaXRzIHRvIGJlIGFjdGl2ZS4gIFRvIGNvbnRpbnVlIHRoZSBDQU4gYnVzCisgKiBleGFtcGxlLCBhIENBTiBjb250cm9sbGluZyB0YXNrIGNhbiBlbnRlciB0aGUgQmxvY2tlZCBzdGF0ZSAoYW5kIHRoZXJlZm9yZQorICogbm90IGNvbnN1bWUgYW55IHByb2Nlc3NpbmcgdGltZSkgdW50aWwgZWl0aGVyIGJpdCAwLCBiaXQgMSBvciBiaXQgMiBhcmUKKyAqIGFjdGl2ZSwgYXQgd2hpY2ggdGltZSB0aGUgYml0IHRoYXQgd2FzIGFjdHVhbGx5IGFjdGl2ZSB3b3VsZCBpbmZvcm0gdGhlIHRhc2sKKyAqIHdoaWNoIGFjdGlvbiBpdCBoYWQgdG8gdGFrZSAocHJvY2VzcyBhIHJlY2VpdmVkIG1lc3NhZ2UsIHNlbmQgYSBtZXNzYWdlLCBvcgorICogc2VuZCBhIFNZTkMpLgorICoKKyAqIFRoZSBldmVudCBncm91cHMgaW1wbGVtZW50YXRpb24gY29udGFpbnMgaW50ZWxsaWdlbmNlIHRvIGF2b2lkIHJhY2UKKyAqIGNvbmRpdGlvbnMgdGhhdCB3b3VsZCBvdGhlcndpc2Ugb2NjdXIgd2VyZSBhbiBhcHBsaWNhdGlvbiB0byB1c2UgYSBzaW1wbGUKKyAqIHZhcmlhYmxlIGZvciB0aGUgc2FtZSBwdXJwb3NlLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHdpdGggcmVzcGVjdAorICogdG8gd2hlbiBhIGJpdCB3aXRoaW4gYW4gZXZlbnQgZ3JvdXAgaXMgdG8gYmUgY2xlYXJlZCwgYW5kIHdoZW4gYml0cyBoYXZlIHRvCisgKiBiZSBzZXQgYW5kIHRoZW4gdGVzdGVkIGF0b21pY2FsbHkgLSBhcyBpcyB0aGUgY2FzZSB3aGVyZSBldmVudCBncm91cHMgYXJlCisgKiB1c2VkIHRvIGNyZWF0ZSBhIHN5bmNocm9uaXNhdGlvbiBwb2ludCBiZXR3ZWVuIG11bHRpcGxlIHRhc2tzIChhCisgKiAncmVuZGV6dm91cycpLgorICoKKyAqIFxkZWZncm91cCBFdmVudEdyb3VwCisgKi8KKworCisKKy8qKgorICogZXZlbnRfZ3JvdXBzLmgKKyAqCisgKiBUeXBlIGJ5IHdoaWNoIGV2ZW50IGdyb3VwcyBhcmUgcmVmZXJlbmNlZC4gIEZvciBleGFtcGxlLCBhIGNhbGwgdG8KKyAqIHhFdmVudEdyb3VwQ3JlYXRlKCkgcmV0dXJucyBhbiBFdmVudEdyb3VwSGFuZGxlX3QgdmFyaWFibGUgdGhhdCBjYW4gdGhlbgorICogYmUgdXNlZCBhcyBhIHBhcmFtZXRlciB0byBvdGhlciBldmVudCBncm91cCBmdW5jdGlvbnMuCisgKgorICogXGRlZmdyb3VwIEV2ZW50R3JvdXBIYW5kbGVfdCBFdmVudEdyb3VwSGFuZGxlX3QKKyAqIFxpbmdyb3VwIEV2ZW50R3JvdXAKKyAqLwordHlwZWRlZiB2b2lkICogRXZlbnRHcm91cEhhbmRsZV90OworCisvKgorICogVGhlIHR5cGUgdGhhdCBob2xkcyBldmVudCBiaXRzIGFsd2F5cyBtYXRjaGVzIFRpY2tUeXBlX3QgLSB0aGVyZWZvcmUgdGhlCisgKiBudW1iZXIgb2YgYml0cyBpdCBob2xkcyBpcyBzZXQgYnkgY29uZmlnVVNFXzE2X0JJVF9USUNLUyAoMTYgYml0cyBpZiBzZXQgdG8gMSwKKyAqIDMyIGJpdHMgaWYgc2V0IHRvIDAuCisgKgorICogXGRlZmdyb3VwIEV2ZW50Qml0c190IEV2ZW50Qml0c190CisgKiBcaW5ncm91cCBFdmVudEdyb3VwCisgKi8KK3R5cGVkZWYgVGlja1R5cGVfdCBFdmVudEJpdHNfdDsKKworLyoqCisgKiBldmVudF9ncm91cHMuaAorICo8cHJlPgorIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cENyZWF0ZSggdm9pZCApOworIDwvcHJlPgorICoKKyAqIENyZWF0ZSBhIG5ldyBldmVudCBncm91cC4KKyAqCisgKiBJbnRlcm5hbGx5LCB3aXRoaW4gdGhlIEZyZWVSVE9TIGltcGxlbWVudGF0aW9uLCBldmVudCBncm91cHMgdXNlIGEgW3NtYWxsXQorICogYmxvY2sgb2YgbWVtb3J5LCBpbiB3aGljaCB0aGUgZXZlbnQgZ3JvdXAncyBzdHJ1Y3R1cmUgaXMgc3RvcmVkLiAgSWYgYW4gZXZlbnQKKyAqIGdyb3VwcyBpcyBjcmVhdGVkIHVzaW5nIHhFdmVudEdyb3B1Q3JlYXRlKCkgdGhlbiB0aGUgcmVxdWlyZWQgbWVtb3J5IGlzCisgKiBhdXRvbWF0aWNhbGx5IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpbnNpZGUgdGhlIHhFdmVudEdyb3VwQ3JlYXRlKCkgZnVuY3Rpb24uCisgKiAoc2VlIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExMS5odG1sKS4gIElmIGFuIGV2ZW50IGdyb3VwIGlzIGNyZWF0ZWQKKyAqIHVzaW5nIHhFdmVudEdyb3B1Q3JlYXRlU3RhdGljKCkgdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgaW5zdGVhZAorICogcHJvdmlkZSB0aGUgbWVtb3J5IHRoYXQgd2lsbCBnZXQgdXNlZCBieSB0aGUgZXZlbnQgZ3JvdXAuCisgKiB4RXZlbnRHcm91cENyZWF0ZVN0YXRpYygpIHRoZXJlZm9yZSBhbGxvd3MgYW4gZXZlbnQgZ3JvdXAgdG8gYmUgY3JlYXRlZAorICogd2l0aG91dCB1c2luZyBhbnkgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBBbHRob3VnaCBldmVudCBncm91cHMgYXJlIG5vdCByZWxhdGVkIHRvIHRpY2tzLCBmb3IgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24KKyAqIHJlYXNvbnMgdGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBmb3IgdXNlIGluIGFuIGV2ZW50IGdyb3VwIGlzIGRlcGVuZGVudAorICogb24gdGhlIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1Mgc2V0dGluZyBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgSWYKKyAqIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgaXMgMSB0aGVuIGVhY2ggZXZlbnQgZ3JvdXAgY29udGFpbnMgOCB1c2FibGUgYml0cyAoYml0CisgKiAwIHRvIGJpdCA3KS4gIElmIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgaXMgc2V0IHRvIDAgdGhlbiBlYWNoIGV2ZW50IGdyb3VwIGhhcworICogMjQgdXNhYmxlIGJpdHMgKGJpdCAwIHRvIGJpdCAyMykuICBUaGUgRXZlbnRCaXRzX3QgdHlwZSBpcyB1c2VkIHRvIHN0b3JlCisgKiBldmVudCBiaXRzIHdpdGhpbiBhbiBldmVudCBncm91cC4KKyAqCisgKiBAcmV0dXJuIElmIHRoZSBldmVudCBncm91cCB3YXMgY3JlYXRlZCB0aGVuIGEgaGFuZGxlIHRvIHRoZSBldmVudCBncm91cCBpcworICogcmV0dXJuZWQuICBJZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IEZyZWVSVE9TIGhlYXAgYXZhaWxhYmxlIHRvIGNyZWF0ZSB0aGUKKyAqIGV2ZW50IGdyb3VwIHRoZW4gTlVMTCBpcyByZXR1cm5lZC4gIFNlZSBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTEuaHRtbAorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorCS8vIERlY2xhcmUgYSB2YXJpYWJsZSB0byBob2xkIHRoZSBjcmVhdGVkIGV2ZW50IGdyb3VwLgorCUV2ZW50R3JvdXBIYW5kbGVfdCB4Q3JlYXRlZEV2ZW50R3JvdXA7CisKKwkvLyBBdHRlbXB0IHRvIGNyZWF0ZSB0aGUgZXZlbnQgZ3JvdXAuCisJeENyZWF0ZWRFdmVudEdyb3VwID0geEV2ZW50R3JvdXBDcmVhdGUoKTsKKworCS8vIFdhcyB0aGUgZXZlbnQgZ3JvdXAgY3JlYXRlZCBzdWNjZXNzZnVsbHk/CisJaWYoIHhDcmVhdGVkRXZlbnRHcm91cCA9PSBOVUxMICkKKwl7CisJCS8vIFRoZSBldmVudCBncm91cCB3YXMgbm90IGNyZWF0ZWQgYmVjYXVzZSB0aGVyZSB3YXMgaW5zdWZmaWNpZW50CisJCS8vIEZyZWVSVE9TIGhlYXAgYXZhaWxhYmxlLgorCX0KKwllbHNlCisJeworCQkvLyBUaGUgZXZlbnQgZ3JvdXAgd2FzIGNyZWF0ZWQuCisJfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeEV2ZW50R3JvdXBDcmVhdGUgeEV2ZW50R3JvdXBDcmVhdGUKKyAqIFxpbmdyb3VwIEV2ZW50R3JvdXAKKyAqLworI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKwlFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXBDcmVhdGUoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworI2VuZGlmCisKKy8qKgorICogZXZlbnRfZ3JvdXBzLmgKKyAqPHByZT4KKyBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXBDcmVhdGVTdGF0aWMoIEV2ZW50R3JvdXBIYW5kbGVfdCAqIHB4RXZlbnRHcm91cEJ1ZmZlciApOworIDwvcHJlPgorICoKKyAqIENyZWF0ZSBhIG5ldyBldmVudCBncm91cC4KKyAqCisgKiBJbnRlcm5hbGx5LCB3aXRoaW4gdGhlIEZyZWVSVE9TIGltcGxlbWVudGF0aW9uLCBldmVudCBncm91cHMgdXNlIGEgW3NtYWxsXQorICogYmxvY2sgb2YgbWVtb3J5LCBpbiB3aGljaCB0aGUgZXZlbnQgZ3JvdXAncyBzdHJ1Y3R1cmUgaXMgc3RvcmVkLiAgSWYgYW4gZXZlbnQKKyAqIGdyb3VwcyBpcyBjcmVhdGVkIHVzaW5nIHhFdmVudEdyb3B1Q3JlYXRlKCkgdGhlbiB0aGUgcmVxdWlyZWQgbWVtb3J5IGlzCisgKiBhdXRvbWF0aWNhbGx5IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpbnNpZGUgdGhlIHhFdmVudEdyb3VwQ3JlYXRlKCkgZnVuY3Rpb24uCisgKiAoc2VlIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExMS5odG1sKS4gIElmIGFuIGV2ZW50IGdyb3VwIGlzIGNyZWF0ZWQKKyAqIHVzaW5nIHhFdmVudEdyb3B1Q3JlYXRlU3RhdGljKCkgdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgaW5zdGVhZAorICogcHJvdmlkZSB0aGUgbWVtb3J5IHRoYXQgd2lsbCBnZXQgdXNlZCBieSB0aGUgZXZlbnQgZ3JvdXAuCisgKiB4RXZlbnRHcm91cENyZWF0ZVN0YXRpYygpIHRoZXJlZm9yZSBhbGxvd3MgYW4gZXZlbnQgZ3JvdXAgdG8gYmUgY3JlYXRlZAorICogd2l0aG91dCB1c2luZyBhbnkgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBBbHRob3VnaCBldmVudCBncm91cHMgYXJlIG5vdCByZWxhdGVkIHRvIHRpY2tzLCBmb3IgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24KKyAqIHJlYXNvbnMgdGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBmb3IgdXNlIGluIGFuIGV2ZW50IGdyb3VwIGlzIGRlcGVuZGVudAorICogb24gdGhlIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1Mgc2V0dGluZyBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgSWYKKyAqIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgaXMgMSB0aGVuIGVhY2ggZXZlbnQgZ3JvdXAgY29udGFpbnMgOCB1c2FibGUgYml0cyAoYml0CisgKiAwIHRvIGJpdCA3KS4gIElmIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgaXMgc2V0IHRvIDAgdGhlbiBlYWNoIGV2ZW50IGdyb3VwIGhhcworICogMjQgdXNhYmxlIGJpdHMgKGJpdCAwIHRvIGJpdCAyMykuICBUaGUgRXZlbnRCaXRzX3QgdHlwZSBpcyB1c2VkIHRvIHN0b3JlCisgKiBldmVudCBiaXRzIHdpdGhpbiBhbiBldmVudCBncm91cC4KKyAqCisgKiBAcGFyYW0gcHhFdmVudEdyb3VwQnVmZmVyIHB4RXZlbnRHcm91cEJ1ZmZlciBtdXN0IHBvaW50IHRvIGEgdmFyaWFibGUgb2YgdHlwZQorICogU3RhdGljRXZlbnRHcm91cF90LCB3aGljaCB3aWxsIGJlIHRoZW4gYmUgdXNlZCB0byBob2xkIHRoZSBldmVudCBncm91cCdzIGRhdGEKKyAqIHN0cnVjdHVyZXMsIHJlbW92aW5nIHRoZSBuZWVkIGZvciB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseS4KKyAqCisgKiBAcmV0dXJuIElmIHRoZSBldmVudCBncm91cCB3YXMgY3JlYXRlZCB0aGVuIGEgaGFuZGxlIHRvIHRoZSBldmVudCBncm91cCBpcworICogcmV0dXJuZWQuICBJZiBweEV2ZW50R3JvdXBCdWZmZXIgd2FzIE5VTEwgdGhlbiBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorCS8vIFN0YXRpY0V2ZW50R3JvdXBfdCBpcyBhIHB1YmxpY2x5IGFjY2Vzc2libGUgc3RydWN0dXJlIHRoYXQgaGFzIHRoZSBzYW1lCisJLy8gc2l6ZSBhbmQgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBhcyB0aGUgcmVhbCBldmVudCBncm91cCBzdHJ1Y3R1cmUuICBJdCBpcworCS8vIHByb3ZpZGVkIGFzIGEgbWVjaGFuaXNtIGZvciBhcHBsaWNhdGlvbnMgdG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgZXZlbnQKKwkvLyBncm91cCAod2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZQorCS8vIHNldHRpbmdzKSB3aXRob3V0IGJyZWFraW5nIHRoZSBzdHJpY3QgZGF0YSBoaWRpbmcgcG9saWN5IGJ5IGV4cG9zaW5nIHRoZQorCS8vIHJlYWwgZXZlbnQgZ3JvdXAgaW50ZXJuYWxzLiAgVGhpcyBTdGF0aWNFdmVudEdyb3VwX3QgdmFyaWFibGUgaXMgcGFzc2VkCisJLy8gaW50byB0aGUgeFNlbWFwaG9yZUNyZWF0ZUV2ZW50R3JvdXBTdGF0aWMoKSBmdW5jdGlvbiBhbmQgaXMgdXNlZCB0byBzdG9yZQorCS8vIHRoZSBldmVudCBncm91cCdzIGRhdGEgc3RydWN0dXJlcworCVN0YXRpY0V2ZW50R3JvdXBfdCB4RXZlbnRHcm91cEJ1ZmZlcjsKKworCS8vIENyZWF0ZSB0aGUgZXZlbnQgZ3JvdXAgd2l0aG91dCBkeW5hbWljYWxseSBhbGxvY2F0aW5nIGFueSBtZW1vcnkuCisJeEV2ZW50R3JvdXAgPSB4RXZlbnRHcm91cENyZWF0ZVN0YXRpYyggJnhFdmVudEdyb3VwQnVmZmVyICk7CisgICA8L3ByZT4KKyAqLworI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCUV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cENyZWF0ZVN0YXRpYyggU3RhdGljRXZlbnRHcm91cF90ICpweEV2ZW50R3JvdXBCdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworI2VuZGlmCisKKy8qKgorICogZXZlbnRfZ3JvdXBzLmgKKyAqPHByZT4KKwlFdmVudEJpdHNfdCB4RXZlbnRHcm91cFdhaXRCaXRzKCAJRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLAorCQkJCQkJCQkJCWNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvV2FpdEZvciwKKwkJCQkJCQkJCQljb25zdCBCYXNlVHlwZV90IHhDbGVhck9uRXhpdCwKKwkJCQkJCQkJCQljb25zdCBCYXNlVHlwZV90IHhXYWl0Rm9yQWxsQml0cywKKwkJCQkJCQkJCQljb25zdCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOworIDwvcHJlPgorICoKKyAqIFtQb3RlbnRpYWxseV0gYmxvY2sgdG8gd2FpdCBmb3Igb25lIG9yIG1vcmUgYml0cyB0byBiZSBzZXQgd2l0aGluIGEKKyAqIHByZXZpb3VzbHkgY3JlYXRlZCBldmVudCBncm91cC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQuCisgKgorICogQHBhcmFtIHhFdmVudEdyb3VwIFRoZSBldmVudCBncm91cCBpbiB3aGljaCB0aGUgYml0cyBhcmUgYmVpbmcgdGVzdGVkLiAgVGhlCisgKiBldmVudCBncm91cCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIGNyZWF0ZWQgdXNpbmcgYSBjYWxsIHRvCisgKiB4RXZlbnRHcm91cENyZWF0ZSgpLgorICoKKyAqIEBwYXJhbSB1eEJpdHNUb1dhaXRGb3IgQSBiaXR3aXNlIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoZSBiaXQgb3IgYml0cyB0byB0ZXN0CisgKiBpbnNpZGUgdGhlIGV2ZW50IGdyb3VwLiAgRm9yIGV4YW1wbGUsIHRvIHdhaXQgZm9yIGJpdCAwIGFuZC9vciBiaXQgMiBzZXQKKyAqIHV4Qml0c1RvV2FpdEZvciB0byAweDA1LiAgVG8gd2FpdCBmb3IgYml0cyAwIGFuZC9vciBiaXQgMSBhbmQvb3IgYml0IDIgc2V0CisgKiB1eEJpdHNUb1dhaXRGb3IgdG8gMHgwNy4gIEV0Yy4KKyAqCisgKiBAcGFyYW0geENsZWFyT25FeGl0IElmIHhDbGVhck9uRXhpdCBpcyBzZXQgdG8gcGRUUlVFIHRoZW4gYW55IGJpdHMgd2l0aGluCisgKiB1eEJpdHNUb1dhaXRGb3IgdGhhdCBhcmUgc2V0IHdpdGhpbiB0aGUgZXZlbnQgZ3JvdXAgd2lsbCBiZSBjbGVhcmVkIGJlZm9yZQorICogeEV2ZW50R3JvdXBXYWl0Qml0cygpIHJldHVybnMgaWYgdGhlIHdhaXQgY29uZGl0aW9uIHdhcyBtZXQgKGlmIHRoZSBmdW5jdGlvbgorICogcmV0dXJucyBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiBhIHRpbWVvdXQpLiAgSWYgeENsZWFyT25FeGl0IGlzIHNldCB0bworICogcGRGQUxTRSB0aGVuIHRoZSBiaXRzIHNldCBpbiB0aGUgZXZlbnQgZ3JvdXAgYXJlIG5vdCBhbHRlcmVkIHdoZW4gdGhlIGNhbGwgdG8KKyAqIHhFdmVudEdyb3VwV2FpdEJpdHMoKSByZXR1cm5zLgorICoKKyAqIEBwYXJhbSB4V2FpdEZvckFsbEJpdHMgSWYgeFdhaXRGb3JBbGxCaXRzIGlzIHNldCB0byBwZFRSVUUgdGhlbgorICogeEV2ZW50R3JvdXBXYWl0Qml0cygpIHdpbGwgcmV0dXJuIHdoZW4gZWl0aGVyIGFsbCB0aGUgYml0cyBpbiB1eEJpdHNUb1dhaXRGb3IKKyAqIGFyZSBzZXQgb3IgdGhlIHNwZWNpZmllZCBibG9jayB0aW1lIGV4cGlyZXMuICBJZiB4V2FpdEZvckFsbEJpdHMgaXMgc2V0IHRvCisgKiBwZEZBTFNFIHRoZW4geEV2ZW50R3JvdXBXYWl0Qml0cygpIHdpbGwgcmV0dXJuIHdoZW4gYW55IG9uZSBvZiB0aGUgYml0cyBzZXQKKyAqIGluIHV4Qml0c1RvV2FpdEZvciBpcyBzZXQgb3IgdGhlIHNwZWNpZmllZCBibG9jayB0aW1lIGV4cGlyZXMuICBUaGUgYmxvY2sKKyAqIHRpbWUgaXMgc3BlY2lmaWVkIGJ5IHRoZSB4VGlja3NUb1dhaXQgcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgKHNwZWNpZmllZCBpbiAndGlja3MnKSB0byB3YWl0CisgKiBmb3Igb25lL2FsbCAoZGVwZW5kaW5nIG9uIHRoZSB4V2FpdEZvckFsbEJpdHMgdmFsdWUpIG9mIHRoZSBiaXRzIHNwZWNpZmllZCBieQorICogdXhCaXRzVG9XYWl0Rm9yIHRvIGJlY29tZSBzZXQuCisgKgorICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGV2ZW50IGdyb3VwIGF0IHRoZSB0aW1lIGVpdGhlciB0aGUgYml0cyBiZWluZyB3YWl0ZWQKKyAqIGZvciBiZWNhbWUgc2V0LCBvciB0aGUgYmxvY2sgdGltZSBleHBpcmVkLiAgVGVzdCB0aGUgcmV0dXJuIHZhbHVlIHRvIGtub3cKKyAqIHdoaWNoIGJpdHMgd2VyZSBzZXQuICBJZiB4RXZlbnRHcm91cFdhaXRCaXRzKCkgcmV0dXJuZWQgYmVjYXVzZSBpdHMgdGltZW91dAorICogZXhwaXJlZCB0aGVuIG5vdCBhbGwgdGhlIGJpdHMgYmVpbmcgd2FpdGVkIGZvciB3aWxsIGJlIHNldC4gIElmCisgKiB4RXZlbnRHcm91cFdhaXRCaXRzKCkgcmV0dXJuZWQgYmVjYXVzZSB0aGUgYml0cyBpdCB3YXMgd2FpdGluZyBmb3Igd2VyZSBzZXQKKyAqIHRoZW4gdGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBldmVudCBncm91cCB2YWx1ZSBiZWZvcmUgYW55IGJpdHMgd2VyZQorICogYXV0b21hdGljYWxseSBjbGVhcmVkIGluIHRoZSBjYXNlIHRoYXQgeENsZWFyT25FeGl0IHBhcmFtZXRlciB3YXMgc2V0IHRvCisgKiBwZFRSVUUuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+CisgICAjZGVmaW5lIEJJVF8wCSggMSA8PCAwICkKKyAgICNkZWZpbmUgQklUXzQJKCAxIDw8IDQgKQorCisgICB2b2lkIGFGdW5jdGlvbiggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwICkKKyAgIHsKKyAgIEV2ZW50Qml0c190IHV4Qml0czsKKyAgIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ID0gMTAwIC8gcG9ydFRJQ0tfUEVSSU9EX01TOworCisJCS8vIFdhaXQgYSBtYXhpbXVtIG9mIDEwMG1zIGZvciBlaXRoZXIgYml0IDAgb3IgYml0IDQgdG8gYmUgc2V0IHdpdGhpbgorCQkvLyB0aGUgZXZlbnQgZ3JvdXAuICBDbGVhciB0aGUgYml0cyBiZWZvcmUgZXhpdGluZy4KKwkJdXhCaXRzID0geEV2ZW50R3JvdXBXYWl0Qml0cygKKwkJCQkJeEV2ZW50R3JvdXAsCS8vIFRoZSBldmVudCBncm91cCBiZWluZyB0ZXN0ZWQuCisJCQkJCUJJVF8wIHwgQklUXzQsCS8vIFRoZSBiaXRzIHdpdGhpbiB0aGUgZXZlbnQgZ3JvdXAgdG8gd2FpdCBmb3IuCisJCQkJCXBkVFJVRSwJCQkvLyBCSVRfMCBhbmQgQklUXzQgc2hvdWxkIGJlIGNsZWFyZWQgYmVmb3JlIHJldHVybmluZy4KKwkJCQkJcGRGQUxTRSwJCS8vIERvbid0IHdhaXQgZm9yIGJvdGggYml0cywgZWl0aGVyIGJpdCB3aWxsIGRvLgorCQkJCQl4VGlja3NUb1dhaXQgKTsJLy8gV2FpdCBhIG1heGltdW0gb2YgMTAwbXMgZm9yIGVpdGhlciBiaXQgdG8gYmUgc2V0LgorCisJCWlmKCAoIHV4Qml0cyAmICggQklUXzAgfCBCSVRfNCApICkgPT0gKCBCSVRfMCB8IEJJVF80ICkgKQorCQl7CisJCQkvLyB4RXZlbnRHcm91cFdhaXRCaXRzKCkgcmV0dXJuZWQgYmVjYXVzZSBib3RoIGJpdHMgd2VyZSBzZXQuCisJCX0KKwkJZWxzZSBpZiggKCB1eEJpdHMgJiBCSVRfMCApICE9IDAgKQorCQl7CisJCQkvLyB4RXZlbnRHcm91cFdhaXRCaXRzKCkgcmV0dXJuZWQgYmVjYXVzZSBqdXN0IEJJVF8wIHdhcyBzZXQuCisJCX0KKwkJZWxzZSBpZiggKCB1eEJpdHMgJiBCSVRfNCApICE9IDAgKQorCQl7CisJCQkvLyB4RXZlbnRHcm91cFdhaXRCaXRzKCkgcmV0dXJuZWQgYmVjYXVzZSBqdXN0IEJJVF80IHdhcyBzZXQuCisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyB4RXZlbnRHcm91cFdhaXRCaXRzKCkgcmV0dXJuZWQgYmVjYXVzZSB4VGlja3NUb1dhaXQgdGlja3MgcGFzc2VkCisJCQkvLyB3aXRob3V0IGVpdGhlciBCSVRfMCBvciBCSVRfNCBiZWNvbWluZyBzZXQuCisJCX0KKyAgIH0KKyAgIDwvcHJlPgorICogXGRlZmdyb3VwIHhFdmVudEdyb3VwV2FpdEJpdHMgeEV2ZW50R3JvdXBXYWl0Qml0cworICogXGluZ3JvdXAgRXZlbnRHcm91cAorICovCitFdmVudEJpdHNfdCB4RXZlbnRHcm91cFdhaXRCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvV2FpdEZvciwgY29uc3QgQmFzZVR5cGVfdCB4Q2xlYXJPbkV4aXQsIGNvbnN0IEJhc2VUeXBlX3QgeFdhaXRGb3JBbGxCaXRzLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogZXZlbnRfZ3JvdXBzLmgKKyAqPHByZT4KKwlFdmVudEJpdHNfdCB4RXZlbnRHcm91cENsZWFyQml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb0NsZWFyICk7CisgPC9wcmU+CisgKgorICogQ2xlYXIgYml0cyB3aXRoaW4gYW4gZXZlbnQgZ3JvdXAuICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbgorICogaW50ZXJydXB0LgorICoKKyAqIEBwYXJhbSB4RXZlbnRHcm91cCBUaGUgZXZlbnQgZ3JvdXAgaW4gd2hpY2ggdGhlIGJpdHMgYXJlIHRvIGJlIGNsZWFyZWQuCisgKgorICogQHBhcmFtIHV4Qml0c1RvQ2xlYXIgQSBiaXR3aXNlIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoZSBiaXQgb3IgYml0cyB0byBjbGVhcgorICogaW4gdGhlIGV2ZW50IGdyb3VwLiAgRm9yIGV4YW1wbGUsIHRvIGNsZWFyIGJpdCAzIG9ubHksIHNldCB1eEJpdHNUb0NsZWFyIHRvCisgKiAweDA4LiAgVG8gY2xlYXIgYml0IDMgYW5kIGJpdCAwIHNldCB1eEJpdHNUb0NsZWFyIHRvIDB4MDkuCisgKgorICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGV2ZW50IGdyb3VwIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGJpdHMgd2VyZSBjbGVhcmVkLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorICAgI2RlZmluZSBCSVRfMAkoIDEgPDwgMCApCisgICAjZGVmaW5lIEJJVF80CSggMSA8PCA0ICkKKworICAgdm9pZCBhRnVuY3Rpb24oIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCApCisgICB7CisgICBFdmVudEJpdHNfdCB1eEJpdHM7CisKKwkJLy8gQ2xlYXIgYml0IDAgYW5kIGJpdCA0IGluIHhFdmVudEdyb3VwLgorCQl1eEJpdHMgPSB4RXZlbnRHcm91cENsZWFyQml0cygKKwkJCQkJCQkJeEV2ZW50R3JvdXAsCS8vIFRoZSBldmVudCBncm91cCBiZWluZyB1cGRhdGVkLgorCQkJCQkJCQlCSVRfMCB8IEJJVF80ICk7Ly8gVGhlIGJpdHMgYmVpbmcgY2xlYXJlZC4KKworCQlpZiggKCB1eEJpdHMgJiAoIEJJVF8wIHwgQklUXzQgKSApID09ICggQklUXzAgfCBCSVRfNCApICkKKwkJeworCQkJLy8gQm90aCBiaXQgMCBhbmQgYml0IDQgd2VyZSBzZXQgYmVmb3JlIHhFdmVudEdyb3VwQ2xlYXJCaXRzKCkgd2FzCisJCQkvLyBjYWxsZWQuICBCb3RoIHdpbGwgbm93IGJlIGNsZWFyIChub3Qgc2V0KS4KKwkJfQorCQllbHNlIGlmKCAoIHV4Qml0cyAmIEJJVF8wICkgIT0gMCApCisJCXsKKwkJCS8vIEJpdCAwIHdhcyBzZXQgYmVmb3JlIHhFdmVudEdyb3VwQ2xlYXJCaXRzKCkgd2FzIGNhbGxlZC4gIEl0IHdpbGwKKwkJCS8vIG5vdyBiZSBjbGVhci4KKwkJfQorCQllbHNlIGlmKCAoIHV4Qml0cyAmIEJJVF80ICkgIT0gMCApCisJCXsKKwkJCS8vIEJpdCA0IHdhcyBzZXQgYmVmb3JlIHhFdmVudEdyb3VwQ2xlYXJCaXRzKCkgd2FzIGNhbGxlZC4gIEl0IHdpbGwKKwkJCS8vIG5vdyBiZSBjbGVhci4KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIE5laXRoZXIgYml0IDAgbm9yIGJpdCA0IHdlcmUgc2V0IGluIHRoZSBmaXJzdCBwbGFjZS4KKwkJfQorICAgfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeEV2ZW50R3JvdXBDbGVhckJpdHMgeEV2ZW50R3JvdXBDbGVhckJpdHMKKyAqIFxpbmdyb3VwIEV2ZW50R3JvdXAKKyAqLworRXZlbnRCaXRzX3QgeEV2ZW50R3JvdXBDbGVhckJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9DbGVhciApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogZXZlbnRfZ3JvdXBzLmgKKyAqPHByZT4KKwlCYXNlVHlwZV90IHhFdmVudEdyb3VwQ2xlYXJCaXRzRnJvbUlTUiggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1NldCApOworIDwvcHJlPgorICoKKyAqIEEgdmVyc2lvbiBvZiB4RXZlbnRHcm91cENsZWFyQml0cygpIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdC4KKyAqCisgKiBTZXR0aW5nIGJpdHMgaW4gYW4gZXZlbnQgZ3JvdXAgaXMgbm90IGEgZGV0ZXJtaW5pc3RpYyBvcGVyYXRpb24gYmVjYXVzZSB0aGVyZQorICogYXJlIGFuIHVua25vd24gbnVtYmVyIG9mIHRhc2tzIHRoYXQgbWF5IGJlIHdhaXRpbmcgZm9yIHRoZSBiaXQgb3IgYml0cyBiZWluZworICogc2V0LiAgRnJlZVJUT1MgZG9lcyBub3QgYWxsb3cgbm9uZGV0ZXJtaW5pc3RpYyBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZAorICogd2hpbGUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHNvIHByb3RlY3RzIGV2ZW50IGdyb3VwcyB0aGF0IGFyZSBhY2Nlc3NlZAorICogZnJvbSB0YXNrcyBieSBzdXNwZW5kaW5nIHRoZSBzY2hlZHVsZXIgcmF0aGVyIHRoYW4gZGlzYWJsaW5nIGludGVycnVwdHMuICBBcworICogYSByZXN1bHQgZXZlbnQgZ3JvdXBzIGNhbm5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGFuIGludGVycnVwdCBzZXJ2aWNlCisgKiByb3V0aW5lLiAgVGhlcmVmb3JlIHhFdmVudEdyb3VwQ2xlYXJCaXRzRnJvbUlTUigpIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUKKyAqIHRpbWVyIHRhc2sgdG8gaGF2ZSB0aGUgY2xlYXIgb3BlcmF0aW9uIHBlcmZvcm1lZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGltZXIKKyAqIHRhc2suCisgKgorICogQHBhcmFtIHhFdmVudEdyb3VwIFRoZSBldmVudCBncm91cCBpbiB3aGljaCB0aGUgYml0cyBhcmUgdG8gYmUgY2xlYXJlZC4KKyAqCisgKiBAcGFyYW0gdXhCaXRzVG9DbGVhciBBIGJpdHdpc2UgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIGJpdCBvciBiaXRzIHRvIGNsZWFyLgorICogRm9yIGV4YW1wbGUsIHRvIGNsZWFyIGJpdCAzIG9ubHksIHNldCB1eEJpdHNUb0NsZWFyIHRvIDB4MDguICBUbyBjbGVhciBiaXQgMworICogYW5kIGJpdCAwIHNldCB1eEJpdHNUb0NsZWFyIHRvIDB4MDkuCisgKgorICogQHJldHVybiBJZiB0aGUgcmVxdWVzdCB0byBleGVjdXRlIHRoZSBmdW5jdGlvbiB3YXMgcG9zdGVkIHN1Y2Nlc3NmdWxseSB0aGVuCisgKiBwZFBBU1MgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBwZEZBTFNFIGlzIHJldHVybmVkLiAgcGRGQUxTRSB3aWxsIGJlIHJldHVybmVkCisgKiBpZiB0aGUgdGltZXIgc2VydmljZSBxdWV1ZSB3YXMgZnVsbC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKyAgICNkZWZpbmUgQklUXzAJKCAxIDw8IDAgKQorICAgI2RlZmluZSBCSVRfNAkoIDEgPDwgNCApCisKKyAgIC8vIEFuIGV2ZW50IGdyb3VwIHdoaWNoIGl0IGlzIGFzc3VtZWQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGJ5IGEgY2FsbCB0bworICAgLy8geEV2ZW50R3JvdXBDcmVhdGUoKS4KKyAgIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cDsKKworICAgdm9pZCBhbkludGVycnVwdEhhbmRsZXIoIHZvaWQgKQorICAgeworCQkvLyBDbGVhciBiaXQgMCBhbmQgYml0IDQgaW4geEV2ZW50R3JvdXAuCisJCXhSZXN1bHQgPSB4RXZlbnRHcm91cENsZWFyQml0c0Zyb21JU1IoCisJCQkJCQkJeEV2ZW50R3JvdXAsCSAvLyBUaGUgZXZlbnQgZ3JvdXAgYmVpbmcgdXBkYXRlZC4KKwkJCQkJCQlCSVRfMCB8IEJJVF80ICk7IC8vIFRoZSBiaXRzIGJlaW5nIHNldC4KKworCQlpZiggeFJlc3VsdCA9PSBwZFBBU1MgKQorCQl7CisJCQkvLyBUaGUgbWVzc2FnZSB3YXMgcG9zdGVkIHN1Y2Nlc3NmdWxseS4KKwkJfQorICB9CisgICA8L3ByZT4KKyAqIFxkZWZncm91cCB4RXZlbnRHcm91cENsZWFyQml0c0Zyb21JU1IgeEV2ZW50R3JvdXBDbGVhckJpdHNGcm9tSVNSCisgKiBcaW5ncm91cCBFdmVudEdyb3VwCisgKi8KKyNpZiggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCUJhc2VUeXBlX3QgeEV2ZW50R3JvdXBDbGVhckJpdHNGcm9tSVNSKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvU2V0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbHNlCisJI2RlZmluZSB4RXZlbnRHcm91cENsZWFyQml0c0Zyb21JU1IoIHhFdmVudEdyb3VwLCB1eEJpdHNUb0NsZWFyICkgeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbEZyb21JU1IoIHZFdmVudEdyb3VwQ2xlYXJCaXRzQ2FsbGJhY2ssICggdm9pZCAqICkgeEV2ZW50R3JvdXAsICggdWludDMyX3QgKSB1eEJpdHNUb0NsZWFyLCBOVUxMICkKKyNlbmRpZgorCisvKioKKyAqIGV2ZW50X2dyb3Vwcy5oCisgKjxwcmU+CisJRXZlbnRCaXRzX3QgeEV2ZW50R3JvdXBTZXRCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvU2V0ICk7CisgPC9wcmU+CisgKgorICogU2V0IGJpdHMgd2l0aGluIGFuIGV2ZW50IGdyb3VwLgorICogVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0LiAgeEV2ZW50R3JvdXBTZXRCaXRzRnJvbUlTUigpCisgKiBpcyBhIHZlcnNpb24gdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0LgorICoKKyAqIFNldHRpbmcgYml0cyBpbiBhbiBldmVudCBncm91cCB3aWxsIGF1dG9tYXRpY2FsbHkgdW5ibG9jayB0YXNrcyB0aGF0IGFyZQorICogYmxvY2tlZCB3YWl0aW5nIGZvciB0aGUgYml0cy4KKyAqCisgKiBAcGFyYW0geEV2ZW50R3JvdXAgVGhlIGV2ZW50IGdyb3VwIGluIHdoaWNoIHRoZSBiaXRzIGFyZSB0byBiZSBzZXQuCisgKgorICogQHBhcmFtIHV4Qml0c1RvU2V0IEEgYml0d2lzZSB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgYml0IG9yIGJpdHMgdG8gc2V0LgorICogRm9yIGV4YW1wbGUsIHRvIHNldCBiaXQgMyBvbmx5LCBzZXQgdXhCaXRzVG9TZXQgdG8gMHgwOC4gIFRvIHNldCBiaXQgMworICogYW5kIGJpdCAwIHNldCB1eEJpdHNUb1NldCB0byAweDA5LgorICoKKyAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBldmVudCBncm91cCBhdCB0aGUgdGltZSB0aGUgY2FsbCB0bworICogeEV2ZW50R3JvdXBTZXRCaXRzKCkgcmV0dXJucy4gIFRoZXJlIGFyZSB0d28gcmVhc29ucyB3aHkgdGhlIHJldHVybmVkIHZhbHVlCisgKiBtaWdodCBoYXZlIHRoZSBiaXRzIHNwZWNpZmllZCBieSB0aGUgdXhCaXRzVG9TZXQgcGFyYW1ldGVyIGNsZWFyZWQuICBGaXJzdCwKKyAqIGlmIHNldHRpbmcgYSBiaXQgcmVzdWx0cyBpbiBhIHRhc2sgdGhhdCB3YXMgd2FpdGluZyBmb3IgdGhlIGJpdCBsZWF2aW5nIHRoZQorICogYmxvY2tlZCBzdGF0ZSB0aGVuIGl0IGlzIHBvc3NpYmxlIHRoZSBiaXQgd2lsbCBiZSBjbGVhcmVkIGF1dG9tYXRpY2FsbHkKKyAqIChzZWUgdGhlIHhDbGVhckJpdE9uRXhpdCBwYXJhbWV0ZXIgb2YgeEV2ZW50R3JvdXBXYWl0Qml0cygpKS4gIFNlY29uZCwgYW55CisgKiB1bmJsb2NrZWQgKG9yIG90aGVyd2lzZSBSZWFkeSBzdGF0ZSkgdGFzayB0aGF0IGhhcyBhIHByaW9yaXR5IGFib3ZlIHRoYXQgb2YKKyAqIHRoZSB0YXNrIHRoYXQgY2FsbGVkIHhFdmVudEdyb3VwU2V0Qml0cygpIHdpbGwgZXhlY3V0ZSBhbmQgbWF5IGNoYW5nZSB0aGUKKyAqIGV2ZW50IGdyb3VwIHZhbHVlIGJlZm9yZSB0aGUgY2FsbCB0byB4RXZlbnRHcm91cFNldEJpdHMoKSByZXR1cm5zLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorICAgI2RlZmluZSBCSVRfMAkoIDEgPDwgMCApCisgICAjZGVmaW5lIEJJVF80CSggMSA8PCA0ICkKKworICAgdm9pZCBhRnVuY3Rpb24oIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCApCisgICB7CisgICBFdmVudEJpdHNfdCB1eEJpdHM7CisKKwkJLy8gU2V0IGJpdCAwIGFuZCBiaXQgNCBpbiB4RXZlbnRHcm91cC4KKwkJdXhCaXRzID0geEV2ZW50R3JvdXBTZXRCaXRzKAorCQkJCQkJCXhFdmVudEdyb3VwLAkvLyBUaGUgZXZlbnQgZ3JvdXAgYmVpbmcgdXBkYXRlZC4KKwkJCQkJCQlCSVRfMCB8IEJJVF80ICk7Ly8gVGhlIGJpdHMgYmVpbmcgc2V0LgorCisJCWlmKCAoIHV4Qml0cyAmICggQklUXzAgfCBCSVRfNCApICkgPT0gKCBCSVRfMCB8IEJJVF80ICkgKQorCQl7CisJCQkvLyBCb3RoIGJpdCAwIGFuZCBiaXQgNCByZW1haW5lZCBzZXQgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQuCisJCX0KKwkJZWxzZSBpZiggKCB1eEJpdHMgJiBCSVRfMCApICE9IDAgKQorCQl7CisJCQkvLyBCaXQgMCByZW1haW5lZCBzZXQgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQsIGJ1dCBiaXQgNCB3YXMKKwkJCS8vIGNsZWFyZWQuICBJdCBtaWdodCBiZSB0aGF0IGJpdCA0IHdhcyBjbGVhcmVkIGF1dG9tYXRpY2FsbHkgYXMgYQorCQkJLy8gdGFzayB0aGF0IHdhcyB3YWl0aW5nIGZvciBiaXQgNCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBCbG9ja2VkCisJCQkvLyBzdGF0ZS4KKwkJfQorCQllbHNlIGlmKCAoIHV4Qml0cyAmIEJJVF80ICkgIT0gMCApCisJCXsKKwkJCS8vIEJpdCA0IHJlbWFpbmVkIHNldCB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5lZCwgYnV0IGJpdCAwIHdhcworCQkJLy8gY2xlYXJlZC4gIEl0IG1pZ2h0IGJlIHRoYXQgYml0IDAgd2FzIGNsZWFyZWQgYXV0b21hdGljYWxseSBhcyBhCisJCQkvLyB0YXNrIHRoYXQgd2FzIHdhaXRpbmcgZm9yIGJpdCAwIHdhcyByZW1vdmVkIGZyb20gdGhlIEJsb2NrZWQKKwkJCS8vIHN0YXRlLgorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gTmVpdGhlciBiaXQgMCBub3IgYml0IDQgcmVtYWluZWQgc2V0LiAgSXQgbWlnaHQgYmUgdGhhdCBhIHRhc2sKKwkJCS8vIHdhcyB3YWl0aW5nIGZvciBib3RoIG9mIHRoZSBiaXRzIHRvIGJlIHNldCwgYW5kIHRoZSBiaXRzIHdlcmUKKwkJCS8vIGNsZWFyZWQgYXMgdGhlIHRhc2sgbGVmdCB0aGUgQmxvY2tlZCBzdGF0ZS4KKwkJfQorICAgfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeEV2ZW50R3JvdXBTZXRCaXRzIHhFdmVudEdyb3VwU2V0Qml0cworICogXGluZ3JvdXAgRXZlbnRHcm91cAorICovCitFdmVudEJpdHNfdCB4RXZlbnRHcm91cFNldEJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9TZXQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIGV2ZW50X2dyb3Vwcy5oCisgKjxwcmU+CisJQmFzZVR5cGVfdCB4RXZlbnRHcm91cFNldEJpdHNGcm9tSVNSKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvU2V0LCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisgPC9wcmU+CisgKgorICogQSB2ZXJzaW9uIG9mIHhFdmVudEdyb3VwU2V0Qml0cygpIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdC4KKyAqCisgKiBTZXR0aW5nIGJpdHMgaW4gYW4gZXZlbnQgZ3JvdXAgaXMgbm90IGEgZGV0ZXJtaW5pc3RpYyBvcGVyYXRpb24gYmVjYXVzZSB0aGVyZQorICogYXJlIGFuIHVua25vd24gbnVtYmVyIG9mIHRhc2tzIHRoYXQgbWF5IGJlIHdhaXRpbmcgZm9yIHRoZSBiaXQgb3IgYml0cyBiZWluZworICogc2V0LiAgRnJlZVJUT1MgZG9lcyBub3QgYWxsb3cgbm9uZGV0ZXJtaW5pc3RpYyBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBpbgorICogaW50ZXJydXB0cyBvciBmcm9tIGNyaXRpY2FsIHNlY3Rpb25zLiAgVGhlcmVmb3JlIHhFdmVudEdyb3VwU2V0Qml0c0Zyb21JU1IoKQorICogc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSB0aW1lciB0YXNrIHRvIGhhdmUgdGhlIHNldCBvcGVyYXRpb24gcGVyZm9ybWVkIGluIHRoZQorICogY29udGV4dCBvZiB0aGUgdGltZXIgdGFzayAtIHdoZXJlIGEgc2NoZWR1bGVyIGxvY2sgaXMgdXNlZCBpbiBwbGFjZSBvZiBhCisgKiBjcml0aWNhbCBzZWN0aW9uLgorICoKKyAqIEBwYXJhbSB4RXZlbnRHcm91cCBUaGUgZXZlbnQgZ3JvdXAgaW4gd2hpY2ggdGhlIGJpdHMgYXJlIHRvIGJlIHNldC4KKyAqCisgKiBAcGFyYW0gdXhCaXRzVG9TZXQgQSBiaXR3aXNlIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoZSBiaXQgb3IgYml0cyB0byBzZXQuCisgKiBGb3IgZXhhbXBsZSwgdG8gc2V0IGJpdCAzIG9ubHksIHNldCB1eEJpdHNUb1NldCB0byAweDA4LiAgVG8gc2V0IGJpdCAzCisgKiBhbmQgYml0IDAgc2V0IHV4Qml0c1RvU2V0IHRvIDB4MDkuCisgKgorICogQHBhcmFtIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gQXMgbWVudGlvbmVkIGFib3ZlLCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqIHdpbGwgcmVzdWx0IGluIGEgbWVzc2FnZSBiZWluZyBzZW50IHRvIHRoZSB0aW1lciBkYWVtb24gdGFzay4gIElmIHRoZQorICogcHJpb3JpdHkgb2YgdGhlIHRpbWVyIGRhZW1vbiB0YXNrIGlzIGhpZ2hlciB0aGFuIHRoZSBwcmlvcml0eSBvZiB0aGUKKyAqIGN1cnJlbnRseSBydW5uaW5nIHRhc2sgKHRoZSB0YXNrIHRoZSBpbnRlcnJ1cHQgaW50ZXJydXB0ZWQpIHRoZW4KKyAqICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHdpbGwgYmUgc2V0IHRvIHBkVFJVRSBieQorICogeEV2ZW50R3JvdXBTZXRCaXRzRnJvbUlTUigpLCBpbmRpY2F0aW5nIHRoYXQgYSBjb250ZXh0IHN3aXRjaCBzaG91bGQgYmUKKyAqIHJlcXVlc3RlZCBiZWZvcmUgdGhlIGludGVycnVwdCBleGl0cy4gIEZvciB0aGF0IHJlYXNvbgorICogKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gbXVzdCBiZSBpbml0aWFsaXNlZCB0byBwZEZBTFNFLiAgU2VlIHRoZQorICogZXhhbXBsZSBjb2RlIGJlbG93LgorICoKKyAqIEByZXR1cm4gSWYgdGhlIHJlcXVlc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2FzIHBvc3RlZCBzdWNjZXNzZnVsbHkgdGhlbgorICogcGRQQVNTIGlzIHJldHVybmVkLCBvdGhlcndpc2UgcGRGQUxTRSBpcyByZXR1cm5lZC4gIHBkRkFMU0Ugd2lsbCBiZSByZXR1cm5lZAorICogaWYgdGhlIHRpbWVyIHNlcnZpY2UgcXVldWUgd2FzIGZ1bGwuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+CisgICAjZGVmaW5lIEJJVF8wCSggMSA8PCAwICkKKyAgICNkZWZpbmUgQklUXzQJKCAxIDw8IDQgKQorCisgICAvLyBBbiBldmVudCBncm91cCB3aGljaCBpdCBpcyBhc3N1bWVkIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG8KKyAgIC8vIHhFdmVudEdyb3VwQ3JlYXRlKCkuCisgICBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXA7CisKKyAgIHZvaWQgYW5JbnRlcnJ1cHRIYW5kbGVyKCB2b2lkICkKKyAgIHsKKyAgIEJhc2VUeXBlX3QgeEhpZ2hlclByaW9yaXR5VGFza1dva2VuLCB4UmVzdWx0OworCisJCS8vIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBtdXN0IGJlIGluaXRpYWxpc2VkIHRvIHBkRkFMU0UuCisJCXhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkRkFMU0U7CisKKwkJLy8gU2V0IGJpdCAwIGFuZCBiaXQgNCBpbiB4RXZlbnRHcm91cC4KKwkJeFJlc3VsdCA9IHhFdmVudEdyb3VwU2V0Qml0c0Zyb21JU1IoCisJCQkJCQkJeEV2ZW50R3JvdXAsCS8vIFRoZSBldmVudCBncm91cCBiZWluZyB1cGRhdGVkLgorCQkJCQkJCUJJVF8wIHwgQklUXzQgICAvLyBUaGUgYml0cyBiZWluZyBzZXQuCisJCQkJCQkJJnhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworCisJCS8vIFdhcyB0aGUgbWVzc2FnZSBwb3N0ZWQgc3VjY2Vzc2Z1bGx5PworCQlpZiggeFJlc3VsdCA9PSBwZFBBU1MgKQorCQl7CisJCQkvLyBJZiB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gaXMgbm93IHNldCB0byBwZFRSVUUgdGhlbiBhIGNvbnRleHQKKwkJCS8vIHN3aXRjaCBzaG91bGQgYmUgcmVxdWVzdGVkLiAgVGhlIG1hY3JvIHVzZWQgaXMgcG9ydCBzcGVjaWZpYyBhbmQKKwkJCS8vIHdpbGwgYmUgZWl0aGVyIHBvcnRZSUVMRF9GUk9NX0lTUigpIG9yIHBvcnRFTkRfU1dJVENISU5HX0lTUigpIC0KKwkJCS8vIHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIHBhZ2UgZm9yIHRoZSBwb3J0IGJlaW5nIHVzZWQuCisJCQlwb3J0WUlFTERfRlJPTV9JU1IoIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworCQl9CisgIH0KKyAgIDwvcHJlPgorICogXGRlZmdyb3VwIHhFdmVudEdyb3VwU2V0Qml0c0Zyb21JU1IgeEV2ZW50R3JvdXBTZXRCaXRzRnJvbUlTUgorICogXGluZ3JvdXAgRXZlbnRHcm91cAorICovCisjaWYoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwlCYXNlVHlwZV90IHhFdmVudEdyb3VwU2V0Qml0c0Zyb21JU1IoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9TZXQsIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworI2Vsc2UKKwkjZGVmaW5lIHhFdmVudEdyb3VwU2V0Qml0c0Zyb21JU1IoIHhFdmVudEdyb3VwLCB1eEJpdHNUb1NldCwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApIHhUaW1lclBlbmRGdW5jdGlvbkNhbGxGcm9tSVNSKCB2RXZlbnRHcm91cFNldEJpdHNDYWxsYmFjaywgKCB2b2lkICogKSB4RXZlbnRHcm91cCwgKCB1aW50MzJfdCApIHV4Qml0c1RvU2V0LCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkKKyNlbmRpZgorCisvKioKKyAqIGV2ZW50X2dyb3Vwcy5oCisgKjxwcmU+CisJRXZlbnRCaXRzX3QgeEV2ZW50R3JvdXBTeW5jKAlFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsCisJCQkJCQkJCQljb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1NldCwKKwkJCQkJCQkJCWNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvV2FpdEZvciwKKwkJCQkJCQkJCVRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7CisgPC9wcmU+CisgKgorICogQXRvbWljYWxseSBzZXQgYml0cyB3aXRoaW4gYW4gZXZlbnQgZ3JvdXAsIHRoZW4gd2FpdCBmb3IgYSBjb21iaW5hdGlvbiBvZgorICogYml0cyB0byBiZSBzZXQgd2l0aGluIHRoZSBzYW1lIGV2ZW50IGdyb3VwLiAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHR5cGljYWxseQorICogdXNlZCB0byBzeW5jaHJvbmlzZSBtdWx0aXBsZSB0YXNrcywgd2hlcmUgZWFjaCB0YXNrIGhhcyB0byB3YWl0IGZvciB0aGUgb3RoZXIKKyAqIHRhc2tzIHRvIHJlYWNoIGEgc3luY2hyb25pc2F0aW9uIHBvaW50IGJlZm9yZSBwcm9jZWVkaW5nLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgZnJvbSBhbiBpbnRlcnJ1cHQuCisgKgorICogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGJlZm9yZSBpdHMgYmxvY2sgdGltZSBleHBpcmVzIGlmIHRoZSBiaXRzIHNwZWNpZmllZAorICogYnkgdGhlIHV4Qml0c1RvV2FpdCBwYXJhbWV0ZXIgYXJlIHNldCwgb3IgYmVjb21lIHNldCB3aXRoaW4gdGhhdCB0aW1lLiAgSW4KKyAqIHRoaXMgY2FzZSBhbGwgdGhlIGJpdHMgc3BlY2lmaWVkIGJ5IHV4Qml0c1RvV2FpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKyAqIGNsZWFyZWQgYmVmb3JlIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorICoKKyAqIEBwYXJhbSB4RXZlbnRHcm91cCBUaGUgZXZlbnQgZ3JvdXAgaW4gd2hpY2ggdGhlIGJpdHMgYXJlIGJlaW5nIHRlc3RlZC4gIFRoZQorICogZXZlbnQgZ3JvdXAgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiBjcmVhdGVkIHVzaW5nIGEgY2FsbCB0bworICogeEV2ZW50R3JvdXBDcmVhdGUoKS4KKyAqCisgKiBAcGFyYW0gdXhCaXRzVG9TZXQgVGhlIGJpdHMgdG8gc2V0IGluIHRoZSBldmVudCBncm91cCBiZWZvcmUgZGV0ZXJtaW5pbmcKKyAqIGlmLCBhbmQgcG9zc2libHkgd2FpdGluZyBmb3IsIGFsbCB0aGUgYml0cyBzcGVjaWZpZWQgYnkgdGhlIHV4Qml0c1RvV2FpdAorICogcGFyYW1ldGVyIGFyZSBzZXQuCisgKgorICogQHBhcmFtIHV4Qml0c1RvV2FpdEZvciBBIGJpdHdpc2UgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIGJpdCBvciBiaXRzIHRvIHRlc3QKKyAqIGluc2lkZSB0aGUgZXZlbnQgZ3JvdXAuICBGb3IgZXhhbXBsZSwgdG8gd2FpdCBmb3IgYml0IDAgYW5kIGJpdCAyIHNldAorICogdXhCaXRzVG9XYWl0Rm9yIHRvIDB4MDUuICBUbyB3YWl0IGZvciBiaXRzIDAgYW5kIGJpdCAxIGFuZCBiaXQgMiBzZXQKKyAqIHV4Qml0c1RvV2FpdEZvciB0byAweDA3LiAgRXRjLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgKHNwZWNpZmllZCBpbiAndGlja3MnKSB0byB3YWl0CisgKiBmb3IgYWxsIG9mIHRoZSBiaXRzIHNwZWNpZmllZCBieSB1eEJpdHNUb1dhaXRGb3IgdG8gYmVjb21lIHNldC4KKyAqCisgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQgZ3JvdXAgYXQgdGhlIHRpbWUgZWl0aGVyIHRoZSBiaXRzIGJlaW5nIHdhaXRlZAorICogZm9yIGJlY2FtZSBzZXQsIG9yIHRoZSBibG9jayB0aW1lIGV4cGlyZWQuICBUZXN0IHRoZSByZXR1cm4gdmFsdWUgdG8ga25vdworICogd2hpY2ggYml0cyB3ZXJlIHNldC4gIElmIHhFdmVudEdyb3VwU3luYygpIHJldHVybmVkIGJlY2F1c2UgaXRzIHRpbWVvdXQKKyAqIGV4cGlyZWQgdGhlbiBub3QgYWxsIHRoZSBiaXRzIGJlaW5nIHdhaXRlZCBmb3Igd2lsbCBiZSBzZXQuICBJZgorICogeEV2ZW50R3JvdXBTeW5jKCkgcmV0dXJuZWQgYmVjYXVzZSBhbGwgdGhlIGJpdHMgaXQgd2FzIHdhaXRpbmcgZm9yIHdlcmUKKyAqIHNldCB0aGVuIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgZXZlbnQgZ3JvdXAgdmFsdWUgYmVmb3JlIGFueSBiaXRzIHdlcmUKKyAqIGF1dG9tYXRpY2FsbHkgY2xlYXJlZC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorIDxwcmU+CisgLy8gQml0cyB1c2VkIGJ5IHRoZSB0aHJlZSB0YXNrcy4KKyAjZGVmaW5lIFRBU0tfMF9CSVQJCSggMSA8PCAwICkKKyAjZGVmaW5lIFRBU0tfMV9CSVQJCSggMSA8PCAxICkKKyAjZGVmaW5lIFRBU0tfMl9CSVQJCSggMSA8PCAyICkKKworICNkZWZpbmUgQUxMX1NZTkNfQklUUyAoIFRBU0tfMF9CSVQgfCBUQVNLXzFfQklUIHwgVEFTS18yX0JJVCApCisKKyAvLyBVc2UgYW4gZXZlbnQgZ3JvdXAgdG8gc3luY2hyb25pc2UgdGhyZWUgdGFza3MuICBJdCBpcyBhc3N1bWVkIHRoaXMgZXZlbnQKKyAvLyBncm91cCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgZWxzZXdoZXJlLgorIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRCaXRzOworCisgdm9pZCB2VGFzazAoIHZvaWQgKnB2UGFyYW1ldGVycyApCisgeworIEV2ZW50Qml0c190IHV4UmV0dXJuOworIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ID0gMTAwIC8gcG9ydFRJQ0tfUEVSSU9EX01TOworCisJIGZvciggOzsgKQorCSB7CisJCS8vIFBlcmZvcm0gdGFzayBmdW5jdGlvbmFsaXR5IGhlcmUuCisKKwkJLy8gU2V0IGJpdCAwIGluIHRoZSBldmVudCBmbGFnIHRvIG5vdGUgdGhpcyB0YXNrIGhhcyByZWFjaGVkIHRoZQorCQkvLyBzeW5jIHBvaW50LiAgVGhlIG90aGVyIHR3byB0YXNrcyB3aWxsIHNldCB0aGUgb3RoZXIgdHdvIGJpdHMgZGVmaW5lZAorCQkvLyBieSBBTExfU1lOQ19CSVRTLiAgQWxsIHRocmVlIHRhc2tzIGhhdmUgcmVhY2hlZCB0aGUgc3luY2hyb25pc2F0aW9uCisJCS8vIHBvaW50IHdoZW4gYWxsIHRoZSBBTExfU1lOQ19CSVRTIGFyZSBzZXQuICBXYWl0IGEgbWF4aW11bSBvZiAxMDBtcworCQkvLyBmb3IgdGhpcyB0byBoYXBwZW4uCisJCXV4UmV0dXJuID0geEV2ZW50R3JvdXBTeW5jKCB4RXZlbnRCaXRzLCBUQVNLXzBfQklULCBBTExfU1lOQ19CSVRTLCB4VGlja3NUb1dhaXQgKTsKKworCQlpZiggKCB1eFJldHVybiAmIEFMTF9TWU5DX0JJVFMgKSA9PSBBTExfU1lOQ19CSVRTICkKKwkJeworCQkJLy8gQWxsIHRocmVlIHRhc2tzIHJlYWNoZWQgdGhlIHN5bmNocm9uaXNhdGlvbiBwb2ludCBiZWZvcmUgdGhlIGNhbGwKKwkJCS8vIHRvIHhFdmVudEdyb3VwU3luYygpIHRpbWVkIG91dC4KKwkJfQorCX0KKyB9CisKKyB2b2lkIHZUYXNrMSggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyB7CisJIGZvciggOzsgKQorCSB7CisJCS8vIFBlcmZvcm0gdGFzayBmdW5jdGlvbmFsaXR5IGhlcmUuCisKKwkJLy8gU2V0IGJpdCAxIGluIHRoZSBldmVudCBmbGFnIHRvIG5vdGUgdGhpcyB0YXNrIGhhcyByZWFjaGVkIHRoZQorCQkvLyBzeW5jaHJvbmlzYXRpb24gcG9pbnQuICBUaGUgb3RoZXIgdHdvIHRhc2tzIHdpbGwgc2V0IHRoZSBvdGhlciB0d28KKwkJLy8gYml0cyBkZWZpbmVkIGJ5IEFMTF9TWU5DX0JJVFMuICBBbGwgdGhyZWUgdGFza3MgaGF2ZSByZWFjaGVkIHRoZQorCQkvLyBzeW5jaHJvbmlzYXRpb24gcG9pbnQgd2hlbiBhbGwgdGhlIEFMTF9TWU5DX0JJVFMgYXJlIHNldC4gIFdhaXQKKwkJLy8gaW5kZWZpbml0ZWx5IGZvciB0aGlzIHRvIGhhcHBlbi4KKwkJeEV2ZW50R3JvdXBTeW5jKCB4RXZlbnRCaXRzLCBUQVNLXzFfQklULCBBTExfU1lOQ19CSVRTLCBwb3J0TUFYX0RFTEFZICk7CisKKwkJLy8geEV2ZW50R3JvdXBTeW5jKCkgd2FzIGNhbGxlZCB3aXRoIGFuIGluZGVmaW5pdGUgYmxvY2sgdGltZSwgc28KKwkJLy8gdGhpcyB0YXNrIHdpbGwgb25seSByZWFjaCBoZXJlIGlmIHRoZSBzeW5jcmhvbmlzYXRpb24gd2FzIG1hZGUgYnkgYWxsCisJCS8vIHRocmVlIHRhc2tzLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHRlc3QgdGhlIHJldHVybiB2YWx1ZS4KKwkgfQorIH0KKworIHZvaWQgdlRhc2syKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorIHsKKwkgZm9yKCA7OyApCisJIHsKKwkJLy8gUGVyZm9ybSB0YXNrIGZ1bmN0aW9uYWxpdHkgaGVyZS4KKworCQkvLyBTZXQgYml0IDIgaW4gdGhlIGV2ZW50IGZsYWcgdG8gbm90ZSB0aGlzIHRhc2sgaGFzIHJlYWNoZWQgdGhlCisJCS8vIHN5bmNocm9uaXNhdGlvbiBwb2ludC4gIFRoZSBvdGhlciB0d28gdGFza3Mgd2lsbCBzZXQgdGhlIG90aGVyIHR3bworCQkvLyBiaXRzIGRlZmluZWQgYnkgQUxMX1NZTkNfQklUUy4gIEFsbCB0aHJlZSB0YXNrcyBoYXZlIHJlYWNoZWQgdGhlCisJCS8vIHN5bmNocm9uaXNhdGlvbiBwb2ludCB3aGVuIGFsbCB0aGUgQUxMX1NZTkNfQklUUyBhcmUgc2V0LiAgV2FpdAorCQkvLyBpbmRlZmluaXRlbHkgZm9yIHRoaXMgdG8gaGFwcGVuLgorCQl4RXZlbnRHcm91cFN5bmMoIHhFdmVudEJpdHMsIFRBU0tfMl9CSVQsIEFMTF9TWU5DX0JJVFMsIHBvcnRNQVhfREVMQVkgKTsKKworCQkvLyB4RXZlbnRHcm91cFN5bmMoKSB3YXMgY2FsbGVkIHdpdGggYW4gaW5kZWZpbml0ZSBibG9jayB0aW1lLCBzbworCQkvLyB0aGlzIHRhc2sgd2lsbCBvbmx5IHJlYWNoIGhlcmUgaWYgdGhlIHN5bmNyaG9uaXNhdGlvbiB3YXMgbWFkZSBieSBhbGwKKwkJLy8gdGhyZWUgdGFza3MsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gdGVzdCB0aGUgcmV0dXJuIHZhbHVlLgorCX0KKyB9CisKKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4RXZlbnRHcm91cFN5bmMgeEV2ZW50R3JvdXBTeW5jCisgKiBcaW5ncm91cCBFdmVudEdyb3VwCisgKi8KK0V2ZW50Qml0c190IHhFdmVudEdyb3VwU3luYyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1NldCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKworLyoqCisgKiBldmVudF9ncm91cHMuaAorICo8cHJlPgorCUV2ZW50Qml0c190IHhFdmVudEdyb3VwR2V0Qml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwICk7CisgPC9wcmU+CisgKgorICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYml0cyBpbiBhbiBldmVudCBncm91cC4gIFRoaXMgZnVuY3Rpb24KKyAqIGNhbm5vdCBiZSB1c2VkIGZyb20gYW4gaW50ZXJydXB0LgorICoKKyAqIEBwYXJhbSB4RXZlbnRHcm91cCBUaGUgZXZlbnQgZ3JvdXAgYmVpbmcgcXVlcmllZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBldmVudCBncm91cCBiaXRzIGF0IHRoZSB0aW1lIHhFdmVudEdyb3VwR2V0Qml0cygpIHdhcyBjYWxsZWQuCisgKgorICogXGRlZmdyb3VwIHhFdmVudEdyb3VwR2V0Qml0cyB4RXZlbnRHcm91cEdldEJpdHMKKyAqIFxpbmdyb3VwIEV2ZW50R3JvdXAKKyAqLworI2RlZmluZSB4RXZlbnRHcm91cEdldEJpdHMoIHhFdmVudEdyb3VwICkgeEV2ZW50R3JvdXBDbGVhckJpdHMoIHhFdmVudEdyb3VwLCAwICkKKworLyoqCisgKiBldmVudF9ncm91cHMuaAorICo8cHJlPgorCUV2ZW50Qml0c190IHhFdmVudEdyb3VwR2V0Qml0c0Zyb21JU1IoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCApOworIDwvcHJlPgorICoKKyAqIEEgdmVyc2lvbiBvZiB4RXZlbnRHcm91cEdldEJpdHMoKSB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbiBJU1IuCisgKgorICogQHBhcmFtIHhFdmVudEdyb3VwIFRoZSBldmVudCBncm91cCBiZWluZyBxdWVyaWVkLgorICoKKyAqIEByZXR1cm4gVGhlIGV2ZW50IGdyb3VwIGJpdHMgYXQgdGhlIHRpbWUgeEV2ZW50R3JvdXBHZXRCaXRzRnJvbUlTUigpIHdhcyBjYWxsZWQuCisgKgorICogXGRlZmdyb3VwIHhFdmVudEdyb3VwR2V0Qml0c0Zyb21JU1IgeEV2ZW50R3JvdXBHZXRCaXRzRnJvbUlTUgorICogXGluZ3JvdXAgRXZlbnRHcm91cAorICovCitFdmVudEJpdHNfdCB4RXZlbnRHcm91cEdldEJpdHNGcm9tSVNSKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIGV2ZW50X2dyb3Vwcy5oCisgKjxwcmU+CisJdm9pZCB4RXZlbnRHcm91cERlbGV0ZSggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwICk7CisgPC9wcmU+CisgKgorICogRGVsZXRlIGFuIGV2ZW50IGdyb3VwIHRoYXQgd2FzIHByZXZpb3VzbHkgY3JlYXRlZCBieSBhIGNhbGwgdG8KKyAqIHhFdmVudEdyb3VwQ3JlYXRlKCkuICBUYXNrcyB0aGF0IGFyZSBibG9ja2VkIG9uIHRoZSBldmVudCBncm91cCB3aWxsIGJlCisgKiB1bmJsb2NrZWQgYW5kIG9idGFpbiAwIGFzIHRoZSBldmVudCBncm91cCdzIHZhbHVlLgorICoKKyAqIEBwYXJhbSB4RXZlbnRHcm91cCBUaGUgZXZlbnQgZ3JvdXAgYmVpbmcgZGVsZXRlZC4KKyAqLwordm9pZCB2RXZlbnRHcm91cERlbGV0ZSggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyogRm9yIGludGVybmFsIHVzZSBvbmx5LiAqLwordm9pZCB2RXZlbnRHcm91cFNldEJpdHNDYWxsYmFjayggdm9pZCAqcHZFdmVudEdyb3VwLCBjb25zdCB1aW50MzJfdCB1bEJpdHNUb1NldCApIFBSSVZJTEVHRURfRlVOQ1RJT047Cit2b2lkIHZFdmVudEdyb3VwQ2xlYXJCaXRzQ2FsbGJhY2soIHZvaWQgKnB2RXZlbnRHcm91cCwgY29uc3QgdWludDMyX3QgdWxCaXRzVG9DbGVhciApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKworI2lmIChjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSkKKwlVQmFzZVR5cGVfdCB1eEV2ZW50R3JvdXBHZXROdW1iZXIoIHZvaWQqIHhFdmVudEdyb3VwICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKwl2b2lkIHZFdmVudEdyb3VwU2V0TnVtYmVyKCB2b2lkKiB4RXZlbnRHcm91cCwgVUJhc2VUeXBlX3QgdXhFdmVudEdyb3VwTnVtYmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogRVZFTlRfR1JPVVBTX0ggKi8KKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9saXN0LmggYi9Tb3VyY2UvaW5jbHVkZS9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzYWZhMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9pbmNsdWRlL2xpc3QuaApAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBsaXN0IGltcGxlbWVudGF0aW9uIHVzZWQgYnkgdGhlIHNjaGVkdWxlci4gIFdoaWxlIGl0IGlzIHRhaWxvcmVkCisgKiBoZWF2aWx5IGZvciB0aGUgc2NoZWR1bGVycyBuZWVkcywgaXQgaXMgYWxzbyBhdmFpbGFibGUgZm9yIHVzZSBieQorICogYXBwbGljYXRpb24gY29kZS4KKyAqCisgKiBsaXN0X3RzIGNhbiBvbmx5IHN0b3JlIHBvaW50ZXJzIHRvIGxpc3RfaXRlbV90cy4gIEVhY2ggTGlzdEl0ZW1fdCBjb250YWlucyBhCisgKiBudW1lcmljIHZhbHVlICh4SXRlbVZhbHVlKS4gIE1vc3Qgb2YgdGhlIHRpbWUgdGhlIGxpc3RzIGFyZSBzb3J0ZWQgaW4KKyAqIGRlc2NlbmRpbmcgaXRlbSB2YWx1ZSBvcmRlci4KKyAqCisgKiBMaXN0cyBhcmUgY3JlYXRlZCBhbHJlYWR5IGNvbnRhaW5pbmcgb25lIGxpc3QgaXRlbS4gIFRoZSB2YWx1ZSBvZiB0aGlzCisgKiBpdGVtIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHRoYXQgY2FuIGJlIHN0b3JlZCwgaXQgaXMgdGhlcmVmb3JlIGFsd2F5cyBhdAorICogdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQgYWN0cyBhcyBhIG1hcmtlci4gIFRoZSBsaXN0IG1lbWJlciBweEhlYWQgYWx3YXlzCisgKiBwb2ludHMgdG8gdGhpcyBtYXJrZXIgLSBldmVuIHRob3VnaCBpdCBpcyBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gIFRoaXMKKyAqIGlzIGJlY2F1c2UgdGhlIHRhaWwgY29udGFpbnMgYSB3cmFwIGJhY2sgcG9pbnRlciB0byB0aGUgdHJ1ZSBoZWFkIG9mCisgKiB0aGUgbGlzdC4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byBpdCdzIHZhbHVlLCBlYWNoIGxpc3QgaXRlbSBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIG5leHQKKyAqIGl0ZW0gaW4gdGhlIGxpc3QgKHB4TmV4dCksIGEgcG9pbnRlciB0byB0aGUgbGlzdCBpdCBpcyBpbiAocHhDb250YWluZXIpCisgKiBhbmQgYSBwb2ludGVyIHRvIGJhY2sgdG8gdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0LiAgVGhlc2UgbGF0ZXIgdHdvCisgKiBwb2ludGVycyBhcmUgaW5jbHVkZWQgZm9yIGVmZmljaWVuY3kgb2YgbGlzdCBtYW5pcHVsYXRpb24uICBUaGVyZSBpcworICogZWZmZWN0aXZlbHkgYSB0d28gd2F5IGxpbmsgYmV0d2VlbiB0aGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpc3QgaXRlbSBhbmQKKyAqIHRoZSBsaXN0IGl0ZW0gaXRzZWxmLgorICoKKyAqCisgKiBccGFnZSBMaXN0SW50cm9kdWN0aW9uIExpc3QgSW1wbGVtZW50YXRpb24KKyAqIFxpbmdyb3VwIEZyZWVSVE9TSW50cm8KKyAqLworCisjaWZuZGVmIElOQ19GUkVFUlRPU19ICisJI2Vycm9yIEZyZWVSVE9TLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgbGlzdC5oCisjZW5kaWYKKworI2lmbmRlZiBMSVNUX0gKKyNkZWZpbmUgTElTVF9ICisKKy8qCisgKiBUaGUgbGlzdCBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgbW9kaWZpZWQgZnJvbSB3aXRoaW4gaW50ZXJydXB0cywgYW5kIHRoZXJlZm9yZQorICogYnkgcmlnaHRzIHNob3VsZCBiZSBkZWNsYXJlZCB2b2xhdGlsZS4gIEhvd2V2ZXIsIHRoZXkgYXJlIG9ubHkgbW9kaWZpZWQgaW4gYQorICogZnVuY3Rpb25hbGx5IGF0b21pYyB3YXkgKHdpdGhpbiBjcml0aWNhbCBzZWN0aW9ucyBvZiB3aXRoIHRoZSBzY2hlZHVsZXIKKyAqIHN1c3BlbmRlZCkgYW5kIGFyZSBlaXRoZXIgcGFzc2VkIGJ5IHJlZmVyZW5jZSBpbnRvIGEgZnVuY3Rpb24gb3IgaW5kZXhlZCB2aWEKKyAqIGEgdm9sYXRpbGUgdmFyaWFibGUuICBUaGVyZWZvcmUsIGluIGFsbCB1c2UgY2FzZXMgdGVzdGVkIHNvIGZhciwgdGhlIHZvbGF0aWxlCisgKiBxdWFsaWZpZXIgY2FuIGJlIG9taXR0ZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIG1vZGVyYXRlIHBlcmZvcm1hbmNlCisgKiBpbXByb3ZlbWVudCB3aXRob3V0IGFkdmVyc2VseSBhZmZlY3RpbmcgZnVuY3Rpb25hbCBiZWhhdmlvdXIuICBUaGUgYXNzZW1ibHkKKyAqIGluc3RydWN0aW9ucyBnZW5lcmF0ZWQgYnkgdGhlIElBUiwgQVJNIGFuZCBHQ0MgY29tcGlsZXJzIHdoZW4gdGhlIHJlc3BlY3RpdmUKKyAqIGNvbXBpbGVyJ3Mgb3B0aW9ucyB3ZXJlIHNldCBmb3IgbWF4aW11bSBvcHRpbWlzYXRpb24gaGFzIGJlZW4gaW5zcGVjdGVkIGFuZAorICogZGVlbWVkIHRvIGJlIGFzIGludGVuZGVkLiAgVGhhdCBzYWlkLCBhcyBjb21waWxlciB0ZWNobm9sb2d5IGFkdmFuY2VzLCBhbmQKKyAqIGVzcGVjaWFsbHkgaWYgYWdncmVzc2l2ZSBjcm9zcyBtb2R1bGUgb3B0aW1pc2F0aW9uIGlzIHVzZWQgKGEgdXNlIGNhc2UgdGhhdAorICogaGFzIG5vdCBiZWVuIGV4ZXJjaXNlZCB0byBhbnkgZ3JlYXQgZXh0ZW5kKSB0aGVuIGl0IGlzIGZlYXNpYmxlIHRoYXQgdGhlCisgKiB2b2xhdGlsZSBxdWFsaWZpZXIgd2lsbCBiZSBuZWVkZWQgZm9yIGNvcnJlY3Qgb3B0aW1pc2F0aW9uLiAgSXQgaXMgZXhwZWN0ZWQKKyAqIHRoYXQgYSBjb21waWxlciByZW1vdmluZyBlc3NlbnRpYWwgY29kZSBiZWNhdXNlLCB3aXRob3V0IHRoZSB2b2xhdGlsZQorICogcXVhbGlmaWVyIG9uIHRoZSBsaXN0IHN0cnVjdHVyZSBtZW1iZXJzIGFuZCB3aXRoIGFnZ3Jlc3NpdmUgY3Jvc3MgbW9kdWxlCisgKiBvcHRpbWlzYXRpb24sIHRoZSBjb21waWxlciBkZWVtZWQgdGhlIGNvZGUgdW5uZWNlc3Nhcnkgd2lsbCByZXN1bHQgaW4KKyAqIGNvbXBsZXRlIGFuZCBvYnZpb3VzIGZhaWx1cmUgb2YgdGhlIHNjaGVkdWxlci4gIElmIHRoaXMgaXMgZXZlciBleHBlcmllbmNlZAorICogdGhlbiB0aGUgdm9sYXRpbGUgcXVhbGlmaWVyIGNhbiBiZSBpbnNlcnRlZCBpbiB0aGUgcmVsZXZhbnQgcGxhY2VzIHdpdGhpbiB0aGUKKyAqIGxpc3Qgc3RydWN0dXJlcyBieSBzaW1wbHkgZGVmaW5pbmcgY29uZmlnTElTVF9WT0xBVElMRSB0byB2b2xhdGlsZSBpbgorICogRnJlZVJUT1NDb25maWcuaCAoYXMgcGVyIHRoZSBleGFtcGxlIGF0IHRoZSBib3R0b20gb2YgdGhpcyBjb21tZW50IGJsb2NrKS4KKyAqIElmIGNvbmZpZ0xJU1RfVk9MQVRJTEUgaXMgbm90IGRlZmluZWQgdGhlbiB0aGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYmVsb3cKKyAqIHdpbGwgc2ltcGx5ICNkZWZpbmUgY29uZmlnTElTVF9WT0xBVElMRSBhd2F5IGNvbXBsZXRlbHkuCisgKgorICogVG8gdXNlIHZvbGF0aWxlIGxpc3Qgc3RydWN0dXJlIG1lbWJlcnMgdGhlbiBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvCisgKiBGcmVlUlRPU0NvbmZpZy5oICh3aXRob3V0IHRoZSBxdW90ZXMpOgorICogIiNkZWZpbmUgY29uZmlnTElTVF9WT0xBVElMRSB2b2xhdGlsZSIKKyAqLworI2lmbmRlZiBjb25maWdMSVNUX1ZPTEFUSUxFCisJI2RlZmluZSBjb25maWdMSVNUX1ZPTEFUSUxFCisjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9DUk9TU19NT0RVTEVfT1BUSU1JU0FUSU9OICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogTWFjcm9zIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGxhY2Uga25vd24gdmFsdWVzIHdpdGhpbiB0aGUgbGlzdCBzdHJ1Y3R1cmVzLAordGhlbiBjaGVjayB0aGF0IHRoZSBrbm93biB2YWx1ZXMgZG8gbm90IGdldCBjb3JydXB0ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YKK3RoZSBhcHBsaWNhdGlvbi4gICBUaGVzZSBtYXkgY2F0Y2ggdGhlIGxpc3QgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIG92ZXJ3cml0dGVuIGluCittZW1vcnkuICBUaGV5IHdpbGwgbm90IGNhdGNoIGRhdGEgZXJyb3JzIGNhdXNlZCBieSBpbmNvcnJlY3QgY29uZmlndXJhdGlvbiBvcgordXNlIG9mIEZyZWVSVE9TLiovCisjaWYoIGNvbmZpZ1VTRV9MSVNUX0RBVEFfSU5URUdSSVRZX0NIRUNLX0JZVEVTID09IDAgKQorCS8qIERlZmluZSB0aGUgbWFjcm9zIHRvIGRvIG5vdGhpbmcuICovCisJI2RlZmluZSBsaXN0RklSU1RfTElTVF9JVEVNX0lOVEVHUklUWV9DSEVDS19WQUxVRQorCSNkZWZpbmUgbGlzdFNFQ09ORF9MSVNUX0lURU1fSU5URUdSSVRZX0NIRUNLX1ZBTFVFCisJI2RlZmluZSBsaXN0RklSU1RfTElTVF9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUKKwkjZGVmaW5lIGxpc3RTRUNPTkRfTElTVF9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUKKwkjZGVmaW5lIGxpc3RTRVRfRklSU1RfTElTVF9JVEVNX0lOVEVHUklUWV9DSEVDS19WQUxVRSggcHhJdGVtICkKKwkjZGVmaW5lIGxpc3RTRVRfU0VDT05EX0xJU1RfSVRFTV9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUoIHB4SXRlbSApCisJI2RlZmluZSBsaXN0U0VUX0xJU1RfSU5URUdSSVRZX0NIRUNLXzFfVkFMVUUoIHB4TGlzdCApCisJI2RlZmluZSBsaXN0U0VUX0xJU1RfSU5URUdSSVRZX0NIRUNLXzJfVkFMVUUoIHB4TGlzdCApCisJI2RlZmluZSBsaXN0VEVTVF9MSVNUX0lURU1fSU5URUdSSVRZKCBweEl0ZW0gKQorCSNkZWZpbmUgbGlzdFRFU1RfTElTVF9JTlRFR1JJVFkoIHB4TGlzdCApCisjZWxzZQorCS8qIERlZmluZSBtYWNyb3MgdGhhdCBhZGQgbmV3IG1lbWJlcnMgaW50byB0aGUgbGlzdCBzdHJ1Y3R1cmVzLiAqLworCSNkZWZpbmUgbGlzdEZJUlNUX0xJU1RfSVRFTV9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUJCQkJVGlja1R5cGVfdCB4TGlzdEl0ZW1JbnRlZ3JpdHlWYWx1ZTE7CisJI2RlZmluZSBsaXN0U0VDT05EX0xJU1RfSVRFTV9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUJCQkJVGlja1R5cGVfdCB4TGlzdEl0ZW1JbnRlZ3JpdHlWYWx1ZTI7CisJI2RlZmluZSBsaXN0RklSU1RfTElTVF9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUJCQkJCVRpY2tUeXBlX3QgeExpc3RJbnRlZ3JpdHlWYWx1ZTE7CisJI2RlZmluZSBsaXN0U0VDT05EX0xJU1RfSU5URUdSSVRZX0NIRUNLX1ZBTFVFCQkJCQlUaWNrVHlwZV90IHhMaXN0SW50ZWdyaXR5VmFsdWUyOworCisJLyogRGVmaW5lIG1hY3JvcyB0aGF0IHNldCB0aGUgbmV3IHN0cnVjdHVyZSBtZW1iZXJzIHRvIGtub3duIHZhbHVlcy4gKi8KKwkjZGVmaW5lIGxpc3RTRVRfRklSU1RfTElTVF9JVEVNX0lOVEVHUklUWV9DSEVDS19WQUxVRSggcHhJdGVtICkJCSggcHhJdGVtICktPnhMaXN0SXRlbUludGVncml0eVZhbHVlMSA9IHBkSU5URUdSSVRZX0NIRUNLX1ZBTFVFCisJI2RlZmluZSBsaXN0U0VUX1NFQ09ORF9MSVNUX0lURU1fSU5URUdSSVRZX0NIRUNLX1ZBTFVFKCBweEl0ZW0gKQkoIHB4SXRlbSApLT54TGlzdEl0ZW1JbnRlZ3JpdHlWYWx1ZTIgPSBwZElOVEVHUklUWV9DSEVDS19WQUxVRQorCSNkZWZpbmUgbGlzdFNFVF9MSVNUX0lOVEVHUklUWV9DSEVDS18xX1ZBTFVFKCBweExpc3QgKQkJKCBweExpc3QgKS0+eExpc3RJbnRlZ3JpdHlWYWx1ZTEgPSBwZElOVEVHUklUWV9DSEVDS19WQUxVRQorCSNkZWZpbmUgbGlzdFNFVF9MSVNUX0lOVEVHUklUWV9DSEVDS18yX1ZBTFVFKCBweExpc3QgKQkJKCBweExpc3QgKS0+eExpc3RJbnRlZ3JpdHlWYWx1ZTIgPSBwZElOVEVHUklUWV9DSEVDS19WQUxVRQorCisJLyogRGVmaW5lIG1hY3JvcyB0aGF0IHdpbGwgYXNzZXJ0IGlmIG9uZSBvZiB0aGUgc3RydWN0dXJlIG1lbWJlcnMgZG9lcyBub3QKKwljb250YWluIGl0cyBleHBlY3RlZCB2YWx1ZS4gKi8KKwkjZGVmaW5lIGxpc3RURVNUX0xJU1RfSVRFTV9JTlRFR1JJVFkoIHB4SXRlbSApCQljb25maWdBU1NFUlQoICggKCBweEl0ZW0gKS0+eExpc3RJdGVtSW50ZWdyaXR5VmFsdWUxID09IHBkSU5URUdSSVRZX0NIRUNLX1ZBTFVFICkgJiYgKCAoIHB4SXRlbSApLT54TGlzdEl0ZW1JbnRlZ3JpdHlWYWx1ZTIgPT0gcGRJTlRFR1JJVFlfQ0hFQ0tfVkFMVUUgKSApCisJI2RlZmluZSBsaXN0VEVTVF9MSVNUX0lOVEVHUklUWSggcHhMaXN0ICkJCQljb25maWdBU1NFUlQoICggKCBweExpc3QgKS0+eExpc3RJbnRlZ3JpdHlWYWx1ZTEgPT0gcGRJTlRFR1JJVFlfQ0hFQ0tfVkFMVUUgKSAmJiAoICggcHhMaXN0ICktPnhMaXN0SW50ZWdyaXR5VmFsdWUyID09IHBkSU5URUdSSVRZX0NIRUNLX1ZBTFVFICkgKQorI2VuZGlmIC8qIGNvbmZpZ1VTRV9MSVNUX0RBVEFfSU5URUdSSVRZX0NIRUNLX0JZVEVTICovCisKKworLyoKKyAqIERlZmluaXRpb24gb2YgdGhlIG9ubHkgdHlwZSBvZiBvYmplY3QgdGhhdCBhIGxpc3QgY2FuIGNvbnRhaW4uCisgKi8KK3N0cnVjdCB4TElTVF9JVEVNCit7CisJbGlzdEZJUlNUX0xJU1RfSVRFTV9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUJCQkvKjwgU2V0IHRvIGEga25vd24gdmFsdWUgaWYgY29uZmlnVVNFX0xJU1RfREFUQV9JTlRFR1JJVFlfQ0hFQ0tfQllURVMgaXMgc2V0IHRvIDEuICovCisJY29uZmlnTElTVF9WT0xBVElMRSBUaWNrVHlwZV90IHhJdGVtVmFsdWU7CQkJLyo8IFRoZSB2YWx1ZSBiZWluZyBsaXN0ZWQuICBJbiBtb3N0IGNhc2VzIHRoaXMgaXMgdXNlZCB0byBzb3J0IHRoZSBsaXN0IGluIGRlc2NlbmRpbmcgb3JkZXIuICovCisJc3RydWN0IHhMSVNUX0lURU0gKiBjb25maWdMSVNUX1ZPTEFUSUxFIHB4TmV4dDsJCS8qPCBQb2ludGVyIHRvIHRoZSBuZXh0IExpc3RJdGVtX3QgaW4gdGhlIGxpc3QuICovCisJc3RydWN0IHhMSVNUX0lURU0gKiBjb25maWdMSVNUX1ZPTEFUSUxFIHB4UHJldmlvdXM7CS8qPCBQb2ludGVyIHRvIHRoZSBwcmV2aW91cyBMaXN0SXRlbV90IGluIHRoZSBsaXN0LiAqLworCXZvaWQgKiBwdk93bmVyOwkJCQkJCQkJCQkvKjwgUG9pbnRlciB0byB0aGUgb2JqZWN0IChub3JtYWxseSBhIFRDQikgdGhhdCBjb250YWlucyB0aGUgbGlzdCBpdGVtLiAgVGhlcmUgaXMgdGhlcmVmb3JlIGEgdHdvIHdheSBsaW5rIGJldHdlZW4gdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBsaXN0IGl0ZW0gYW5kIHRoZSBsaXN0IGl0ZW0gaXRzZWxmLiAqLworCXZvaWQgKiBjb25maWdMSVNUX1ZPTEFUSUxFIHB2Q29udGFpbmVyOwkJCQkvKjwgUG9pbnRlciB0byB0aGUgbGlzdCBpbiB3aGljaCB0aGlzIGxpc3QgaXRlbSBpcyBwbGFjZWQgKGlmIGFueSkuICovCisJbGlzdFNFQ09ORF9MSVNUX0lURU1fSU5URUdSSVRZX0NIRUNLX1ZBTFVFCQkJLyo8IFNldCB0byBhIGtub3duIHZhbHVlIGlmIGNvbmZpZ1VTRV9MSVNUX0RBVEFfSU5URUdSSVRZX0NIRUNLX0JZVEVTIGlzIHNldCB0byAxLiAqLworfTsKK3R5cGVkZWYgc3RydWN0IHhMSVNUX0lURU0gTGlzdEl0ZW1fdDsJCQkJCS8qIEZvciBzb21lIHJlYXNvbiBsaW50IHdhbnRzIHRoaXMgYXMgdHdvIHNlcGFyYXRlIGRlZmluaXRpb25zLiAqLworCitzdHJ1Y3QgeE1JTklfTElTVF9JVEVNCit7CisJbGlzdEZJUlNUX0xJU1RfSVRFTV9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUJCQkvKjwgU2V0IHRvIGEga25vd24gdmFsdWUgaWYgY29uZmlnVVNFX0xJU1RfREFUQV9JTlRFR1JJVFlfQ0hFQ0tfQllURVMgaXMgc2V0IHRvIDEuICovCisJY29uZmlnTElTVF9WT0xBVElMRSBUaWNrVHlwZV90IHhJdGVtVmFsdWU7CisJc3RydWN0IHhMSVNUX0lURU0gKiBjb25maWdMSVNUX1ZPTEFUSUxFIHB4TmV4dDsKKwlzdHJ1Y3QgeExJU1RfSVRFTSAqIGNvbmZpZ0xJU1RfVk9MQVRJTEUgcHhQcmV2aW91czsKK307Cit0eXBlZGVmIHN0cnVjdCB4TUlOSV9MSVNUX0lURU0gTWluaUxpc3RJdGVtX3Q7CisKKy8qCisgKiBEZWZpbml0aW9uIG9mIHRoZSB0eXBlIG9mIHF1ZXVlIHVzZWQgYnkgdGhlIHNjaGVkdWxlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeExJU1QKK3sKKwlsaXN0RklSU1RfTElTVF9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUJCQkJLyo8IFNldCB0byBhIGtub3duIHZhbHVlIGlmIGNvbmZpZ1VTRV9MSVNUX0RBVEFfSU5URUdSSVRZX0NIRUNLX0JZVEVTIGlzIHNldCB0byAxLiAqLworCXZvbGF0aWxlIFVCYXNlVHlwZV90IHV4TnVtYmVyT2ZJdGVtczsKKwlMaXN0SXRlbV90ICogY29uZmlnTElTVF9WT0xBVElMRSBweEluZGV4OwkJCS8qPCBVc2VkIHRvIHdhbGsgdGhyb3VnaCB0aGUgbGlzdC4gIFBvaW50cyB0byB0aGUgbGFzdCBpdGVtIHJldHVybmVkIGJ5IGEgY2FsbCB0byBsaXN0R0VUX09XTkVSX09GX05FWFRfRU5UUlkgKCkuICovCisJTWluaUxpc3RJdGVtX3QgeExpc3RFbmQ7CQkJCQkJCS8qPCBMaXN0IGl0ZW0gdGhhdCBjb250YWlucyB0aGUgbWF4aW11bSBwb3NzaWJsZSBpdGVtIHZhbHVlIG1lYW5pbmcgaXQgaXMgYWx3YXlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIGlzIHRoZXJlZm9yZSB1c2VkIGFzIGEgbWFya2VyLiAqLworCWxpc3RTRUNPTkRfTElTVF9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUJCQkJLyo8IFNldCB0byBhIGtub3duIHZhbHVlIGlmIGNvbmZpZ1VTRV9MSVNUX0RBVEFfSU5URUdSSVRZX0NIRUNLX0JZVEVTIGlzIHNldCB0byAxLiAqLworfSBMaXN0X3Q7CisKKy8qCisgKiBBY2Nlc3MgbWFjcm8gdG8gc2V0IHRoZSBvd25lciBvZiBhIGxpc3QgaXRlbS4gIFRoZSBvd25lciBvZiBhIGxpc3QgaXRlbQorICogaXMgdGhlIG9iamVjdCAodXN1YWxseSBhIFRDQikgdGhhdCBjb250YWlucyB0aGUgbGlzdCBpdGVtLgorICoKKyAqIFxwYWdlIGxpc3RTRVRfTElTVF9JVEVNX09XTkVSIGxpc3RTRVRfTElTVF9JVEVNX09XTkVSCisgKiBcaW5ncm91cCBMaW5rZWRMaXN0CisgKi8KKyNkZWZpbmUgbGlzdFNFVF9MSVNUX0lURU1fT1dORVIoIHB4TGlzdEl0ZW0sIHB4T3duZXIgKQkJKCAoIHB4TGlzdEl0ZW0gKS0+cHZPd25lciA9ICggdm9pZCAqICkgKCBweE93bmVyICkgKQorCisvKgorICogQWNjZXNzIG1hY3JvIHRvIGdldCB0aGUgb3duZXIgb2YgYSBsaXN0IGl0ZW0uICBUaGUgb3duZXIgb2YgYSBsaXN0IGl0ZW0KKyAqIGlzIHRoZSBvYmplY3QgKHVzdWFsbHkgYSBUQ0IpIHRoYXQgY29udGFpbnMgdGhlIGxpc3QgaXRlbS4KKyAqCisgKiBccGFnZSBsaXN0U0VUX0xJU1RfSVRFTV9PV05FUiBsaXN0U0VUX0xJU1RfSVRFTV9PV05FUgorICogXGluZ3JvdXAgTGlua2VkTGlzdAorICovCisjZGVmaW5lIGxpc3RHRVRfTElTVF9JVEVNX09XTkVSKCBweExpc3RJdGVtICkJKCAoIHB4TGlzdEl0ZW0gKS0+cHZPd25lciApCisKKy8qCisgKiBBY2Nlc3MgbWFjcm8gdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgbGlzdCBpdGVtLiAgSW4gbW9zdCBjYXNlcyB0aGUgdmFsdWUgaXMKKyAqIHVzZWQgdG8gc29ydCB0aGUgbGlzdCBpbiBkZXNjZW5kaW5nIG9yZGVyLgorICoKKyAqIFxwYWdlIGxpc3RTRVRfTElTVF9JVEVNX1ZBTFVFIGxpc3RTRVRfTElTVF9JVEVNX1ZBTFVFCisgKiBcaW5ncm91cCBMaW5rZWRMaXN0CisgKi8KKyNkZWZpbmUgbGlzdFNFVF9MSVNUX0lURU1fVkFMVUUoIHB4TGlzdEl0ZW0sIHhWYWx1ZSApCSggKCBweExpc3RJdGVtICktPnhJdGVtVmFsdWUgPSAoIHhWYWx1ZSApICkKKworLyoKKyAqIEFjY2VzcyBtYWNybyB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YgdGhlIGxpc3QgaXRlbS4gIFRoZSB2YWx1ZSBjYW4KKyAqIHJlcHJlc2VudCBhbnl0aGluZyAtIGZvciBleGFtcGxlIHRoZSBwcmlvcml0eSBvZiBhIHRhc2ssIG9yIHRoZSB0aW1lIGF0CisgKiB3aGljaCBhIHRhc2sgc2hvdWxkIGJlIHVuYmxvY2tlZC4KKyAqCisgKiBccGFnZSBsaXN0R0VUX0xJU1RfSVRFTV9WQUxVRSBsaXN0R0VUX0xJU1RfSVRFTV9WQUxVRQorICogXGluZ3JvdXAgTGlua2VkTGlzdAorICovCisjZGVmaW5lIGxpc3RHRVRfTElTVF9JVEVNX1ZBTFVFKCBweExpc3RJdGVtICkJKCAoIHB4TGlzdEl0ZW0gKS0+eEl0ZW1WYWx1ZSApCisKKy8qCisgKiBBY2Nlc3MgbWFjcm8gdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBsaXN0IGl0ZW0gYXQgdGhlIGhlYWQgb2YgYSBnaXZlbgorICogbGlzdC4KKyAqCisgKiBccGFnZSBsaXN0R0VUX0xJU1RfSVRFTV9WQUxVRSBsaXN0R0VUX0xJU1RfSVRFTV9WQUxVRQorICogXGluZ3JvdXAgTGlua2VkTGlzdAorICovCisjZGVmaW5lIGxpc3RHRVRfSVRFTV9WQUxVRV9PRl9IRUFEX0VOVFJZKCBweExpc3QgKQkoICggKCBweExpc3QgKS0+eExpc3RFbmQgKS5weE5leHQtPnhJdGVtVmFsdWUgKQorCisvKgorICogUmV0dXJuIHRoZSBsaXN0IGl0ZW0gYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgKgorICogXHBhZ2UgbGlzdEdFVF9IRUFEX0VOVFJZIGxpc3RHRVRfSEVBRF9FTlRSWQorICogXGluZ3JvdXAgTGlua2VkTGlzdAorICovCisjZGVmaW5lIGxpc3RHRVRfSEVBRF9FTlRSWSggcHhMaXN0ICkJKCAoICggcHhMaXN0ICktPnhMaXN0RW5kICkucHhOZXh0ICkKKworLyoKKyAqIFJldHVybiB0aGUgbGlzdCBpdGVtIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICoKKyAqIFxwYWdlIGxpc3RHRVRfTkVYVCBsaXN0R0VUX05FWFQKKyAqIFxpbmdyb3VwIExpbmtlZExpc3QKKyAqLworI2RlZmluZSBsaXN0R0VUX05FWFQoIHB4TGlzdEl0ZW0gKQkoICggcHhMaXN0SXRlbSApLT5weE5leHQgKQorCisvKgorICogUmV0dXJuIHRoZSBsaXN0IGl0ZW0gdGhhdCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBsaXN0CisgKgorICogXHBhZ2UgbGlzdEdFVF9FTkRfTUFSS0VSIGxpc3RHRVRfRU5EX01BUktFUgorICogXGluZ3JvdXAgTGlua2VkTGlzdAorICovCisjZGVmaW5lIGxpc3RHRVRfRU5EX01BUktFUiggcHhMaXN0ICkJKCAoIExpc3RJdGVtX3QgY29uc3QgKiApICggJiggKCBweExpc3QgKS0+eExpc3RFbmQgKSApICkKKworLyoKKyAqIEFjY2VzcyBtYWNybyB0byBkZXRlcm1pbmUgaWYgYSBsaXN0IGNvbnRhaW5zIGFueSBpdGVtcy4gIFRoZSBtYWNybyB3aWxsCisgKiBvbmx5IGhhdmUgdGhlIHZhbHVlIHRydWUgaWYgdGhlIGxpc3QgaXMgZW1wdHkuCisgKgorICogXHBhZ2UgbGlzdExJU1RfSVNfRU1QVFkgbGlzdExJU1RfSVNfRU1QVFkKKyAqIFxpbmdyb3VwIExpbmtlZExpc3QKKyAqLworI2RlZmluZSBsaXN0TElTVF9JU19FTVBUWSggcHhMaXN0ICkJKCAoIEJhc2VUeXBlX3QgKSAoICggcHhMaXN0ICktPnV4TnVtYmVyT2ZJdGVtcyA9PSAoIFVCYXNlVHlwZV90ICkgMCApICkKKworLyoKKyAqIEFjY2VzcyBtYWNybyB0byByZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdC4KKyAqLworI2RlZmluZSBsaXN0Q1VSUkVOVF9MSVNUX0xFTkdUSCggcHhMaXN0ICkJKCAoIHB4TGlzdCApLT51eE51bWJlck9mSXRlbXMgKQorCisvKgorICogQWNjZXNzIGZ1bmN0aW9uIHRvIG9idGFpbiB0aGUgb3duZXIgb2YgdGhlIG5leHQgZW50cnkgaW4gYSBsaXN0LgorICoKKyAqIFRoZSBsaXN0IG1lbWJlciBweEluZGV4IGlzIHVzZWQgdG8gd2FsayB0aHJvdWdoIGEgbGlzdC4gIENhbGxpbmcKKyAqIGxpc3RHRVRfT1dORVJfT0ZfTkVYVF9FTlRSWSBpbmNyZW1lbnRzIHB4SW5kZXggdG8gdGhlIG5leHQgaXRlbSBpbiB0aGUgbGlzdAorICogYW5kIHJldHVybnMgdGhhdCBlbnRyeSdzIHB4T3duZXIgcGFyYW1ldGVyLiAgVXNpbmcgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcworICogZnVuY3Rpb24gaXQgaXMgdGhlcmVmb3JlIHBvc3NpYmxlIHRvIG1vdmUgdGhyb3VnaCBldmVyeSBpdGVtIGNvbnRhaW5lZCBpbgorICogYSBsaXN0LgorICoKKyAqIFRoZSBweE93bmVyIHBhcmFtZXRlciBvZiBhIGxpc3QgaXRlbSBpcyBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IG93bnMKKyAqIHRoZSBsaXN0IGl0ZW0uICBJbiB0aGUgc2NoZWR1bGVyIHRoaXMgaXMgbm9ybWFsbHkgYSB0YXNrIGNvbnRyb2wgYmxvY2suCisgKiBUaGUgcHhPd25lciBwYXJhbWV0ZXIgZWZmZWN0aXZlbHkgY3JlYXRlcyBhIHR3byB3YXkgbGluayBiZXR3ZWVuIHRoZSBsaXN0CisgKiBpdGVtIGFuZCBpdHMgb3duZXIuCisgKgorICogQHBhcmFtIHB4VENCIHB4VENCIGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb3duZXIgb2YgdGhlIG5leHQgbGlzdCBpdGVtLgorICogQHBhcmFtIHB4TGlzdCBUaGUgbGlzdCBmcm9tIHdoaWNoIHRoZSBuZXh0IGl0ZW0gb3duZXIgaXMgdG8gYmUgcmV0dXJuZWQuCisgKgorICogXHBhZ2UgbGlzdEdFVF9PV05FUl9PRl9ORVhUX0VOVFJZIGxpc3RHRVRfT1dORVJfT0ZfTkVYVF9FTlRSWQorICogXGluZ3JvdXAgTGlua2VkTGlzdAorICovCisjZGVmaW5lIGxpc3RHRVRfT1dORVJfT0ZfTkVYVF9FTlRSWSggcHhUQ0IsIHB4TGlzdCApCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKK0xpc3RfdCAqIGNvbnN0IHB4Q29uc3RMaXN0ID0gKCBweExpc3QgKTsJCQkJCQkJCQkJCQkJXAorCS8qIEluY3JlbWVudCB0aGUgaW5kZXggdG8gdGhlIG5leHQgaXRlbSBhbmQgcmV0dXJuIHRoZSBpdGVtLCBlbnN1cmluZyAqLwkJCQlcCisJLyogd2UgZG9uJ3QgcmV0dXJuIHRoZSBtYXJrZXIgdXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgKi8JCQkJCQkJXAorCSggcHhDb25zdExpc3QgKS0+cHhJbmRleCA9ICggcHhDb25zdExpc3QgKS0+cHhJbmRleC0+cHhOZXh0OwkJCQkJCQlcCisJaWYoICggdm9pZCAqICkgKCBweENvbnN0TGlzdCApLT5weEluZGV4ID09ICggdm9pZCAqICkgJiggKCBweENvbnN0TGlzdCApLT54TGlzdEVuZCApICkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkoIHB4Q29uc3RMaXN0ICktPnB4SW5kZXggPSAoIHB4Q29uc3RMaXN0ICktPnB4SW5kZXgtPnB4TmV4dDsJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJKCBweFRDQiApID0gKCBweENvbnN0TGlzdCApLT5weEluZGV4LT5wdk93bmVyOwkJCQkJCQkJCQkJXAorfQorCisKKy8qCisgKiBBY2Nlc3MgZnVuY3Rpb24gdG8gb2J0YWluIHRoZSBvd25lciBvZiB0aGUgZmlyc3QgZW50cnkgaW4gYSBsaXN0LiAgTGlzdHMKKyAqIGFyZSBub3JtYWxseSBzb3J0ZWQgaW4gYXNjZW5kaW5nIGl0ZW0gdmFsdWUgb3JkZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBweE93bmVyIG1lbWJlciBvZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC4KKyAqIFRoZSBweE93bmVyIHBhcmFtZXRlciBvZiBhIGxpc3QgaXRlbSBpcyBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IG93bnMKKyAqIHRoZSBsaXN0IGl0ZW0uICBJbiB0aGUgc2NoZWR1bGVyIHRoaXMgaXMgbm9ybWFsbHkgYSB0YXNrIGNvbnRyb2wgYmxvY2suCisgKiBUaGUgcHhPd25lciBwYXJhbWV0ZXIgZWZmZWN0aXZlbHkgY3JlYXRlcyBhIHR3byB3YXkgbGluayBiZXR3ZWVuIHRoZSBsaXN0CisgKiBpdGVtIGFuZCBpdHMgb3duZXIuCisgKgorICogQHBhcmFtIHB4TGlzdCBUaGUgbGlzdCBmcm9tIHdoaWNoIHRoZSBvd25lciBvZiB0aGUgaGVhZCBpdGVtIGlzIHRvIGJlCisgKiByZXR1cm5lZC4KKyAqCisgKiBccGFnZSBsaXN0R0VUX09XTkVSX09GX0hFQURfRU5UUlkgbGlzdEdFVF9PV05FUl9PRl9IRUFEX0VOVFJZCisgKiBcaW5ncm91cCBMaW5rZWRMaXN0CisgKi8KKyNkZWZpbmUgbGlzdEdFVF9PV05FUl9PRl9IRUFEX0VOVFJZKCBweExpc3QgKSAgKCAoJiggKCBweExpc3QgKS0+eExpc3RFbmQgKSktPnB4TmV4dC0+cHZPd25lciApCisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgYSBsaXN0IGl0ZW0gaXMgd2l0aGluIGEgbGlzdC4gIFRoZSBsaXN0IGl0ZW0gbWFpbnRhaW5zIGEKKyAqICJjb250YWluZXIiIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gdGhlIGxpc3QgaXQgaXMgaW4uICBBbGwgdGhpcyBtYWNybyBkb2VzCisgKiBpcyBjaGVjayB0byBzZWUgaWYgdGhlIGNvbnRhaW5lciBhbmQgdGhlIGxpc3QgbWF0Y2guCisgKgorICogQHBhcmFtIHB4TGlzdCBUaGUgbGlzdCB3ZSB3YW50IHRvIGtub3cgaWYgdGhlIGxpc3QgaXRlbSBpcyB3aXRoaW4uCisgKiBAcGFyYW0gcHhMaXN0SXRlbSBUaGUgbGlzdCBpdGVtIHdlIHdhbnQgdG8ga25vdyBpZiBpcyBpbiB0aGUgbGlzdC4KKyAqIEByZXR1cm4gcGRUUlVFIGlmIHRoZSBsaXN0IGl0ZW0gaXMgaW4gdGhlIGxpc3QsIG90aGVyd2lzZSBwZEZBTFNFLgorICovCisjZGVmaW5lIGxpc3RJU19DT05UQUlORURfV0lUSElOKCBweExpc3QsIHB4TGlzdEl0ZW0gKSAoICggQmFzZVR5cGVfdCApICggKCBweExpc3RJdGVtICktPnB2Q29udGFpbmVyID09ICggdm9pZCAqICkgKCBweExpc3QgKSApICkKKworLyoKKyAqIFJldHVybiB0aGUgbGlzdCBhIGxpc3QgaXRlbSBpcyBjb250YWluZWQgd2l0aGluIChyZWZlcmVuY2VkIGZyb20pLgorICoKKyAqIEBwYXJhbSBweExpc3RJdGVtIFRoZSBsaXN0IGl0ZW0gYmVpbmcgcXVlcmllZC4KKyAqIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSBMaXN0X3Qgb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgcHhMaXN0SXRlbQorICovCisjZGVmaW5lIGxpc3RMSVNUX0lURU1fQ09OVEFJTkVSKCBweExpc3RJdGVtICkgKCAoIHB4TGlzdEl0ZW0gKS0+cHZDb250YWluZXIgKQorCisvKgorICogVGhpcyBwcm92aWRlcyBhIGNydWRlIG1lYW5zIG9mIGtub3dpbmcgaWYgYSBsaXN0IGhhcyBiZWVuIGluaXRpYWxpc2VkLCBhcworICogcHhMaXN0LT54TGlzdEVuZC54SXRlbVZhbHVlIGlzIHNldCB0byBwb3J0TUFYX0RFTEFZIGJ5IHRoZSB2TGlzdEluaXRpYWxpc2UoKQorICogZnVuY3Rpb24uCisgKi8KKyNkZWZpbmUgbGlzdExJU1RfSVNfSU5JVElBTElTRUQoIHB4TGlzdCApICggKCBweExpc3QgKS0+eExpc3RFbmQueEl0ZW1WYWx1ZSA9PSBwb3J0TUFYX0RFTEFZICkKKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhIGxpc3QgaXMgdXNlZCEgIFRoaXMgaW5pdGlhbGlzZXMgYWxsIHRoZSBtZW1iZXJzCisgKiBvZiB0aGUgbGlzdCBzdHJ1Y3R1cmUgYW5kIGluc2VydHMgdGhlIHhMaXN0RW5kIGl0ZW0gaW50byB0aGUgbGlzdCBhcyBhCisgKiBtYXJrZXIgdG8gdGhlIGJhY2sgb2YgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIHB4TGlzdCBQb2ludGVyIHRvIHRoZSBsaXN0IGJlaW5nIGluaXRpYWxpc2VkLgorICoKKyAqIFxwYWdlIHZMaXN0SW5pdGlhbGlzZSB2TGlzdEluaXRpYWxpc2UKKyAqIFxpbmdyb3VwIExpbmtlZExpc3QKKyAqLwordm9pZCB2TGlzdEluaXRpYWxpc2UoIExpc3RfdCAqIGNvbnN0IHB4TGlzdCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYSBsaXN0IGl0ZW0gaXMgdXNlZC4gIFRoaXMgc2V0cyB0aGUgbGlzdCBjb250YWluZXIgdG8KKyAqIG51bGwgc28gdGhlIGl0ZW0gZG9lcyBub3QgdGhpbmsgdGhhdCBpdCBpcyBhbHJlYWR5IGNvbnRhaW5lZCBpbiBhIGxpc3QuCisgKgorICogQHBhcmFtIHB4SXRlbSBQb2ludGVyIHRvIHRoZSBsaXN0IGl0ZW0gYmVpbmcgaW5pdGlhbGlzZWQuCisgKgorICogXHBhZ2Ugdkxpc3RJbml0aWFsaXNlSXRlbSB2TGlzdEluaXRpYWxpc2VJdGVtCisgKiBcaW5ncm91cCBMaW5rZWRMaXN0CisgKi8KK3ZvaWQgdkxpc3RJbml0aWFsaXNlSXRlbSggTGlzdEl0ZW1fdCAqIGNvbnN0IHB4SXRlbSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBJbnNlcnQgYSBsaXN0IGl0ZW0gaW50byBhIGxpc3QuICBUaGUgaXRlbSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGxpc3QgaW4KKyAqIGEgcG9zaXRpb24gZGV0ZXJtaW5lZCBieSBpdHMgaXRlbSB2YWx1ZSAoZGVzY2VuZGluZyBpdGVtIHZhbHVlIG9yZGVyKS4KKyAqCisgKiBAcGFyYW0gcHhMaXN0IFRoZSBsaXN0IGludG8gd2hpY2ggdGhlIGl0ZW0gaXMgdG8gYmUgaW5zZXJ0ZWQuCisgKgorICogQHBhcmFtIHB4TmV3TGlzdEl0ZW0gVGhlIGl0ZW0gdGhhdCBpcyB0byBiZSBwbGFjZWQgaW4gdGhlIGxpc3QuCisgKgorICogXHBhZ2Ugdkxpc3RJbnNlcnQgdkxpc3RJbnNlcnQKKyAqIFxpbmdyb3VwIExpbmtlZExpc3QKKyAqLwordm9pZCB2TGlzdEluc2VydCggTGlzdF90ICogY29uc3QgcHhMaXN0LCBMaXN0SXRlbV90ICogY29uc3QgcHhOZXdMaXN0SXRlbSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBJbnNlcnQgYSBsaXN0IGl0ZW0gaW50byBhIGxpc3QuICBUaGUgaXRlbSB3aWxsIGJlIGluc2VydGVkIGluIGEgcG9zaXRpb24KKyAqIHN1Y2ggdGhhdCBpdCB3aWxsIGJlIHRoZSBsYXN0IGl0ZW0gd2l0aGluIHRoZSBsaXN0IHJldHVybmVkIGJ5IG11bHRpcGxlCisgKiBjYWxscyB0byBsaXN0R0VUX09XTkVSX09GX05FWFRfRU5UUlkuCisgKgorICogVGhlIGxpc3QgbWVtYmVyIHB4SW5kZXggaXMgdXNlZCB0byB3YWxrIHRocm91Z2ggYSBsaXN0LiAgQ2FsbGluZworICogbGlzdEdFVF9PV05FUl9PRl9ORVhUX0VOVFJZIGluY3JlbWVudHMgcHhJbmRleCB0byB0aGUgbmV4dCBpdGVtIGluIHRoZSBsaXN0LgorICogUGxhY2luZyBhbiBpdGVtIGluIGEgbGlzdCB1c2luZyB2TGlzdEluc2VydEVuZCBlZmZlY3RpdmVseSBwbGFjZXMgdGhlIGl0ZW0KKyAqIGluIHRoZSBsaXN0IHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgcHhJbmRleC4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBvdGhlcgorICogaXRlbSB3aXRoaW4gdGhlIGxpc3Qgd2lsbCBiZSByZXR1cm5lZCBieSBsaXN0R0VUX09XTkVSX09GX05FWFRfRU5UUlkgYmVmb3JlCisgKiB0aGUgcHhJbmRleCBwYXJhbWV0ZXIgYWdhaW4gcG9pbnRzIHRvIHRoZSBpdGVtIGJlaW5nIGluc2VydGVkLgorICoKKyAqIEBwYXJhbSBweExpc3QgVGhlIGxpc3QgaW50byB3aGljaCB0aGUgaXRlbSBpcyB0byBiZSBpbnNlcnRlZC4KKyAqCisgKiBAcGFyYW0gcHhOZXdMaXN0SXRlbSBUaGUgbGlzdCBpdGVtIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGxpc3QuCisgKgorICogXHBhZ2Ugdkxpc3RJbnNlcnRFbmQgdkxpc3RJbnNlcnRFbmQKKyAqIFxpbmdyb3VwIExpbmtlZExpc3QKKyAqLwordm9pZCB2TGlzdEluc2VydEVuZCggTGlzdF90ICogY29uc3QgcHhMaXN0LCBMaXN0SXRlbV90ICogY29uc3QgcHhOZXdMaXN0SXRlbSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBSZW1vdmUgYW4gaXRlbSBmcm9tIGEgbGlzdC4gIFRoZSBsaXN0IGl0ZW0gaGFzIGEgcG9pbnRlciB0byB0aGUgbGlzdCB0aGF0CisgKiBpdCBpcyBpbiwgc28gb25seSB0aGUgbGlzdCBpdGVtIG5lZWQgYmUgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB1eExpc3RSZW1vdmUgVGhlIGl0ZW0gdG8gYmUgcmVtb3ZlZC4gIFRoZSBpdGVtIHdpbGwgcmVtb3ZlIGl0c2VsZiBmcm9tCisgKiB0aGUgbGlzdCBwb2ludGVkIHRvIGJ5IGl0J3MgcHhDb250YWluZXIgcGFyYW1ldGVyLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHJlbWFpbiBpbiB0aGUgbGlzdCBhZnRlciB0aGUgbGlzdCBpdGVtIGhhcworICogYmVlbiByZW1vdmVkLgorICoKKyAqIFxwYWdlIHV4TGlzdFJlbW92ZSB1eExpc3RSZW1vdmUKKyAqIFxpbmdyb3VwIExpbmtlZExpc3QKKyAqLworVUJhc2VUeXBlX3QgdXhMaXN0UmVtb3ZlKCBMaXN0SXRlbV90ICogY29uc3QgcHhJdGVtVG9SZW1vdmUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvU291cmNlL2luY2x1ZGUvbWVzc2FnZV9idWZmZXIuaCBiL1NvdXJjZS9pbmNsdWRlL21lc3NhZ2VfYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMzRmYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9pbmNsdWRlL21lc3NhZ2VfYnVmZmVyLmgKQEAgLTAsMCArMSw3NzkgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisKKy8qCisgKiBNZXNzYWdlIGJ1ZmZlcnMgYnVpbGQgZnVuY3Rpb25hbGl0eSBvbiB0b3Agb2YgRnJlZVJUT1Mgc3RyZWFtIGJ1ZmZlcnMuCisgKiBXaGVyZWFzIHN0cmVhbSBidWZmZXJzIGFyZSB1c2VkIHRvIHNlbmQgYSBjb250aW51b3VzIHN0cmVhbSBvZiBkYXRhIGZyb20gb25lCisgKiB0YXNrIG9yIGludGVycnVwdCB0byBhbm90aGVyLCBtZXNzYWdlIGJ1ZmZlcnMgYXJlIHVzZWQgdG8gc2VuZCB2YXJpYWJsZQorICogbGVuZ3RoIGRpc2NyZXRlIG1lc3NhZ2VzIGZyb20gb25lIHRhc2sgb3IgaW50ZXJydXB0IHRvIGFub3RoZXIuICBUaGVpcgorICogaW1wbGVtZW50YXRpb24gaXMgbGlnaHQgd2VpZ2h0LCBtYWtpbmcgdGhlbSBwYXJ0aWN1bGFybHkgc3VpdGVkIGZvciBpbnRlcnJ1cHQKKyAqIHRvIHRhc2sgYW5kIGNvcmUgdG8gY29yZSBjb21tdW5pY2F0aW9uIHNjZW5hcmlvcy4KKyAqCisgKiAqKipOT1RFKioqOiAgVW5pcXVlbHkgYW1vbmcgRnJlZVJUT1Mgb2JqZWN0cywgdGhlIHN0cmVhbSBidWZmZXIKKyAqIGltcGxlbWVudGF0aW9uIChzbyBhbHNvIHRoZSBtZXNzYWdlIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiwgYXMgbWVzc2FnZSBidWZmZXJzCisgKiBhcmUgYnVpbHQgb24gdG9wIG9mIHN0cmVhbSBidWZmZXJzKSBhc3N1bWVzIHRoZXJlIGlzIG9ubHkgb25lIHRhc2sgb3IKKyAqIGludGVycnVwdCB0aGF0IHdpbGwgd3JpdGUgdG8gdGhlIGJ1ZmZlciAodGhlIHdyaXRlciksIGFuZCBvbmx5IG9uZSB0YXNrIG9yCisgKiBpbnRlcnJ1cHQgdGhhdCB3aWxsIHJlYWQgZnJvbSB0aGUgYnVmZmVyICh0aGUgcmVhZGVyKS4gIEl0IGlzIHNhZmUgZm9yIHRoZQorICogd3JpdGVyIGFuZCByZWFkZXIgdG8gYmUgZGlmZmVyZW50IHRhc2tzIG9yIGludGVycnVwdHMsIGJ1dCwgdW5saWtlIG90aGVyCisgKiBGcmVlUlRPUyBvYmplY3RzLCBpdCBpcyBub3Qgc2FmZSB0byBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCB3cml0ZXJzIG9yCisgKiBtdWx0aXBsZSBkaWZmZXJlbnQgcmVhZGVycy4gIElmIHRoZXJlIGFyZSB0byBiZSBtdWx0aXBsZSBkaWZmZXJlbnQgd3JpdGVycworICogdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgcGxhY2UgZWFjaCBjYWxsIHRvIGEgd3JpdGluZyBBUEkgZnVuY3Rpb24KKyAqIChzdWNoIGFzIHhNZXNzYWdlQnVmZmVyU2VuZCgpKSBpbnNpZGUgYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBzZXQgdGhlIHNlbmQKKyAqIGJsb2NrIHRpbWUgdG8gMC4gIExpa2V3aXNlLCBpZiB0aGVyZSBhcmUgdG8gYmUgbXVsdGlwbGUgZGlmZmVyZW50IHJlYWRlcnMKKyAqIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0IHBsYWNlIGVhY2ggY2FsbCB0byBhIHJlYWRpbmcgQVBJIGZ1bmN0aW9uCisgKiAoc3VjaCBhcyB4TWVzc2FnZUJ1ZmZlclJlYWQoKSkgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2V0IHRoZSByZWNlaXZlCisgKiB0aW1lb3V0IHRvIDAuCisgKgorICogTWVzc2FnZSBidWZmZXJzIGhvbGQgdmFyaWFibGUgbGVuZ3RoIG1lc3NhZ2VzLiAgVG8gZW5hYmxlIHRoYXQsIHdoZW4gYQorICogbWVzc2FnZSBpcyB3cml0dGVuIHRvIHRoZSBtZXNzYWdlIGJ1ZmZlciBhbiBhZGRpdGlvbmFsIHNpemVvZiggc2l6ZV90ICkgYnl0ZXMKKyAqIGFyZSBhbHNvIHdyaXR0ZW4gdG8gc3RvcmUgdGhlIG1lc3NhZ2UncyBsZW5ndGggKHRoYXQgaGFwcGVucyBpbnRlcm5hbGx5LCB3aXRoCisgKiB0aGUgQVBJIGZ1bmN0aW9uKS4gIHNpemVvZiggc2l6ZV90ICkgaXMgdHlwaWNhbGx5IDQgYnl0ZXMgb24gYSAzMi1iaXQKKyAqIGFyY2hpdGVjdHVyZSwgc28gd3JpdGluZyBhIDEwIGJ5dGUgbWVzc2FnZSB0byBhIG1lc3NhZ2UgYnVmZmVyIG9uIGEgMzItYml0CisgKiBhcmNoaXRlY3R1cmUgd2lsbCBhY3R1YWxseSByZWR1Y2UgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgbWVzc2FnZSBidWZmZXIKKyAqIGJ5IDE0IGJ5dGVzICgxMCBieXRlIGFyZSB1c2VkIGJ5IHRoZSBtZXNzYWdlLCBhbmQgNCBieXRlcyB0byBob2xkIHRoZSBsZW5ndGgKKyAqIG9mIHRoZSBtZXNzYWdlKS4KKyAqLworCisjaWZuZGVmIEZSRUVSVE9TX01FU1NBR0VfQlVGRkVSX0gKKyNkZWZpbmUgRlJFRVJUT1NfTUVTU0FHRV9CVUZGRVJfSAorCisvKiBNZXNzYWdlIGJ1ZmZlcnMgYXJlIGJ1aWx0IG9udG8gb2Ygc3RyZWFtIGJ1ZmZlcnMuICovCisjaW5jbHVkZSAic3RyZWFtX2J1ZmZlci5oIgorCisjaWYgZGVmaW5lZCggX19jcGx1c3BsdXMgKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBUeXBlIGJ5IHdoaWNoIG1lc3NhZ2UgYnVmZmVycyBhcmUgcmVmZXJlbmNlZC4gIEZvciBleGFtcGxlLCBhIGNhbGwgdG8KKyAqIHhNZXNzYWdlQnVmZmVyQ3JlYXRlKCkgcmV0dXJucyBhbiBNZXNzYWdlQnVmZmVySGFuZGxlX3QgdmFyaWFibGUgdGhhdCBjYW4KKyAqIHRoZW4gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciB0byB4TWVzc2FnZUJ1ZmZlclNlbmQoKSwgeE1lc3NhZ2VCdWZmZXJSZWNlaXZlKCksCisgKiBldGMuCisgKi8KK3R5cGVkZWYgdm9pZCAqIE1lc3NhZ2VCdWZmZXJIYW5kbGVfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogbWVzc2FnZV9idWZmZXIuaAorICoKKzxwcmU+CitNZXNzYWdlQnVmZmVySGFuZGxlX3QgeE1lc3NhZ2VCdWZmZXJDcmVhdGUoIHNpemVfdCB4QnVmZmVyU2l6ZUJ5dGVzICk7Cis8L3ByZT4KKyAqCisgKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2UgYnVmZmVyIHVzaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkuICBTZWUKKyAqIHhNZXNzYWdlQnVmZmVyQ3JlYXRlU3RhdGljKCkgZm9yIGEgdmVyc2lvbiB0aGF0IHVzZXMgc3RhdGljYWxseSBhbGxvY2F0ZWQKKyAqIG1lbW9yeSAobWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGF0IGNvbXBpbGUgdGltZSkuCisgKgorICogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gbXVzdCBiZSBzZXQgdG8gMSBvciBsZWZ0IHVuZGVmaW5lZCBpbgorICogRnJlZVJUT1NDb25maWcuaCBmb3IgeE1lc3NhZ2VCdWZmZXJDcmVhdGUoKSB0byBiZSBhdmFpbGFibGUuCisgKgorICogQHBhcmFtIHhCdWZmZXJTaXplQnl0ZXMgVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyAobm90IG1lc3NhZ2VzKSB0aGUgbWVzc2FnZQorICogYnVmZmVyIHdpbGwgYmUgYWJsZSB0byBob2xkIGF0IGFueSBvbmUgdGltZS4gIFdoZW4gYSBtZXNzYWdlIGlzIHdyaXR0ZW4gdG8KKyAqIHRoZSBtZXNzYWdlIGJ1ZmZlciBhbiBhZGRpdGlvbmFsIHNpemVvZiggc2l6ZV90ICkgYnl0ZXMgYXJlIGFsc28gd3JpdHRlbiB0bworICogc3RvcmUgdGhlIG1lc3NhZ2UncyBsZW5ndGguICBzaXplb2YoIHNpemVfdCApIGlzIHR5cGljYWxseSA0IGJ5dGVzIG9uIGEKKyAqIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIG9uIG1vc3QgMzItYml0IGFyY2hpdGVjdHVyZXMgYSAxMCBieXRlIG1lc3NhZ2Ugd2lsbAorICogdGFrZSB1cCAxNCBieXRlcyBvZiBtZXNzYWdlIGJ1ZmZlciBzcGFjZS4KKyAqCisgKiBAcmV0dXJuIElmIE5VTEwgaXMgcmV0dXJuZWQsIHRoZW4gdGhlIG1lc3NhZ2UgYnVmZmVyIGNhbm5vdCBiZSBjcmVhdGVkCisgKiBiZWNhdXNlIHRoZXJlIGlzIGluc3VmZmljaWVudCBoZWFwIG1lbW9yeSBhdmFpbGFibGUgZm9yIEZyZWVSVE9TIHRvIGFsbG9jYXRlCisgKiB0aGUgbWVzc2FnZSBidWZmZXIgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBzdG9yYWdlIGFyZWEuICBBIG5vbi1OVUxMIHZhbHVlIGJlaW5nCisgKiByZXR1cm5lZCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVzc2FnZSBidWZmZXIgaGFzIGJlZW4gY3JlYXRlZCBzdWNjZXNzZnVsbHkgLQorICogdGhlIHJldHVybmVkIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQgYXMgdGhlIGhhbmRsZSB0byB0aGUgY3JlYXRlZCBtZXNzYWdlCisgKiBidWZmZXIuCisgKgorICogRXhhbXBsZSB1c2U6Cis8cHJlPgorCit2b2lkIHZBRnVuY3Rpb24oIHZvaWQgKQoreworTWVzc2FnZUJ1ZmZlckhhbmRsZV90IHhNZXNzYWdlQnVmZmVyOworY29uc3Qgc2l6ZV90IHhNZXNzYWdlQnVmZmVyU2l6ZUJ5dGVzID0gMTAwOworCisgICAgLy8gQ3JlYXRlIGEgbWVzc2FnZSBidWZmZXIgdGhhdCBjYW4gaG9sZCAxMDAgYnl0ZXMuICBUaGUgbWVtb3J5IHVzZWQgdG8gaG9sZAorICAgIC8vIGJvdGggdGhlIG1lc3NhZ2UgYnVmZmVyIHN0cnVjdHVyZSBhbmQgdGhlIG1lc3NhZ2VzIHRoZW1zZWx2ZXMgaXMgYWxsb2NhdGVkCisgICAgLy8gZHluYW1pY2FsbHkuICBFYWNoIG1lc3NhZ2UgYWRkZWQgdG8gdGhlIGJ1ZmZlciBjb25zdW1lcyBhbiBhZGRpdGlvbmFsIDQKKyAgICAvLyBieXRlcyB3aGljaCBhcmUgdXNlZCB0byBob2xkIHRoZSBsZW5naCBvZiB0aGUgbWVzc2FnZS4KKyAgICB4TWVzc2FnZUJ1ZmZlciA9IHhNZXNzYWdlQnVmZmVyQ3JlYXRlKCB4TWVzc2FnZUJ1ZmZlclNpemVCeXRlcyApOworCisgICAgaWYoIHhNZXNzYWdlQnVmZmVyID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgLy8gVGhlcmUgd2FzIG5vdCBlbm91Z2ggaGVhcCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIHRvIGNyZWF0ZSB0aGUKKyAgICAgICAgLy8gbWVzc2FnZSBidWZmZXIuCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFRoZSBtZXNzYWdlIGJ1ZmZlciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkgYW5kIGNhbiBub3cgYmUgdXNlZC4KKyAgICB9CisKKzwvcHJlPgorICogXGRlZmdyb3VwIHhNZXNzYWdlQnVmZmVyQ3JlYXRlIHhNZXNzYWdlQnVmZmVyQ3JlYXRlCisgKiBcaW5ncm91cCBNZXNzYWdlQnVmZmVyTWFuYWdlbWVudAorICovCisjZGVmaW5lIHhNZXNzYWdlQnVmZmVyQ3JlYXRlKCB4QnVmZmVyU2l6ZUJ5dGVzICkgKCBNZXNzYWdlQnVmZmVySGFuZGxlX3QgKSB4U3RyZWFtQnVmZmVyR2VuZXJpY0NyZWF0ZSggeEJ1ZmZlclNpemVCeXRlcywgKCBzaXplX3QgKSAwLCBwZFRSVUUgKQorCisvKioKKyAqIG1lc3NhZ2VfYnVmZmVyLmgKKyAqCis8cHJlPgorTWVzc2FnZUJ1ZmZlckhhbmRsZV90IHhNZXNzYWdlQnVmZmVyQ3JlYXRlU3RhdGljKCBzaXplX3QgeEJ1ZmZlclNpemVCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHVjTWVzc2FnZUJ1ZmZlclN0b3JhZ2VBcmVhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWNNZXNzYWdlQnVmZmVyX3QgKnB4U3RhdGljTWVzc2FnZUJ1ZmZlciApOworPC9wcmU+CisgKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2UgYnVmZmVyIHVzaW5nIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG1lbW9yeS4gIFNlZQorICogeE1lc3NhZ2VCdWZmZXJDcmVhdGUoKSBmb3IgYSB2ZXJzaW9uIHRoYXQgdXNlcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5LgorICoKKyAqIEBwYXJhbSB4QnVmZmVyU2l6ZUJ5dGVzIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoZQorICogcHVjTWVzc2FnZUJ1ZmZlclN0b3JhZ2VBcmVhIHBhcmFtZXRlci4gIFdoZW4gYSBtZXNzYWdlIGlzIHdyaXR0ZW4gdG8gdGhlCisgKiBtZXNzYWdlIGJ1ZmZlciBhbiBhZGRpdGlvbmFsIHNpemVvZiggc2l6ZV90ICkgYnl0ZXMgYXJlIGFsc28gd3JpdHRlbiB0byBzdG9yZQorICogdGhlIG1lc3NhZ2UncyBsZW5ndGguICBzaXplb2YoIHNpemVfdCApIGlzIHR5cGljYWxseSA0IGJ5dGVzIG9uIGEgMzItYml0CisgKiBhcmNoaXRlY3R1cmUsIHNvIG9uIG1vc3QgMzItYml0IGFyY2hpdGVjdHVyZSBhIDEwIGJ5dGUgbWVzc2FnZSB3aWxsIHRha2UgdXAKKyAqIDE0IGJ5dGVzIG9mIG1lc3NhZ2UgYnVmZmVyIHNwYWNlLiAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlCisgKiBzdG9yZWQgaW4gdGhlIG1lc3NhZ2UgYnVmZmVyIGlzIGFjdHVhbGx5ICh4QnVmZmVyU2l6ZUJ5dGVzIC0gMSkuCisgKgorICogQHBhcmFtIHB1Y01lc3NhZ2VCdWZmZXJTdG9yYWdlQXJlYSBNdXN0IHBvaW50IHRvIGEgdWludDhfdCBhcnJheSB0aGF0IGlzIGF0CisgKiBsZWFzdCB4QnVmZmVyU2l6ZUJ5dGVzICsgMSBiaWcuICBUaGlzIGlzIHRoZSBhcnJheSB0byB3aGljaCBtZXNzYWdlcyBhcmUKKyAqIGNvcGllZCB3aGVuIHRoZXkgYXJlIHdyaXR0ZW4gdG8gdGhlIG1lc3NhZ2UgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBweFN0YXRpY01lc3NhZ2VCdWZmZXIgTXVzdCBwb2ludCB0byBhIHZhcmlhYmxlIG9mIHR5cGUKKyAqIFN0YXRpY01lc3NhZ2VCdWZmZXJfdCwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGhvbGQgdGhlIG1lc3NhZ2UgYnVmZmVyJ3MgZGF0YQorICogc3RydWN0dXJlLgorICoKKyAqIEByZXR1cm4gSWYgdGhlIG1lc3NhZ2UgYnVmZmVyIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IHRoZW4gYSBoYW5kbGUgdG8gdGhlCisgKiBjcmVhdGVkIG1lc3NhZ2UgYnVmZmVyIGlzIHJldHVybmVkLiBJZiBlaXRoZXIgcHVjTWVzc2FnZUJ1ZmZlclN0b3JhZ2VBcmVhIG9yCisgKiBweFN0YXRpY21lc3NhZ2VCdWZmZXIgYXJlIE5VTEwgdGhlbiBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIEV4YW1wbGUgdXNlOgorPHByZT4KKworLy8gVXNlZCB0byBkaW1lbnNpb24gdGhlIGFycmF5IHVzZWQgdG8gaG9sZCB0aGUgbWVzc2FnZXMuICBUaGUgYXZhaWxhYmxlIHNwYWNlCisvLyB3aWxsIGFjdHVhbGx5IGJlIG9uZSBsZXNzIHRoYW4gdGhpcywgc28gOTk5LgorI2RlZmluZSBTVE9SQUdFX1NJWkVfQllURVMgMTAwMAorCisvLyBEZWZpbmVzIHRoZSBtZW1vcnkgdGhhdCB3aWxsIGFjdHVhbGx5IGhvbGQgdGhlIG1lc3NhZ2VzIHdpdGhpbiB0aGUgbWVzc2FnZQorLy8gYnVmZmVyLgorc3RhdGljIHVpbnQ4X3QgdWNTdG9yYWdlQnVmZmVyWyBTVE9SQUdFX1NJWkVfQllURVMgXTsKKworLy8gVGhlIHZhcmlhYmxlIHVzZWQgdG8gaG9sZCB0aGUgbWVzc2FnZSBidWZmZXIgc3RydWN0dXJlLgorU3RhdGljTWVzc2FnZUJ1ZmZlcl90IHhNZXNzYWdlQnVmZmVyU3RydWN0OworCit2b2lkIE15RnVuY3Rpb24oIHZvaWQgKQoreworTWVzc2FnZUJ1ZmZlckhhbmRsZV90IHhNZXNzYWdlQnVmZmVyOworCisgICAgeE1lc3NhZ2VCdWZmZXIgPSB4TWVzc2FnZUJ1ZmZlckNyZWF0ZVN0YXRpYyggc2l6ZW9mKCB1Y0J1ZmZlclN0b3JhZ2UgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0J1ZmZlclN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhNZXNzYWdlQnVmZmVyU3RydWN0ICk7CisKKyAgICAvLyBBcyBuZWl0aGVyIHRoZSBwdWNNZXNzYWdlQnVmZmVyU3RvcmFnZUFyZWEgb3IgcHhTdGF0aWNNZXNzYWdlQnVmZmVyCisgICAgLy8gcGFyYW1ldGVycyB3ZXJlIE5VTEwsIHhNZXNzYWdlQnVmZmVyIHdpbGwgbm90IGJlIE5VTEwsIGFuZCBjYW4gYmUgdXNlZCB0bworICAgIC8vIHJlZmVyZW5jZSB0aGUgY3JlYXRlZCBtZXNzYWdlIGJ1ZmZlciBpbiBvdGhlciBtZXNzYWdlIGJ1ZmZlciBBUEkgY2FsbHMuCisKKyAgICAvLyBPdGhlciBjb2RlIHRoYXQgdXNlcyB0aGUgbWVzc2FnZSBidWZmZXIgY2FuIGdvIGhlcmUuCit9CisKKzwvcHJlPgorICogXGRlZmdyb3VwIHhNZXNzYWdlQnVmZmVyQ3JlYXRlU3RhdGljIHhNZXNzYWdlQnVmZmVyQ3JlYXRlU3RhdGljCisgKiBcaW5ncm91cCBNZXNzYWdlQnVmZmVyTWFuYWdlbWVudAorICovCisjZGVmaW5lIHhNZXNzYWdlQnVmZmVyQ3JlYXRlU3RhdGljKCB4QnVmZmVyU2l6ZUJ5dGVzLCBwdWNNZXNzYWdlQnVmZmVyU3RvcmFnZUFyZWEsIHB4U3RhdGljTWVzc2FnZUJ1ZmZlciApICggTWVzc2FnZUJ1ZmZlckhhbmRsZV90ICkgeFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGVTdGF0aWMoIHhCdWZmZXJTaXplQnl0ZXMsIDAsIHBkVFJVRSwgcHVjTWVzc2FnZUJ1ZmZlclN0b3JhZ2VBcmVhLCBweFN0YXRpY01lc3NhZ2VCdWZmZXIgKQorCisvKioKKyAqIG1lc3NhZ2VfYnVmZmVyLmgKKyAqCis8cHJlPgorc2l6ZV90IHhNZXNzYWdlQnVmZmVyU2VuZCggTWVzc2FnZUJ1ZmZlckhhbmRsZV90IHhNZXNzYWdlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcHZUeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgeERhdGFMZW5ndGhCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7Cis8cHJlPgorICoKKyAqIFNlbmRzIGEgZGlzY3JldGUgbWVzc2FnZSB0byB0aGUgbWVzc2FnZSBidWZmZXIuICBUaGUgbWVzc2FnZSBjYW4gYmUgYW55CisgKiBsZW5ndGggdGhhdCBmaXRzIHdpdGhpbiB0aGUgYnVmZmVyJ3MgZnJlZSBzcGFjZSwgYW5kIGlzIGNvcGllZCBpbnRvIHRoZQorICogYnVmZmVyLgorICoKKyAqICoqKk5PVEUqKio6ICBVbmlxdWVseSBhbW9uZyBGcmVlUlRPUyBvYmplY3RzLCB0aGUgc3RyZWFtIGJ1ZmZlcgorICogaW1wbGVtZW50YXRpb24gKHNvIGFsc28gdGhlIG1lc3NhZ2UgYnVmZmVyIGltcGxlbWVudGF0aW9uLCBhcyBtZXNzYWdlIGJ1ZmZlcnMKKyAqIGFyZSBidWlsdCBvbiB0b3Agb2Ygc3RyZWFtIGJ1ZmZlcnMpIGFzc3VtZXMgdGhlcmUgaXMgb25seSBvbmUgdGFzayBvcgorICogaW50ZXJydXB0IHRoYXQgd2lsbCB3cml0ZSB0byB0aGUgYnVmZmVyICh0aGUgd3JpdGVyKSwgYW5kIG9ubHkgb25lIHRhc2sgb3IKKyAqIGludGVycnVwdCB0aGF0IHdpbGwgcmVhZCBmcm9tIHRoZSBidWZmZXIgKHRoZSByZWFkZXIpLiAgSXQgaXMgc2FmZSBmb3IgdGhlCisgKiB3cml0ZXIgYW5kIHJlYWRlciB0byBiZSBkaWZmZXJlbnQgdGFza3Mgb3IgaW50ZXJydXB0cywgYnV0LCB1bmxpa2Ugb3RoZXIKKyAqIEZyZWVSVE9TIG9iamVjdHMsIGl0IGlzIG5vdCBzYWZlIHRvIGhhdmUgbXVsdGlwbGUgZGlmZmVyZW50IHdyaXRlcnMgb3IKKyAqIG11bHRpcGxlIGRpZmZlcmVudCByZWFkZXJzLiAgSWYgdGhlcmUgYXJlIHRvIGJlIG11bHRpcGxlIGRpZmZlcmVudCB3cml0ZXJzCisgKiB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwbGFjZSBlYWNoIGNhbGwgdG8gYSB3cml0aW5nIEFQSSBmdW5jdGlvbgorICogKHN1Y2ggYXMgeE1lc3NhZ2VCdWZmZXJTZW5kKCkpIGluc2lkZSBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHNldCB0aGUgc2VuZAorICogYmxvY2sgdGltZSB0byAwLiAgTGlrZXdpc2UsIGlmIHRoZXJlIGFyZSB0byBiZSBtdWx0aXBsZSBkaWZmZXJlbnQgcmVhZGVycworICogdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgcGxhY2UgZWFjaCBjYWxsIHRvIGEgcmVhZGluZyBBUEkgZnVuY3Rpb24KKyAqIChzdWNoIGFzIHhNZXNzYWdlQnVmZmVyUmVhZCgpKSBpbnNpZGUgYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBzZXQgdGhlIHJlY2VpdmUKKyAqIGJsb2NrIHRpbWUgdG8gMC4KKyAqCisgKiBVc2UgeE1lc3NhZ2VCdWZmZXJTZW5kKCkgdG8gd3JpdGUgdG8gYSBtZXNzYWdlIGJ1ZmZlciBmcm9tIGEgdGFzay4gIFVzZQorICogeE1lc3NhZ2VCdWZmZXJTZW5kRnJvbUlTUigpIHRvIHdyaXRlIHRvIGEgbWVzc2FnZSBidWZmZXIgZnJvbSBhbiBpbnRlcnJ1cHQKKyAqIHNlcnZpY2Ugcm91dGluZSAoSVNSKS4KKyAqCisgKiBAcGFyYW0geE1lc3NhZ2VCdWZmZXIgVGhlIGhhbmRsZSBvZiB0aGUgbWVzc2FnZSBidWZmZXIgdG8gd2hpY2ggYSBtZXNzYWdlIGlzCisgKiBiZWluZyBzZW50LgorICoKKyAqIEBwYXJhbSBwdlR4RGF0YSBBIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdGhhdCBpcyB0byBiZSBjb3BpZWQgaW50byB0aGUKKyAqIG1lc3NhZ2UgYnVmZmVyLgorICoKKyAqIEBwYXJhbSB4RGF0YUxlbmd0aEJ5dGVzIFRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UuICBUaGF0IGlzLCB0aGUgbnVtYmVyIG9mCisgKiBieXRlcyB0byBjb3B5IGZyb20gcHZUeERhdGEgaW50byB0aGUgbWVzc2FnZSBidWZmZXIuICBXaGVuIGEgbWVzc2FnZSBpcworICogd3JpdHRlbiB0byB0aGUgbWVzc2FnZSBidWZmZXIgYW4gYWRkaXRpb25hbCBzaXplb2YoIHNpemVfdCApIGJ5dGVzIGFyZSBhbHNvCisgKiB3cml0dGVuIHRvIHN0b3JlIHRoZSBtZXNzYWdlJ3MgbGVuZ3RoLiAgc2l6ZW9mKCBzaXplX3QgKSBpcyB0eXBpY2FsbHkgNCBieXRlcworICogb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyBvbiBtb3N0IDMyLWJpdCBhcmNoaXRlY3R1cmUgc2V0dGluZworICogeERhdGFMZW5ndGhCeXRlcyB0byAyMCB3aWxsIHJlZHVjZSB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgbWVzc2FnZSBidWZmZXIgYnkgMjQKKyAqIGJ5dGVzICgyMCBieXRlcyBvZiBtZXNzYWdlIGRhdGEgYW5kIDQgYnl0ZXMgdG8gaG9sZCB0aGUgbWVzc2FnZSBsZW5ndGgpLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhlIGNhbGxpbmcgdGFzayBzaG91bGQgcmVtYWluCisgKiBpbiB0aGUgQmxvY2tlZCBzdGF0ZSB0byB3YWl0IGZvciBlbm91Z2ggc3BhY2UgdG8gYmVjb21lIGF2YWlsYWJsZSBpbiB0aGUKKyAqIG1lc3NhZ2UgYnVmZmVyLCBzaG91bGQgdGhlIG1lc3NhZ2UgYnVmZmVyIGhhdmUgaW5zdWZmaWNpZW50IHNwYWNlIHdoZW4KKyAqIHhNZXNzYWdlQnVmZmVyU2VuZCgpIGlzIGNhbGxlZC4gIFRoZSBjYWxsaW5nIHRhc2sgd2lsbCBuZXZlciBibG9jayBpZgorICogeFRpY2tzVG9XYWl0IGlzIHplcm8uICBUaGUgYmxvY2sgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGljayBwZXJpb2RzLCBzbyB0aGUKKyAqIGFic29sdXRlIHRpbWUgaXQgcmVwcmVzZW50cyBpcyBkZXBlbmRlbnQgb24gdGhlIHRpY2sgZnJlcXVlbmN5LiAgVGhlIG1hY3JvCisgKiBwZE1TX1RPX1RJQ0tTKCkgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIHRpbWUgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcyBpbnRvCisgKiBhIHRpbWUgc3BlY2lmaWVkIGluIHRpY2tzLiAgU2V0dGluZyB4VGlja3NUb1dhaXQgdG8gcG9ydE1BWF9ERUxBWSB3aWxsIGNhdXNlCisgKiB0aGUgdGFzayB0byB3YWl0IGluZGVmaW5pdGVseSAod2l0aG91dCB0aW1pbmcgb3V0KSwgcHJvdmlkZWQKKyAqIElOQ0xVREVfdlRhc2tTdXNwZW5kIGlzIHNldCB0byAxIGluIEZyZWVSVE9TQ29uZmlnLmguICBUYXNrcyBkbyBub3QgdXNlIGFueQorICogQ1BVIHRpbWUgd2hlbiB0aGV5IGFyZSBpbiB0aGUgQmxvY2tlZCBzdGF0ZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgbWVzc2FnZSBidWZmZXIuICBJZiB0aGUgY2FsbCB0bworICogeE1lc3NhZ2VCdWZmZXJTZW5kKCkgdGltZXMgb3V0IGJlZm9yZSB0aGVyZSB3YXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZQorICogbWVzc2FnZSBpbnRvIHRoZSBtZXNzYWdlIGJ1ZmZlciB0aGVuIHplcm8gaXMgcmV0dXJuZWQuICBJZiB0aGUgY2FsbCBkaWQgbm90CisgKiB0aW1lIG91dCB0aGVuIHhEYXRhTGVuZ3RoQnl0ZXMgaXMgcmV0dXJuZWQuCisgKgorICogRXhhbXBsZSB1c2U6Cis8cHJlPgordm9pZCB2QUZ1bmN0aW9uKCBNZXNzYWdlQnVmZmVySGFuZGxlX3QgeE1lc3NhZ2VCdWZmZXIgKQoreworc2l6ZV90IHhCeXRlc1NlbnQ7Cit1aW50OF90IHVjQXJyYXlUb1NlbmRbXSA9IHsgMCwgMSwgMiwgMyB9OworY2hhciAqcGNTdHJpbmdUb1NlbmQgPSAiU3RyaW5nIHRvIHNlbmQiOworY29uc3QgVGlja1R5cGVfdCB4MTAwbXMgPSBwZE1TX1RPX1RJQ0tTKCAxMDAgKTsKKworICAgIC8vIFNlbmQgYW4gYXJyYXkgdG8gdGhlIG1lc3NhZ2UgYnVmZmVyLCBibG9ja2luZyBmb3IgYSBtYXhpbXVtIG9mIDEwMG1zIHRvCisgICAgLy8gd2FpdCBmb3IgZW5vdWdoIHNwYWNlIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGUgbWVzc2FnZSBidWZmZXIuCisgICAgeEJ5dGVzU2VudCA9IHhNZXNzYWdlQnVmZmVyU2VuZCggeE1lc3NhZ2VCdWZmZXIsICggdm9pZCAqICkgdWNBcnJheVRvU2VuZCwgc2l6ZW9mKCB1Y0FycmF5VG9TZW5kICksIHgxMDBtcyApOworCisgICAgaWYoIHhCeXRlc1NlbnQgIT0gc2l6ZW9mKCB1Y0FycmF5VG9TZW5kICkgKQorICAgIHsKKyAgICAgICAgLy8gVGhlIGNhbGwgdG8geE1lc3NhZ2VCdWZmZXJTZW5kKCkgdGltZXMgb3V0IGJlZm9yZSB0aGVyZSB3YXMgZW5vdWdoCisgICAgICAgIC8vIHNwYWNlIGluIHRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAgfQorCisgICAgLy8gU2VuZCB0aGUgc3RyaW5nIHRvIHRoZSBtZXNzYWdlIGJ1ZmZlci4gIFJldHVybiBpbW1lZGlhdGVseSBpZiB0aGVyZSBpcworICAgIC8vIG5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIGJ1ZmZlci4KKyAgICB4Qnl0ZXNTZW50ID0geE1lc3NhZ2VCdWZmZXJTZW5kKCB4TWVzc2FnZUJ1ZmZlciwgKCB2b2lkICogKSBwY1N0cmluZ1RvU2VuZCwgc3RybGVuKCBwY1N0cmluZ1RvU2VuZCApLCAwICk7CisKKyAgICBpZiggeEJ5dGVzU2VudCAhPSBzdHJsZW4oIHBjU3RyaW5nVG9TZW5kICkgKQorICAgIHsKKyAgICAgICAgLy8gVGhlIHN0cmluZyBjb3VsZCBub3QgYmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2UgYnVmZmVyIGJlY2F1c2UgdGhlcmUgd2FzCisgICAgICAgIC8vIG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyLgorICAgIH0KK30KKzwvcHJlPgorICogXGRlZmdyb3VwIHhNZXNzYWdlQnVmZmVyU2VuZCB4TWVzc2FnZUJ1ZmZlclNlbmQKKyAqIFxpbmdyb3VwIE1lc3NhZ2VCdWZmZXJNYW5hZ2VtZW50CisgKi8KKyNkZWZpbmUgeE1lc3NhZ2VCdWZmZXJTZW5kKCB4TWVzc2FnZUJ1ZmZlciwgcHZUeERhdGEsIHhEYXRhTGVuZ3RoQnl0ZXMsIHhUaWNrc1RvV2FpdCApIHhTdHJlYW1CdWZmZXJTZW5kKCAoIFN0cmVhbUJ1ZmZlckhhbmRsZV90ICkgeE1lc3NhZ2VCdWZmZXIsIHB2VHhEYXRhLCB4RGF0YUxlbmd0aEJ5dGVzLCB4VGlja3NUb1dhaXQgKQorCisvKioKKyAqIG1lc3NhZ2VfYnVmZmVyLmgKKyAqCis8cHJlPgorc2l6ZV90IHhNZXNzYWdlQnVmZmVyU2VuZEZyb21JU1IoIE1lc3NhZ2VCdWZmZXJIYW5kbGVfdCB4TWVzc2FnZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwdlR4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgeERhdGFMZW5ndGhCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7Cis8cHJlPgorICoKKyAqIEludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIEFQSSBmdW5jdGlvbiB0aGF0IHNlbmRzIGEgZGlzY3JldGUgbWVzc2FnZSB0bworICogdGhlIG1lc3NhZ2UgYnVmZmVyLiAgVGhlIG1lc3NhZ2UgY2FuIGJlIGFueSBsZW5ndGggdGhhdCBmaXRzIHdpdGhpbiB0aGUKKyAqIGJ1ZmZlcidzIGZyZWUgc3BhY2UsIGFuZCBpcyBjb3BpZWQgaW50byB0aGUgYnVmZmVyLgorICoKKyAqICoqKk5PVEUqKio6ICBVbmlxdWVseSBhbW9uZyBGcmVlUlRPUyBvYmplY3RzLCB0aGUgc3RyZWFtIGJ1ZmZlcgorICogaW1wbGVtZW50YXRpb24gKHNvIGFsc28gdGhlIG1lc3NhZ2UgYnVmZmVyIGltcGxlbWVudGF0aW9uLCBhcyBtZXNzYWdlIGJ1ZmZlcnMKKyAqIGFyZSBidWlsdCBvbiB0b3Agb2Ygc3RyZWFtIGJ1ZmZlcnMpIGFzc3VtZXMgdGhlcmUgaXMgb25seSBvbmUgdGFzayBvcgorICogaW50ZXJydXB0IHRoYXQgd2lsbCB3cml0ZSB0byB0aGUgYnVmZmVyICh0aGUgd3JpdGVyKSwgYW5kIG9ubHkgb25lIHRhc2sgb3IKKyAqIGludGVycnVwdCB0aGF0IHdpbGwgcmVhZCBmcm9tIHRoZSBidWZmZXIgKHRoZSByZWFkZXIpLiAgSXQgaXMgc2FmZSBmb3IgdGhlCisgKiB3cml0ZXIgYW5kIHJlYWRlciB0byBiZSBkaWZmZXJlbnQgdGFza3Mgb3IgaW50ZXJydXB0cywgYnV0LCB1bmxpa2Ugb3RoZXIKKyAqIEZyZWVSVE9TIG9iamVjdHMsIGl0IGlzIG5vdCBzYWZlIHRvIGhhdmUgbXVsdGlwbGUgZGlmZmVyZW50IHdyaXRlcnMgb3IKKyAqIG11bHRpcGxlIGRpZmZlcmVudCByZWFkZXJzLiAgSWYgdGhlcmUgYXJlIHRvIGJlIG11bHRpcGxlIGRpZmZlcmVudCB3cml0ZXJzCisgKiB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwbGFjZSBlYWNoIGNhbGwgdG8gYSB3cml0aW5nIEFQSSBmdW5jdGlvbgorICogKHN1Y2ggYXMgeE1lc3NhZ2VCdWZmZXJTZW5kKCkpIGluc2lkZSBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIHNldCB0aGUgc2VuZAorICogYmxvY2sgdGltZSB0byAwLiAgTGlrZXdpc2UsIGlmIHRoZXJlIGFyZSB0byBiZSBtdWx0aXBsZSBkaWZmZXJlbnQgcmVhZGVycworICogdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgcGxhY2UgZWFjaCBjYWxsIHRvIGEgcmVhZGluZyBBUEkgZnVuY3Rpb24KKyAqIChzdWNoIGFzIHhNZXNzYWdlQnVmZmVyUmVhZCgpKSBpbnNpZGUgYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBzZXQgdGhlIHJlY2VpdmUKKyAqIGJsb2NrIHRpbWUgdG8gMC4KKyAqCisgKiBVc2UgeE1lc3NhZ2VCdWZmZXJTZW5kKCkgdG8gd3JpdGUgdG8gYSBtZXNzYWdlIGJ1ZmZlciBmcm9tIGEgdGFzay4gIFVzZQorICogeE1lc3NhZ2VCdWZmZXJTZW5kRnJvbUlTUigpIHRvIHdyaXRlIHRvIGEgbWVzc2FnZSBidWZmZXIgZnJvbSBhbiBpbnRlcnJ1cHQKKyAqIHNlcnZpY2Ugcm91dGluZSAoSVNSKS4KKyAqCisgKiBAcGFyYW0geE1lc3NhZ2VCdWZmZXIgVGhlIGhhbmRsZSBvZiB0aGUgbWVzc2FnZSBidWZmZXIgdG8gd2hpY2ggYSBtZXNzYWdlIGlzCisgKiBiZWluZyBzZW50LgorICoKKyAqIEBwYXJhbSBwdlR4RGF0YSBBIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdGhhdCBpcyB0byBiZSBjb3BpZWQgaW50byB0aGUKKyAqIG1lc3NhZ2UgYnVmZmVyLgorICoKKyAqIEBwYXJhbSB4RGF0YUxlbmd0aEJ5dGVzIFRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UuICBUaGF0IGlzLCB0aGUgbnVtYmVyIG9mCisgKiBieXRlcyB0byBjb3B5IGZyb20gcHZUeERhdGEgaW50byB0aGUgbWVzc2FnZSBidWZmZXIuICBXaGVuIGEgbWVzc2FnZSBpcworICogd3JpdHRlbiB0byB0aGUgbWVzc2FnZSBidWZmZXIgYW4gYWRkaXRpb25hbCBzaXplb2YoIHNpemVfdCApIGJ5dGVzIGFyZSBhbHNvCisgKiB3cml0dGVuIHRvIHN0b3JlIHRoZSBtZXNzYWdlJ3MgbGVuZ3RoLiAgc2l6ZW9mKCBzaXplX3QgKSBpcyB0eXBpY2FsbHkgNCBieXRlcworICogb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyBvbiBtb3N0IDMyLWJpdCBhcmNoaXRlY3R1cmUgc2V0dGluZworICogeERhdGFMZW5ndGhCeXRlcyB0byAyMCB3aWxsIHJlZHVjZSB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgbWVzc2FnZSBidWZmZXIgYnkgMjQKKyAqIGJ5dGVzICgyMCBieXRlcyBvZiBtZXNzYWdlIGRhdGEgYW5kIDQgYnl0ZXMgdG8gaG9sZCB0aGUgbWVzc2FnZSBsZW5ndGgpLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGEgbWVzc2FnZSBidWZmZXIgd2lsbAorICogaGF2ZSBhIHRhc2sgYmxvY2tlZCBvbiBpdCB3YWl0aW5nIGZvciBkYXRhLiAgQ2FsbGluZworICogeE1lc3NhZ2VCdWZmZXJTZW5kRnJvbUlTUigpIGNhbiBtYWtlIGRhdGEgYXZhaWxhYmxlLCBhbmQgc28gY2F1c2UgYSB0YXNrIHRoYXQKKyAqIHdhcyB3YWl0aW5nIGZvciBkYXRhIHRvIGxlYXZlIHRoZSBCbG9ja2VkIHN0YXRlLiAgSWYgY2FsbGluZworICogeE1lc3NhZ2VCdWZmZXJTZW5kRnJvbUlTUigpIGNhdXNlcyBhIHRhc2sgdG8gbGVhdmUgdGhlIEJsb2NrZWQgc3RhdGUsIGFuZCB0aGUKKyAqIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgKHRoZQorICogdGFzayB0aGF0IHdhcyBpbnRlcnJ1cHRlZCksIHRoZW4sIGludGVybmFsbHksIHhNZXNzYWdlQnVmZmVyU2VuZEZyb21JU1IoKQorICogd2lsbCBzZXQgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gdG8gcGRUUlVFLiAgSWYKKyAqIHhNZXNzYWdlQnVmZmVyU2VuZEZyb21JU1IoKSBzZXRzIHRoaXMgdmFsdWUgdG8gcGRUUlVFLCB0aGVuIG5vcm1hbGx5IGEKKyAqIGNvbnRleHQgc3dpdGNoIHNob3VsZCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgaXMgZXhpdGVkLiAgVGhpcyB3aWxsCisgKiBlbnN1cmUgdGhhdCB0aGUgaW50ZXJydXB0IHJldHVybnMgZGlyZWN0bHkgdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgUmVhZHkKKyAqIHN0YXRlIHRhc2suICAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBzaG91bGQgYmUgc2V0IHRvIHBkRkFMU0UgYmVmb3JlIGl0CisgKiBpcyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb24uICBTZWUgdGhlIGNvZGUgZXhhbXBsZSBiZWxvdyBmb3IgYW4gZXhhbXBsZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiB0byB0aGUgbWVzc2FnZSBidWZmZXIuICBJZiB0aGUKKyAqIG1lc3NhZ2UgYnVmZmVyIGRpZG4ndCBoYXZlIGVub3VnaCBmcmVlIHNwYWNlIGZvciB0aGUgbWVzc2FnZSB0byBiZSBzdG9yZWQKKyAqIHRoZW4gMCBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHhEYXRhTGVuZ3RoQnl0ZXMgaXMgcmV0dXJuZWQuCisgKgorICogRXhhbXBsZSB1c2U6Cis8cHJlPgorLy8gQSBtZXNzYWdlIGJ1ZmZlciB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZC4KK01lc3NhZ2VCdWZmZXJIYW5kbGVfdCB4TWVzc2FnZUJ1ZmZlcjsKKwordm9pZCB2QW5JbnRlcnJ1cHRTZXJ2aWNlUm91dGluZSggdm9pZCApCit7CitzaXplX3QgeEJ5dGVzU2VudDsKK2NoYXIgKnBjU3RyaW5nVG9TZW5kID0gIlN0cmluZyB0byBzZW5kIjsKK0Jhc2VUeXBlX3QgeEhpZ2hlclByaW9yaXR5VGFza1dva2VuID0gcGRGQUxTRTsgLy8gSW5pdGlhbGlzZWQgdG8gcGRGQUxTRS4KKworICAgIC8vIEF0dGVtcHQgdG8gc2VuZCB0aGUgc3RyaW5nIHRvIHRoZSBtZXNzYWdlIGJ1ZmZlci4KKyAgICB4Qnl0ZXNTZW50ID0geE1lc3NhZ2VCdWZmZXJTZW5kRnJvbUlTUiggeE1lc3NhZ2VCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdm9pZCAqICkgcGNTdHJpbmdUb1NlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiggcGNTdHJpbmdUb1NlbmQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworCisgICAgaWYoIHhCeXRlc1NlbnQgIT0gc3RybGVuKCBwY1N0cmluZ1RvU2VuZCApICkKKyAgICB7CisgICAgICAgIC8vIFRoZSBzdHJpbmcgY291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlIGJ1ZmZlciBiZWNhdXNlIHRoZXJlIHdhcworICAgICAgICAvLyBub3QgZW5vdWdoIGZyZWUgc3BhY2UgaW4gdGhlIGJ1ZmZlci4KKyAgICB9CisKKyAgICAvLyBJZiB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gd2FzIHNldCB0byBwZFRSVUUgaW5zaWRlCisgICAgLy8geE1lc3NhZ2VCdWZmZXJTZW5kRnJvbUlTUigpIHRoZW4gYSB0YXNrIHRoYXQgaGFzIGEgcHJpb3JpdHkgYWJvdmUgdGhlCisgICAgLy8gcHJpb3JpdHkgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayB3YXMgdW5ibG9ja2VkIGFuZCBhIGNvbnRleHQKKyAgICAvLyBzd2l0Y2ggc2hvdWxkIGJlIHBlcmZvcm1lZCB0byBlbnN1cmUgdGhlIElTUiByZXR1cm5zIHRvIHRoZSB1bmJsb2NrZWQKKyAgICAvLyB0YXNrLiAgSW4gbW9zdCBGcmVlUlRPUyBwb3J0cyB0aGlzIGlzIGRvbmUgYnkgc2ltcGx5IHBhc3NpbmcKKyAgICAvLyB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gaW50byB0YXNrWUlFTERfRlJPTV9JU1IoKSwgd2hpY2ggd2lsbCB0ZXN0IHRoZQorICAgIC8vIHZhcmlhYmxlcyB2YWx1ZSwgYW5kIHBlcmZvcm0gdGhlIGNvbnRleHQgc3dpdGNoIGlmIG5lY2Vzc2FyeS4gIENoZWNrIHRoZQorICAgIC8vIGRvY3VtZW50YXRpb24gZm9yIHRoZSBwb3J0IGluIHVzZSBmb3IgcG9ydCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuCisgICAgdGFza1lJRUxEX0ZST01fSVNSKCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKK30KKzwvcHJlPgorICogXGRlZmdyb3VwIHhNZXNzYWdlQnVmZmVyU2VuZEZyb21JU1IgeE1lc3NhZ2VCdWZmZXJTZW5kRnJvbUlTUgorICogXGluZ3JvdXAgTWVzc2FnZUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworI2RlZmluZSB4TWVzc2FnZUJ1ZmZlclNlbmRGcm9tSVNSKCB4TWVzc2FnZUJ1ZmZlciwgcHZUeERhdGEsIHhEYXRhTGVuZ3RoQnl0ZXMsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSB4U3RyZWFtQnVmZmVyU2VuZEZyb21JU1IoICggU3RyZWFtQnVmZmVySGFuZGxlX3QgKSB4TWVzc2FnZUJ1ZmZlciwgcHZUeERhdGEsIHhEYXRhTGVuZ3RoQnl0ZXMsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKQorCisvKioKKyAqIG1lc3NhZ2VfYnVmZmVyLmgKKyAqCis8cHJlPgorc2l6ZV90IHhNZXNzYWdlQnVmZmVyUmVjZWl2ZSggTWVzc2FnZUJ1ZmZlckhhbmRsZV90IHhNZXNzYWdlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHZSeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgeEJ1ZmZlckxlbmd0aEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKKzwvcHJlPgorICoKKyAqIFJlY2VpdmVzIGEgZGlzY3JldGUgbWVzc2FnZSBmcm9tIGEgbWVzc2FnZSBidWZmZXIuICBNZXNzYWdlcyBjYW4gYmUgb2YKKyAqIHZhcmlhYmxlIGxlbmd0aCBhbmQgYXJlIGNvcGllZCBvdXQgb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiAqKipOT1RFKioqOiAgVW5pcXVlbHkgYW1vbmcgRnJlZVJUT1Mgb2JqZWN0cywgdGhlIHN0cmVhbSBidWZmZXIKKyAqIGltcGxlbWVudGF0aW9uIChzbyBhbHNvIHRoZSBtZXNzYWdlIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiwgYXMgbWVzc2FnZSBidWZmZXJzCisgKiBhcmUgYnVpbHQgb24gdG9wIG9mIHN0cmVhbSBidWZmZXJzKSBhc3N1bWVzIHRoZXJlIGlzIG9ubHkgb25lIHRhc2sgb3IKKyAqIGludGVycnVwdCB0aGF0IHdpbGwgd3JpdGUgdG8gdGhlIGJ1ZmZlciAodGhlIHdyaXRlciksIGFuZCBvbmx5IG9uZSB0YXNrIG9yCisgKiBpbnRlcnJ1cHQgdGhhdCB3aWxsIHJlYWQgZnJvbSB0aGUgYnVmZmVyICh0aGUgcmVhZGVyKS4gIEl0IGlzIHNhZmUgZm9yIHRoZQorICogd3JpdGVyIGFuZCByZWFkZXIgdG8gYmUgZGlmZmVyZW50IHRhc2tzIG9yIGludGVycnVwdHMsIGJ1dCwgdW5saWtlIG90aGVyCisgKiBGcmVlUlRPUyBvYmplY3RzLCBpdCBpcyBub3Qgc2FmZSB0byBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCB3cml0ZXJzIG9yCisgKiBtdWx0aXBsZSBkaWZmZXJlbnQgcmVhZGVycy4gIElmIHRoZXJlIGFyZSB0byBiZSBtdWx0aXBsZSBkaWZmZXJlbnQgd3JpdGVycworICogdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgcGxhY2UgZWFjaCBjYWxsIHRvIGEgd3JpdGluZyBBUEkgZnVuY3Rpb24KKyAqIChzdWNoIGFzIHhNZXNzYWdlQnVmZmVyU2VuZCgpKSBpbnNpZGUgYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBzZXQgdGhlIHNlbmQKKyAqIGJsb2NrIHRpbWUgdG8gMC4gIExpa2V3aXNlLCBpZiB0aGVyZSBhcmUgdG8gYmUgbXVsdGlwbGUgZGlmZmVyZW50IHJlYWRlcnMKKyAqIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0IHBsYWNlIGVhY2ggY2FsbCB0byBhIHJlYWRpbmcgQVBJIGZ1bmN0aW9uCisgKiAoc3VjaCBhcyB4TWVzc2FnZUJ1ZmZlclJlYWQoKSkgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2V0IHRoZSByZWNlaXZlCisgKiBibG9jayB0aW1lIHRvIDAuCisgKgorICogVXNlIHhNZXNzYWdlQnVmZmVyUmVjZWl2ZSgpIHRvIHJlYWQgZnJvbSBhIG1lc3NhZ2UgYnVmZmVyIGZyb20gYSB0YXNrLiAgVXNlCisgKiB4TWVzc2FnZUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCkgdG8gcmVhZCBmcm9tIGEgbWVzc2FnZSBidWZmZXIgZnJvbSBhbgorICogaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAoSVNSKS4KKyAqCisgKiBAcGFyYW0geE1lc3NhZ2VCdWZmZXIgVGhlIGhhbmRsZSBvZiB0aGUgbWVzc2FnZSBidWZmZXIgZnJvbSB3aGljaCBhIG1lc3NhZ2UKKyAqIGlzIGJlaW5nIHJlY2VpdmVkLgorICoKKyAqIEBwYXJhbSBwdlJ4RGF0YSBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSByZWNlaXZlZCBtZXNzYWdlIGlzCisgKiB0byBiZSBjb3BpZWQuCisgKgorICogQHBhcmFtIHhCdWZmZXJMZW5ndGhCeXRlcyBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgcHZSeERhdGEKKyAqIHBhcmFtZXRlci4gIFRoaXMgc2V0cyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgdGhhdCBjYW4gYmUgcmVjZWl2ZWQuCisgKiBJZiB4QnVmZmVyTGVuZ3RoQnl0ZXMgaXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIG5leHQgbWVzc2FnZSB0aGVuIHRoZSBtZXNzYWdlCisgKiB3aWxsIGJlIGxlZnQgaW4gdGhlIG1lc3NhZ2UgYnVmZmVyIGFuZCAwIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIHhUaWNrc1RvV2FpdCBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0aGUgdGFzayBzaG91bGQgcmVtYWluIGluIHRoZQorICogQmxvY2tlZCBzdGF0ZSB0byB3YWl0IGZvciBhIG1lc3NhZ2UsIHNob3VsZCB0aGUgbWVzc2FnZSBidWZmZXIgYmUgZW1wdHkuCisgKiB4TWVzc2FnZUJ1ZmZlclJlY2VpdmUoKSB3aWxsIHJldHVybiBpbW1lZGlhdGVseSBpZiB4VGlja3NUb1dhaXQgaXMgemVybyBhbmQKKyAqIHRoZSBtZXNzYWdlIGJ1ZmZlciBpcyBlbXB0eS4gIFRoZSBibG9jayB0aW1lIGlzIHNwZWNpZmllZCBpbiB0aWNrIHBlcmlvZHMsIHNvCisgKiB0aGUgYWJzb2x1dGUgdGltZSBpdCByZXByZXNlbnRzIGlzIGRlcGVuZGVudCBvbiB0aGUgdGljayBmcmVxdWVuY3kuICBUaGUKKyAqIG1hY3JvIHBkTVNfVE9fVElDS1MoKSBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGEgdGltZSBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzCisgKiBpbnRvIGEgdGltZSBzcGVjaWZpZWQgaW4gdGlja3MuICBTZXR0aW5nIHhUaWNrc1RvV2FpdCB0byBwb3J0TUFYX0RFTEFZIHdpbGwKKyAqIGNhdXNlIHRoZSB0YXNrIHRvIHdhaXQgaW5kZWZpbml0ZWx5ICh3aXRob3V0IHRpbWluZyBvdXQpLCBwcm92aWRlZAorICogSU5DTFVERV92VGFza1N1c3BlbmQgaXMgc2V0IHRvIDEgaW4gRnJlZVJUT1NDb25maWcuaC4gIFRhc2tzIGRvIG5vdCB1c2UgYW55CisgKiBDUFUgdGltZSB3aGVuIHRoZXkgYXJlIGluIHRoZSBCbG9ja2VkIHN0YXRlLgorICoKKyAqIEByZXR1cm4gVGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBtZXNzYWdlIHJlYWQgZnJvbSB0aGUgbWVzc2FnZSBidWZmZXIsIGlmCisgKiBhbnkuICBJZiB4TWVzc2FnZUJ1ZmZlclJlY2VpdmUoKSB0aW1lcyBvdXQgYmVmb3JlIGEgbWVzc2FnZSBiZWNhbWUgYXZhaWxhYmxlCisgKiB0aGVuIHplcm8gaXMgcmV0dXJuZWQuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGlzIGdyZWF0ZXIgdGhhbgorICogeEJ1ZmZlckxlbmd0aEJ5dGVzIHRoZW4gdGhlIG1lc3NhZ2Ugd2lsbCBiZSBsZWZ0IGluIHRoZSBtZXNzYWdlIGJ1ZmZlciBhbmQKKyAqIHplcm8gaXMgcmV0dXJuZWQuCisgKgorICogRXhhbXBsZSB1c2U6Cis8cHJlPgordm9pZCB2QUZ1bmN0aW9uKCBNZXNzYWdlQnVmZmVyX3QgeE1lc3NhZ2VCdWZmZXIgKQorewordWludDhfdCB1Y1J4RGF0YVsgMjAgXTsKK3NpemVfdCB4UmVjZWl2ZWRCeXRlczsKK2NvbnN0IFRpY2tUeXBlX3QgeEJsb2NrVGltZSA9IHBkTVNfVE9fVElDS1MoIDIwICk7CisKKyAgICAvLyBSZWNlaXZlIHRoZSBuZXh0IG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBidWZmZXIuICBXYWl0IGluIHRoZSBCbG9ja2VkCisgICAgLy8gc3RhdGUgKHNvIG5vdCB1c2luZyBhbnkgQ1BVIHByb2Nlc3NpbmcgdGltZSkgZm9yIGEgbWF4aW11bSBvZiAxMDBtcyBmb3IKKyAgICAvLyBhIG1lc3NhZ2UgdG8gYmVjb21lIGF2YWlsYWJsZS4KKyAgICB4UmVjZWl2ZWRCeXRlcyA9IHhNZXNzYWdlQnVmZmVyUmVjZWl2ZSggeE1lc3NhZ2VCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdm9pZCAqICkgdWNSeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggdWNSeERhdGEgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeEJsb2NrVGltZSApOworCisgICAgaWYoIHhSZWNlaXZlZEJ5dGVzID4gMCApCisgICAgeworICAgICAgICAvLyBBIHVjUnhEYXRhIGNvbnRhaW5zIGEgbWVzc2FnZSB0aGF0IGlzIHhSZWNlaXZlZEJ5dGVzIGxvbmcuICBQcm9jZXNzCisgICAgICAgIC8vIHRoZSBtZXNzYWdlIGhlcmUuLi4uCisgICAgfQorfQorPC9wcmU+CisgKiBcZGVmZ3JvdXAgeE1lc3NhZ2VCdWZmZXJSZWNlaXZlIHhNZXNzYWdlQnVmZmVyUmVjZWl2ZQorICogXGluZ3JvdXAgTWVzc2FnZUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworI2RlZmluZSB4TWVzc2FnZUJ1ZmZlclJlY2VpdmUoIHhNZXNzYWdlQnVmZmVyLCBwdlJ4RGF0YSwgeEJ1ZmZlckxlbmd0aEJ5dGVzLCB4VGlja3NUb1dhaXQgKSB4U3RyZWFtQnVmZmVyUmVjZWl2ZSggKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCApIHhNZXNzYWdlQnVmZmVyLCBwdlJ4RGF0YSwgeEJ1ZmZlckxlbmd0aEJ5dGVzLCB4VGlja3NUb1dhaXQgKQorCisKKy8qKgorICogbWVzc2FnZV9idWZmZXIuaAorICoKKzxwcmU+CitzaXplX3QgeE1lc3NhZ2VCdWZmZXJSZWNlaXZlRnJvbUlTUiggTWVzc2FnZUJ1ZmZlckhhbmRsZV90IHhNZXNzYWdlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB2UnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB4QnVmZmVyTGVuZ3RoQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworPC9wcmU+CisgKgorICogQW4gaW50ZXJydXB0IHNhZmUgdmVyc2lvbiBvZiB0aGUgQVBJIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBkaXNjcmV0ZQorICogbWVzc2FnZSBmcm9tIGEgbWVzc2FnZSBidWZmZXIuICBNZXNzYWdlcyBjYW4gYmUgb2YgdmFyaWFibGUgbGVuZ3RoIGFuZCBhcmUKKyAqIGNvcGllZCBvdXQgb2YgdGhlIGJ1ZmZlci4KKyAqCisgKiAqKipOT1RFKioqOiAgVW5pcXVlbHkgYW1vbmcgRnJlZVJUT1Mgb2JqZWN0cywgdGhlIHN0cmVhbSBidWZmZXIKKyAqIGltcGxlbWVudGF0aW9uIChzbyBhbHNvIHRoZSBtZXNzYWdlIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiwgYXMgbWVzc2FnZSBidWZmZXJzCisgKiBhcmUgYnVpbHQgb24gdG9wIG9mIHN0cmVhbSBidWZmZXJzKSBhc3N1bWVzIHRoZXJlIGlzIG9ubHkgb25lIHRhc2sgb3IKKyAqIGludGVycnVwdCB0aGF0IHdpbGwgd3JpdGUgdG8gdGhlIGJ1ZmZlciAodGhlIHdyaXRlciksIGFuZCBvbmx5IG9uZSB0YXNrIG9yCisgKiBpbnRlcnJ1cHQgdGhhdCB3aWxsIHJlYWQgZnJvbSB0aGUgYnVmZmVyICh0aGUgcmVhZGVyKS4gIEl0IGlzIHNhZmUgZm9yIHRoZQorICogd3JpdGVyIGFuZCByZWFkZXIgdG8gYmUgZGlmZmVyZW50IHRhc2tzIG9yIGludGVycnVwdHMsIGJ1dCwgdW5saWtlIG90aGVyCisgKiBGcmVlUlRPUyBvYmplY3RzLCBpdCBpcyBub3Qgc2FmZSB0byBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCB3cml0ZXJzIG9yCisgKiBtdWx0aXBsZSBkaWZmZXJlbnQgcmVhZGVycy4gIElmIHRoZXJlIGFyZSB0byBiZSBtdWx0aXBsZSBkaWZmZXJlbnQgd3JpdGVycworICogdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgcGxhY2UgZWFjaCBjYWxsIHRvIGEgd3JpdGluZyBBUEkgZnVuY3Rpb24KKyAqIChzdWNoIGFzIHhNZXNzYWdlQnVmZmVyU2VuZCgpKSBpbnNpZGUgYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBzZXQgdGhlIHNlbmQKKyAqIGJsb2NrIHRpbWUgdG8gMC4gIExpa2V3aXNlLCBpZiB0aGVyZSBhcmUgdG8gYmUgbXVsdGlwbGUgZGlmZmVyZW50IHJlYWRlcnMKKyAqIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0IHBsYWNlIGVhY2ggY2FsbCB0byBhIHJlYWRpbmcgQVBJIGZ1bmN0aW9uCisgKiAoc3VjaCBhcyB4TWVzc2FnZUJ1ZmZlclJlYWQoKSkgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2V0IHRoZSByZWNlaXZlCisgKiBibG9jayB0aW1lIHRvIDAuCisgKgorICogVXNlIHhNZXNzYWdlQnVmZmVyUmVjZWl2ZSgpIHRvIHJlYWQgZnJvbSBhIG1lc3NhZ2UgYnVmZmVyIGZyb20gYSB0YXNrLiAgVXNlCisgKiB4TWVzc2FnZUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCkgdG8gcmVhZCBmcm9tIGEgbWVzc2FnZSBidWZmZXIgZnJvbSBhbgorICogaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAoSVNSKS4KKyAqCisgKiBAcGFyYW0geE1lc3NhZ2VCdWZmZXIgVGhlIGhhbmRsZSBvZiB0aGUgbWVzc2FnZSBidWZmZXIgZnJvbSB3aGljaCBhIG1lc3NhZ2UKKyAqIGlzIGJlaW5nIHJlY2VpdmVkLgorICoKKyAqIEBwYXJhbSBwdlJ4RGF0YSBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSByZWNlaXZlZCBtZXNzYWdlIGlzCisgKiB0byBiZSBjb3BpZWQuCisgKgorICogQHBhcmFtIHhCdWZmZXJMZW5ndGhCeXRlcyBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgcHZSeERhdGEKKyAqIHBhcmFtZXRlci4gIFRoaXMgc2V0cyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgdGhhdCBjYW4gYmUgcmVjZWl2ZWQuCisgKiBJZiB4QnVmZmVyTGVuZ3RoQnl0ZXMgaXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIG5leHQgbWVzc2FnZSB0aGVuIHRoZSBtZXNzYWdlCisgKiB3aWxsIGJlIGxlZnQgaW4gdGhlIG1lc3NhZ2UgYnVmZmVyIGFuZCAwIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgYSBtZXNzYWdlIGJ1ZmZlciB3aWxsCisgKiBoYXZlIGEgdGFzayBibG9ja2VkIG9uIGl0IHdhaXRpbmcgZm9yIHNwYWNlIHRvIGJlY29tZSBhdmFpbGFibGUuICBDYWxsaW5nCisgKiB4TWVzc2FnZUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCkgY2FuIG1ha2Ugc3BhY2UgYXZhaWxhYmxlLCBhbmQgc28gY2F1c2UgYSB0YXNrCisgKiB0aGF0IGlzIHdhaXRpbmcgZm9yIHNwYWNlIHRvIGxlYXZlIHRoZSBCbG9ja2VkIHN0YXRlLiAgSWYgY2FsbGluZworICogeE1lc3NhZ2VCdWZmZXJSZWNlaXZlRnJvbUlTUigpIGNhdXNlcyBhIHRhc2sgdG8gbGVhdmUgdGhlIEJsb2NrZWQgc3RhdGUsIGFuZAorICogdGhlIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sKKyAqICh0aGUgdGFzayB0aGF0IHdhcyBpbnRlcnJ1cHRlZCksIHRoZW4sIGludGVybmFsbHksCisgKiB4TWVzc2FnZUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCkgd2lsbCBzZXQgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gdG8gcGRUUlVFLgorICogSWYgeE1lc3NhZ2VCdWZmZXJSZWNlaXZlRnJvbUlTUigpIHNldHMgdGhpcyB2YWx1ZSB0byBwZFRSVUUsIHRoZW4gbm9ybWFsbHkgYQorICogY29udGV4dCBzd2l0Y2ggc2hvdWxkIGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGludGVycnVwdCBpcyBleGl0ZWQuICBUaGF0IHdpbGwKKyAqIGVuc3VyZSB0aGUgaW50ZXJydXB0IHJldHVybnMgZGlyZWN0bHkgdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgUmVhZHkgc3RhdGUKKyAqIHRhc2suICAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBzaG91bGQgYmUgc2V0IHRvIHBkRkFMU0UgYmVmb3JlIGl0IGlzCisgKiBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb24uICBTZWUgdGhlIGNvZGUgZXhhbXBsZSBiZWxvdyBmb3IgYW4gZXhhbXBsZS4KKyAqCisgKiBAcmV0dXJuIFRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgbWVzc2FnZSByZWFkIGZyb20gdGhlIG1lc3NhZ2UgYnVmZmVyLCBpZgorICogYW55LgorICoKKyAqIEV4YW1wbGUgdXNlOgorPHByZT4KKy8vIEEgbWVzc2FnZSBidWZmZXIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuCitNZXNzYWdlQnVmZmVyX3QgeE1lc3NhZ2VCdWZmZXI7CisKK3ZvaWQgdkFuSW50ZXJydXB0U2VydmljZVJvdXRpbmUoIHZvaWQgKQorewordWludDhfdCB1Y1J4RGF0YVsgMjAgXTsKK3NpemVfdCB4UmVjZWl2ZWRCeXRlczsKK0Jhc2VUeXBlX3QgeEhpZ2hlclByaW9yaXR5VGFza1dva2VuID0gcGRGQUxTRTsgIC8vIEluaXRpYWxpc2VkIHRvIHBkRkFMU0UuCisKKyAgICAvLyBSZWNlaXZlIHRoZSBuZXh0IG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBidWZmZXIuCisgICAgeFJlY2VpdmVkQnl0ZXMgPSB4TWVzc2FnZUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCB4TWVzc2FnZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2lkICogKSB1Y1J4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB1Y1J4RGF0YSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisKKyAgICBpZiggeFJlY2VpdmVkQnl0ZXMgPiAwICkKKyAgICB7CisgICAgICAgIC8vIEEgdWNSeERhdGEgY29udGFpbnMgYSBtZXNzYWdlIHRoYXQgaXMgeFJlY2VpdmVkQnl0ZXMgbG9uZy4gIFByb2Nlc3MKKyAgICAgICAgLy8gdGhlIG1lc3NhZ2UgaGVyZS4uLi4KKyAgICB9CisKKyAgICAvLyBJZiB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gd2FzIHNldCB0byBwZFRSVUUgaW5zaWRlCisgICAgLy8geE1lc3NhZ2VCdWZmZXJSZWNlaXZlRnJvbUlTUigpIHRoZW4gYSB0YXNrIHRoYXQgaGFzIGEgcHJpb3JpdHkgYWJvdmUgdGhlCisgICAgLy8gcHJpb3JpdHkgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayB3YXMgdW5ibG9ja2VkIGFuZCBhIGNvbnRleHQKKyAgICAvLyBzd2l0Y2ggc2hvdWxkIGJlIHBlcmZvcm1lZCB0byBlbnN1cmUgdGhlIElTUiByZXR1cm5zIHRvIHRoZSB1bmJsb2NrZWQKKyAgICAvLyB0YXNrLiAgSW4gbW9zdCBGcmVlUlRPUyBwb3J0cyB0aGlzIGlzIGRvbmUgYnkgc2ltcGx5IHBhc3NpbmcKKyAgICAvLyB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gaW50byB0YXNrWUlFTERfRlJPTV9JU1IoKSwgd2hpY2ggd2lsbCB0ZXN0IHRoZQorICAgIC8vIHZhcmlhYmxlcyB2YWx1ZSwgYW5kIHBlcmZvcm0gdGhlIGNvbnRleHQgc3dpdGNoIGlmIG5lY2Vzc2FyeS4gIENoZWNrIHRoZQorICAgIC8vIGRvY3VtZW50YXRpb24gZm9yIHRoZSBwb3J0IGluIHVzZSBmb3IgcG9ydCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuCisgICAgdGFza1lJRUxEX0ZST01fSVNSKCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKK30KKzwvcHJlPgorICogXGRlZmdyb3VwIHhNZXNzYWdlQnVmZmVyUmVjZWl2ZUZyb21JU1IgeE1lc3NhZ2VCdWZmZXJSZWNlaXZlRnJvbUlTUgorICogXGluZ3JvdXAgTWVzc2FnZUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworI2RlZmluZSB4TWVzc2FnZUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCB4TWVzc2FnZUJ1ZmZlciwgcHZSeERhdGEsIHhCdWZmZXJMZW5ndGhCeXRlcywgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApIHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUiggKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCApIHhNZXNzYWdlQnVmZmVyLCBwdlJ4RGF0YSwgeEJ1ZmZlckxlbmd0aEJ5dGVzLCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkKKworLyoqCisgKiBtZXNzYWdlX2J1ZmZlci5oCisgKgorPHByZT4KK3ZvaWQgdk1lc3NhZ2VCdWZmZXJEZWxldGUoIE1lc3NhZ2VCdWZmZXJIYW5kbGVfdCB4TWVzc2FnZUJ1ZmZlciApOworPC9wcmU+CisgKgorICogRGVsZXRlcyBhIG1lc3NhZ2UgYnVmZmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgY3JlYXRlZCB1c2luZyBhIGNhbGwgdG8KKyAqIHhNZXNzYWdlQnVmZmVyQ3JlYXRlKCkgb3IgeE1lc3NhZ2VCdWZmZXJDcmVhdGVTdGF0aWMoKS4gIElmIHRoZSBtZXNzYWdlCisgKiBidWZmZXIgd2FzIGNyZWF0ZWQgdXNpbmcgZHluYW1pYyBtZW1vcnkgKHRoYXQgaXMsIGJ5IHhNZXNzYWdlQnVmZmVyQ3JlYXRlKCkpLAorICogdGhlbiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpcyBmcmVlZC4KKyAqCisgKiBBIG1lc3NhZ2UgYnVmZmVyIGhhbmRsZSBtdXN0IG5vdCBiZSB1c2VkIGFmdGVyIHRoZSBtZXNzYWdlIGJ1ZmZlciBoYXMgYmVlbgorICogZGVsZXRlZC4KKyAqCisgKiBAcGFyYW0geE1lc3NhZ2VCdWZmZXIgVGhlIGhhbmRsZSBvZiB0aGUgbWVzc2FnZSBidWZmZXIgdG8gYmUgZGVsZXRlZC4KKyAqCisgKi8KKyNkZWZpbmUgdk1lc3NhZ2VCdWZmZXJEZWxldGUoIHhNZXNzYWdlQnVmZmVyICkgdlN0cmVhbUJ1ZmZlckRlbGV0ZSggKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCApIHhNZXNzYWdlQnVmZmVyICkKKworLyoqCisgKiBtZXNzYWdlX2J1ZmZlci5oCis8cHJlPgorQmFzZVR5cGVfdCB4TWVzc2FnZUJ1ZmZlcklzRnVsbCggTWVzc2FnZUJ1ZmZlckhhbmRsZV90IHhNZXNzYWdlQnVmZmVyICkgKTsKKzwvcHJlPgorICoKKyAqIFRlc3RzIHRvIHNlZSBpZiBhIG1lc3NhZ2UgYnVmZmVyIGlzIGZ1bGwuICBBIG1lc3NhZ2UgYnVmZmVyIGlzIGZ1bGwgaWYgaXQKKyAqIGNhbm5vdCBhY2NlcHQgYW55IG1vcmUgbWVzc2FnZXMsIG9mIGFueSBzaXplLCB1bnRpbCBzcGFjZSBpcyBtYWRlIGF2YWlsYWJsZQorICogYnkgYSBtZXNzYWdlIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgbWVzc2FnZSBidWZmZXIuCisgKgorICogQHBhcmFtIHhNZXNzYWdlQnVmZmVyIFRoZSBoYW5kbGUgb2YgdGhlIG1lc3NhZ2UgYnVmZmVyIGJlaW5nIHF1ZXJpZWQuCisgKgorICogQHJldHVybiBJZiB0aGUgbWVzc2FnZSBidWZmZXIgcmVmZXJlbmNlZCBieSB4TWVzc2FnZUJ1ZmZlciBpcyBmdWxsIHRoZW4KKyAqIHBkVFJVRSBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSBwZEZBTFNFIGlzIHJldHVybmVkLgorICovCisjZGVmaW5lIHhNZXNzYWdlQnVmZmVySXNGdWxsKCB4TWVzc2FnZUJ1ZmZlciApIHhTdHJlYW1CdWZmZXJJc0Z1bGwoICggU3RyZWFtQnVmZmVySGFuZGxlX3QgKSB4TWVzc2FnZUJ1ZmZlciApCisKKy8qKgorICogbWVzc2FnZV9idWZmZXIuaAorPHByZT4KK0Jhc2VUeXBlX3QgeE1lc3NhZ2VCdWZmZXJJc0VtcHR5KCBNZXNzYWdlQnVmZmVySGFuZGxlX3QgeE1lc3NhZ2VCdWZmZXIgKSApOworPC9wcmU+CisgKgorICogVGVzdHMgdG8gc2VlIGlmIGEgbWVzc2FnZSBidWZmZXIgaXMgZW1wdHkgKGRvZXMgbm90IGNvbnRhaW4gYW55IG1lc3NhZ2VzKS4KKyAqCisgKiBAcGFyYW0geE1lc3NhZ2VCdWZmZXIgVGhlIGhhbmRsZSBvZiB0aGUgbWVzc2FnZSBidWZmZXIgYmVpbmcgcXVlcmllZC4KKyAqCisgKiBAcmV0dXJuIElmIHRoZSBtZXNzYWdlIGJ1ZmZlciByZWZlcmVuY2VkIGJ5IHhNZXNzYWdlQnVmZmVyIGlzIGVtcHR5IHRoZW4KKyAqIHBkVFJVRSBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSBwZEZBTFNFIGlzIHJldHVybmVkLgorICoKKyAqLworI2RlZmluZSB4TWVzc2FnZUJ1ZmZlcklzRW1wdHkoIHhNZXNzYWdlQnVmZmVyICkgeFN0cmVhbUJ1ZmZlcklzRW1wdHkoICggU3RyZWFtQnVmZmVySGFuZGxlX3QgKSB4TWVzc2FnZUJ1ZmZlciApCisKKy8qKgorICogbWVzc2FnZV9idWZmZXIuaAorPHByZT4KK0Jhc2VUeXBlX3QgeE1lc3NhZ2VCdWZmZXJSZXNldCggTWVzc2FnZUJ1ZmZlckhhbmRsZV90IHhNZXNzYWdlQnVmZmVyICk7Cis8L3ByZT4KKyAqCisgKiBSZXNldHMgYSBtZXNzYWdlIGJ1ZmZlciB0byBpdHMgaW5pdGlhbCBlbXB0eSBzdGF0ZSwgZGlzY2FyZGluZyBhbnkgbWVzc2FnZSBpdAorICogY29udGFpbmVkLgorICoKKyAqIEEgbWVzc2FnZSBidWZmZXIgY2FuIG9ubHkgYmUgcmVzZXQgaWYgdGhlcmUgYXJlIG5vIHRhc2tzIGJsb2NrZWQgb24gaXQuCisgKgorICogQHBhcmFtIHhNZXNzYWdlQnVmZmVyIFRoZSBoYW5kbGUgb2YgdGhlIG1lc3NhZ2UgYnVmZmVyIGJlaW5nIHJlc2V0LgorICoKKyAqIEByZXR1cm4gSWYgdGhlIG1lc3NhZ2UgYnVmZmVyIHdhcyByZXNldCB0aGVuIHBkUEFTUyBpcyByZXR1cm5lZC4gIElmIHRoZQorICogbWVzc2FnZSBidWZmZXIgY291bGQgbm90IGJlIHJlc2V0IGJlY2F1c2UgZWl0aGVyIHRoZXJlIHdhcyBhIHRhc2sgYmxvY2tlZCBvbgorICogdGhlIG1lc3NhZ2UgcXVldWUgdG8gd2FpdCBmb3Igc3BhY2UgdG8gYmVjb21lIGF2YWlsYWJsZSwgb3IgdG8gd2FpdCBmb3IgYQorICogYSBtZXNzYWdlIHRvIGJlIGF2YWlsYWJsZSwgdGhlbiBwZEZBSUwgaXMgcmV0dXJuZWQuCisgKgorICogXGRlZmdyb3VwIHhNZXNzYWdlQnVmZmVyUmVzZXQgeE1lc3NhZ2VCdWZmZXJSZXNldAorICogXGluZ3JvdXAgTWVzc2FnZUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworI2RlZmluZSB4TWVzc2FnZUJ1ZmZlclJlc2V0KCB4TWVzc2FnZUJ1ZmZlciApIHhTdHJlYW1CdWZmZXJSZXNldCggKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCApIHhNZXNzYWdlQnVmZmVyICkKKworCisvKioKKyAqIG1lc3NhZ2VfYnVmZmVyLmgKKzxwcmU+CitzaXplX3QgeE1lc3NhZ2VCdWZmZXJTcGFjZUF2YWlsYWJsZSggTWVzc2FnZUJ1ZmZlckhhbmRsZV90IHhNZXNzYWdlQnVmZmVyICkgKTsKKzwvcHJlPgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGZyZWUgc3BhY2UgaW4gdGhlIG1lc3NhZ2UgYnVmZmVyLgorICoKKyAqIEBwYXJhbSB4TWVzc2FnZUJ1ZmZlciBUaGUgaGFuZGxlIG9mIHRoZSBtZXNzYWdlIGJ1ZmZlciBiZWluZyBxdWVyaWVkLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIHRoZSBtZXNzYWdlIGJ1ZmZlciBiZWZvcmUKKyAqIHRoZSBtZXNzYWdlIGJ1ZmZlciB3b3VsZCBiZSBmdWxsLiAgV2hlbiBhIG1lc3NhZ2UgaXMgd3JpdHRlbiB0byB0aGUgbWVzc2FnZQorICogYnVmZmVyIGFuIGFkZGl0aW9uYWwgc2l6ZW9mKCBzaXplX3QgKSBieXRlcyBhcmUgYWxzbyB3cml0dGVuIHRvIHN0b3JlIHRoZQorICogbWVzc2FnZSdzIGxlbmd0aC4gIHNpemVvZiggc2l6ZV90ICkgaXMgdHlwaWNhbGx5IDQgYnl0ZXMgb24gYSAzMi1iaXQKKyAqIGFyY2hpdGVjdHVyZSwgc28gaWYgeE1lc3NhZ2VCdWZmZXJTcGFjZXNBdmFpbGFibGUoKSByZXR1cm5zIDEwLCB0aGVuIHRoZSBzaXplCisgKiBvZiB0aGUgbGFyZ2VzdCBtZXNzYWdlIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIG1lc3NhZ2UgYnVmZmVyIGlzIDYgYnl0ZXMuCisgKgorICogXGRlZmdyb3VwIHhNZXNzYWdlQnVmZmVyU3BhY2VBdmFpbGFibGUgeE1lc3NhZ2VCdWZmZXJTcGFjZUF2YWlsYWJsZQorICogXGluZ3JvdXAgTWVzc2FnZUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworI2RlZmluZSB4TWVzc2FnZUJ1ZmZlclNwYWNlQXZhaWxhYmxlKCB4TWVzc2FnZUJ1ZmZlciApIHhTdHJlYW1CdWZmZXJTcGFjZXNBdmFpbGFibGUoICggU3RyZWFtQnVmZmVySGFuZGxlX3QgKSB4TWVzc2FnZUJ1ZmZlciApCisKKy8qKgorICogbWVzc2FnZV9idWZmZXIuaAorICoKKzxwcmU+CitCYXNlVHlwZV90IHhNZXNzYWdlQnVmZmVyU2VuZENvbXBsZXRlZEZyb21JU1IoIE1lc3NhZ2VCdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7Cis8L3ByZT4KKyAqCisgKiBGb3IgYWR2YW5jZWQgdXNlcnMgb25seS4KKyAqCisgKiBUaGUgc2JTRU5EX0NPTVBMRVRFRCgpIG1hY3JvIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgRnJlZVJUT1MgQVBJcyB3aGVuCisgKiBkYXRhIGlzIHNlbnQgdG8gYSBtZXNzYWdlIGJ1ZmZlciBvciBzdHJlYW0gYnVmZmVyLiAgSWYgdGhlcmUgd2FzIGEgdGFzayB0aGF0CisgKiB3YXMgYmxvY2tlZCBvbiB0aGUgbWVzc2FnZSBvciBzdHJlYW0gYnVmZmVyIHdhaXRpbmcgZm9yIGRhdGEgdG8gYXJyaXZlIHRoZW4KKyAqIHRoZSBzYlNFTkRfQ09NUExFVEVEKCkgbWFjcm8gc2VuZHMgYSBub3RpZmljYXRpb24gdG8gdGhlIHRhc2sgdG8gcmVtb3ZlIGl0CisgKiBmcm9tIHRoZSBCbG9ja2VkIHN0YXRlLiAgeE1lc3NhZ2VCdWZmZXJTZW5kQ29tcGxldGVkRnJvbUlTUigpIGRvZXMgdGhlIHNhbWUKKyAqIHRoaW5nLiAgSXQgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gaW1wbGVtZW50IHRoZWlyIG93bgorICogdmVyc2lvbiBvZiBzYlNFTkRfQ09NUExFVEVEKCksIGFuZCBNVVNUIE5PVCBCRSBVU0VEIEFUIEFOWSBPVEhFUiBUSU1FLgorICoKKyAqIFNlZSB0aGUgZXhhbXBsZSBpbXBsZW1lbnRlZCBpbiBGcmVlUlRPUy9EZW1vL01pbmltYWwvTWVzc2FnZUJ1ZmZlckFNUC5jIGZvcgorICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW0geFN0cmVhbUJ1ZmZlciBUaGUgaGFuZGxlIG9mIHRoZSBzdHJlYW0gYnVmZmVyIHRvIHdoaWNoIGRhdGEgd2FzCisgKiB3cml0dGVuLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHNob3VsZCBiZQorICogaW5pdGlhbGlzZWQgdG8gcGRGQUxTRSBiZWZvcmUgaXQgaXMgcGFzc2VkIGludG8KKyAqIHhNZXNzYWdlQnVmZmVyU2VuZENvbXBsZXRlZEZyb21JU1IoKS4gIElmIGNhbGxpbmcKKyAqIHhNZXNzYWdlQnVmZmVyU2VuZENvbXBsZXRlZEZyb21JU1IoKSByZW1vdmVzIGEgdGFzayBmcm9tIHRoZSBCbG9ja2VkIHN0YXRlLAorICogYW5kIHRoZSB0YXNrIGhhcyBhIHByaW9yaXR5IGFib3ZlIHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzaywKKyAqIHRoZW4gKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gd2lsbCBnZXQgc2V0IHRvIHBkVFJVRSBpbmRpY2F0aW5nIHRoYXQgYQorICogY29udGV4dCBzd2l0Y2ggc2hvdWxkIGJlIHBlcmZvcm1lZCBiZWZvcmUgZXhpdGluZyB0aGUgSVNSLgorICoKKyAqIEByZXR1cm4gSWYgYSB0YXNrIHdhcyByZW1vdmVkIGZyb20gdGhlIEJsb2NrZWQgc3RhdGUgdGhlbiBwZFRSVUUgaXMgcmV0dXJuZWQuCisgKiBPdGhlcndpc2UgcGRGQUxTRSBpcyByZXR1cm5lZC4KKyAqCisgKiBcZGVmZ3JvdXAgeE1lc3NhZ2VCdWZmZXJTZW5kQ29tcGxldGVkRnJvbUlTUiB4TWVzc2FnZUJ1ZmZlclNlbmRDb21wbGV0ZWRGcm9tSVNSCisgKiBcaW5ncm91cCBTdHJlYW1CdWZmZXJNYW5hZ2VtZW50CisgKi8KKyNkZWZpbmUgeE1lc3NhZ2VCdWZmZXJTZW5kQ29tcGxldGVkRnJvbUlTUiggeE1lc3NhZ2VCdWZmZXIsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSB4U3RyZWFtQnVmZmVyU2VuZENvbXBsZXRlZEZyb21JU1IoICggU3RyZWFtQnVmZmVySGFuZGxlX3QgKSB4TWVzc2FnZUJ1ZmZlciwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApCisKKy8qKgorICogbWVzc2FnZV9idWZmZXIuaAorICoKKzxwcmU+CitCYXNlVHlwZV90IHhNZXNzYWdlQnVmZmVyUmVjZWl2ZUNvbXBsZXRlZEZyb21JU1IoIE1lc3NhZ2VCdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7Cis8L3ByZT4KKyAqCisgKiBGb3IgYWR2YW5jZWQgdXNlcnMgb25seS4KKyAqCisgKiBUaGUgc2JSRUNFSVZFX0NPTVBMRVRFRCgpIG1hY3JvIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgRnJlZVJUT1MgQVBJcyB3aGVuCisgKiBkYXRhIGlzIHJlYWQgb3V0IG9mIGEgbWVzc2FnZSBidWZmZXIgb3Igc3RyZWFtIGJ1ZmZlci4gIElmIHRoZXJlIHdhcyBhIHRhc2sKKyAqIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhlIG1lc3NhZ2Ugb3Igc3RyZWFtIGJ1ZmZlciB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZQorICogdGhlbiB0aGUgc2JSRUNFSVZFX0NPTVBMRVRFRCgpIG1hY3JvIHNlbmRzIGEgbm90aWZpY2F0aW9uIHRvIHRoZSB0YXNrIHRvCisgKiByZW1vdmUgaXQgZnJvbSB0aGUgQmxvY2tlZCBzdGF0ZS4gIHhNZXNzYWdlQnVmZmVyUmVjZWl2ZUNvbXBsZXRlZEZyb21JU1IoKQorICogZG9lcyB0aGUgc2FtZSB0aGluZy4gIEl0IGlzIHByb3ZpZGVkIHRvIGVuYWJsZSBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvCisgKiBpbXBsZW1lbnQgdGhlaXIgb3duIHZlcnNpb24gb2Ygc2JSRUNFSVZFX0NPTVBMRVRFRCgpLCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBBVAorICogQU5ZIE9USEVSIFRJTUUuCisgKgorICogU2VlIHRoZSBleGFtcGxlIGltcGxlbWVudGVkIGluIEZyZWVSVE9TL0RlbW8vTWluaW1hbC9NZXNzYWdlQnVmZmVyQU1QLmMgZm9yCisgKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorICoKKyAqIEBwYXJhbSB4U3RyZWFtQnVmZmVyIFRoZSBoYW5kbGUgb2YgdGhlIHN0cmVhbSBidWZmZXIgZnJvbSB3aGljaCBkYXRhIHdhcworICogcmVhZC4KKyAqCisgKiBAcGFyYW0gcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBzaG91bGQgYmUKKyAqIGluaXRpYWxpc2VkIHRvIHBkRkFMU0UgYmVmb3JlIGl0IGlzIHBhc3NlZCBpbnRvCisgKiB4TWVzc2FnZUJ1ZmZlclJlY2VpdmVDb21wbGV0ZWRGcm9tSVNSKCkuICBJZiBjYWxsaW5nCisgKiB4TWVzc2FnZUJ1ZmZlclJlY2VpdmVDb21wbGV0ZWRGcm9tSVNSKCkgcmVtb3ZlcyBhIHRhc2sgZnJvbSB0aGUgQmxvY2tlZCBzdGF0ZSwKKyAqIGFuZCB0aGUgdGFzayBoYXMgYSBwcmlvcml0eSBhYm92ZSB0aGUgcHJpb3JpdHkgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2ssCisgKiB0aGVuICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHdpbGwgZ2V0IHNldCB0byBwZFRSVUUgaW5kaWNhdGluZyB0aGF0IGEKKyAqIGNvbnRleHQgc3dpdGNoIHNob3VsZCBiZSBwZXJmb3JtZWQgYmVmb3JlIGV4aXRpbmcgdGhlIElTUi4KKyAqCisgKiBAcmV0dXJuIElmIGEgdGFzayB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBCbG9ja2VkIHN0YXRlIHRoZW4gcGRUUlVFIGlzIHJldHVybmVkLgorICogT3RoZXJ3aXNlIHBkRkFMU0UgaXMgcmV0dXJuZWQuCisgKgorICogXGRlZmdyb3VwIHhNZXNzYWdlQnVmZmVyUmVjZWl2ZUNvbXBsZXRlZEZyb21JU1IgeE1lc3NhZ2VCdWZmZXJSZWNlaXZlQ29tcGxldGVkRnJvbUlTUgorICogXGluZ3JvdXAgU3RyZWFtQnVmZmVyTWFuYWdlbWVudAorICovCisjZGVmaW5lIHhNZXNzYWdlQnVmZmVyUmVjZWl2ZUNvbXBsZXRlZEZyb21JU1IoIHhNZXNzYWdlQnVmZmVyLCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgeFN0cmVhbUJ1ZmZlclJlY2VpdmVDb21wbGV0ZWRGcm9tSVNSKCAoIFN0cmVhbUJ1ZmZlckhhbmRsZV90ICkgeE1lc3NhZ2VCdWZmZXIsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKQorCisjaWYgZGVmaW5lZCggX19jcGx1c3BsdXMgKQorfSAvKiBleHRlcm4gIkMiICovCisjZW5kaWYKKworI2VuZGlmCS8qICFkZWZpbmVkKCBGUkVFUlRPU19NRVNTQUdFX0JVRkZFUl9IICkgKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL21wdV9wcm90b3R5cGVzLmggYi9Tb3VyY2UvaW5jbHVkZS9tcHVfcHJvdG90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzg5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvaW5jbHVkZS9tcHVfcHJvdG90eXBlcy5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyoKKyAqIFdoZW4gdGhlIE1QVSBpcyB1c2VkIHRoZSBzdGFuZGFyZCAobm9uIE1QVSkgQVBJIGZ1bmN0aW9ucyBhcmUgbWFwcGVkIHRvCisgKiBlcXVpdmFsZW50cyB0aGF0IHN0YXJ0ICJNUFVfIiwgdGhlIHByb3RvdHlwZXMgZm9yIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoaXMKKyAqIGhlYWRlciBmaWxlcy4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgYXBwbGljYXRpb24gY29kZSB0byBjYWxsIHRoZSBNUFVfIHZlcnNpb24KKyAqIHdoaWNoIHdyYXBzIHRoZSBub24tTVBVIHZlcnNpb24gd2l0aCBwcml2aWxlZ2UgcHJvbW90aW5nIHRoZW4gZGVtb3RpbmcgY29kZSwKKyAqIHNvIHRoZSBrZXJuZWwgY29kZSBhbHdheXMgcnVucyB3aWxsIGZ1bGwgcHJpdmlsZWdlcy4KKyAqLworCisKKyNpZm5kZWYgTVBVX1BST1RPVFlQRVNfSAorI2RlZmluZSBNUFVfUFJPVE9UWVBFU19ICisKKy8qIE1QVSB2ZXJzaW9ucyBvZiB0YXNrcy5oIEFQSSBmdW5jdGlvbnMuICovCitCYXNlVHlwZV90IE1QVV94VGFza0NyZWF0ZSggVGFza0Z1bmN0aW9uX3QgcHhUYXNrQ29kZSwgY29uc3QgY2hhciAqIGNvbnN0IHBjTmFtZSwgY29uc3QgdWludDE2X3QgdXNTdGFja0RlcHRoLCB2b2lkICogY29uc3QgcHZQYXJhbWV0ZXJzLCBVQmFzZVR5cGVfdCB1eFByaW9yaXR5LCBUYXNrSGFuZGxlX3QgKiBjb25zdCBweENyZWF0ZWRUYXNrICk7CitUYXNrSGFuZGxlX3QgTVBVX3hUYXNrQ3JlYXRlU3RhdGljKCBUYXNrRnVuY3Rpb25fdCBweFRhc2tDb2RlLCBjb25zdCBjaGFyICogY29uc3QgcGNOYW1lLCBjb25zdCB1aW50MzJfdCB1bFN0YWNrRGVwdGgsIHZvaWQgKiBjb25zdCBwdlBhcmFtZXRlcnMsIFVCYXNlVHlwZV90IHV4UHJpb3JpdHksIFN0YWNrVHlwZV90ICogY29uc3QgcHV4U3RhY2tCdWZmZXIsIFN0YXRpY1Rhc2tfdCAqIGNvbnN0IHB4VGFza0J1ZmZlciApOworQmFzZVR5cGVfdCBNUFVfeFRhc2tDcmVhdGVSZXN0cmljdGVkKCBjb25zdCBUYXNrUGFyYW1ldGVyc190ICogY29uc3QgcHhUYXNrRGVmaW5pdGlvbiwgVGFza0hhbmRsZV90ICpweENyZWF0ZWRUYXNrICk7CitCYXNlVHlwZV90IE1QVV94VGFza0NyZWF0ZVJlc3RyaWN0ZWRTdGF0aWMoIGNvbnN0IFRhc2tQYXJhbWV0ZXJzX3QgKiBjb25zdCBweFRhc2tEZWZpbml0aW9uLCBUYXNrSGFuZGxlX3QgKnB4Q3JlYXRlZFRhc2sgKTsKK3ZvaWQgTVBVX3ZUYXNrQWxsb2NhdGVNUFVSZWdpb25zKCBUYXNrSGFuZGxlX3QgeFRhc2ssIGNvbnN0IE1lbW9yeVJlZ2lvbl90ICogY29uc3QgcHhSZWdpb25zICk7Cit2b2lkIE1QVV92VGFza0RlbGV0ZSggVGFza0hhbmRsZV90IHhUYXNrVG9EZWxldGUgKTsKK3ZvaWQgTVBVX3ZUYXNrRGVsYXkoIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9EZWxheSApOwordm9pZCBNUFVfdlRhc2tEZWxheVVudGlsKCBUaWNrVHlwZV90ICogY29uc3QgcHhQcmV2aW91c1dha2VUaW1lLCBjb25zdCBUaWNrVHlwZV90IHhUaW1lSW5jcmVtZW50ICk7CitCYXNlVHlwZV90IE1QVV94VGFza0Fib3J0RGVsYXkoIFRhc2tIYW5kbGVfdCB4VGFzayApOworVUJhc2VUeXBlX3QgTVBVX3V4VGFza1ByaW9yaXR5R2V0KCBUYXNrSGFuZGxlX3QgeFRhc2sgKTsKK2VUYXNrU3RhdGUgTVBVX2VUYXNrR2V0U3RhdGUoIFRhc2tIYW5kbGVfdCB4VGFzayApOwordm9pZCBNUFVfdlRhc2tHZXRJbmZvKCBUYXNrSGFuZGxlX3QgeFRhc2ssIFRhc2tTdGF0dXNfdCAqcHhUYXNrU3RhdHVzLCBCYXNlVHlwZV90IHhHZXRGcmVlU3RhY2tTcGFjZSwgZVRhc2tTdGF0ZSBlU3RhdGUgKTsKK3ZvaWQgTVBVX3ZUYXNrUHJpb3JpdHlTZXQoIFRhc2tIYW5kbGVfdCB4VGFzaywgVUJhc2VUeXBlX3QgdXhOZXdQcmlvcml0eSApOwordm9pZCBNUFVfdlRhc2tTdXNwZW5kKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1N1c3BlbmQgKTsKK3ZvaWQgTVBVX3ZUYXNrUmVzdW1lKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1Jlc3VtZSApOwordm9pZCBNUFVfdlRhc2tTdGFydFNjaGVkdWxlciggdm9pZCApOwordm9pZCBNUFVfdlRhc2tTdXNwZW5kQWxsKCB2b2lkICk7CitCYXNlVHlwZV90IE1QVV94VGFza1Jlc3VtZUFsbCggdm9pZCApOworVGlja1R5cGVfdCBNUFVfeFRhc2tHZXRUaWNrQ291bnQoIHZvaWQgKTsKK1VCYXNlVHlwZV90IE1QVV91eFRhc2tHZXROdW1iZXJPZlRhc2tzKCB2b2lkICk7CitjaGFyICogTVBVX3BjVGFza0dldE5hbWUoIFRhc2tIYW5kbGVfdCB4VGFza1RvUXVlcnkgKTsKK1Rhc2tIYW5kbGVfdCBNUFVfeFRhc2tHZXRIYW5kbGUoIGNvbnN0IGNoYXIgKnBjTmFtZVRvUXVlcnkgKTsKK1VCYXNlVHlwZV90IE1QVV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsoIFRhc2tIYW5kbGVfdCB4VGFzayApOwordm9pZCBNUFVfdlRhc2tTZXRBcHBsaWNhdGlvblRhc2tUYWcoIFRhc2tIYW5kbGVfdCB4VGFzaywgVGFza0hvb2tGdW5jdGlvbl90IHB4SG9va0Z1bmN0aW9uICk7CitUYXNrSG9va0Z1bmN0aW9uX3QgTVBVX3hUYXNrR2V0QXBwbGljYXRpb25UYXNrVGFnKCBUYXNrSGFuZGxlX3QgeFRhc2sgKTsKK3ZvaWQgTVBVX3ZUYXNrU2V0VGhyZWFkTG9jYWxTdG9yYWdlUG9pbnRlciggVGFza0hhbmRsZV90IHhUYXNrVG9TZXQsIEJhc2VUeXBlX3QgeEluZGV4LCB2b2lkICpwdlZhbHVlICk7Cit2b2lkICogTVBVX3B2VGFza0dldFRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXIoIFRhc2tIYW5kbGVfdCB4VGFza1RvUXVlcnksIEJhc2VUeXBlX3QgeEluZGV4ICk7CitCYXNlVHlwZV90IE1QVV94VGFza0NhbGxBcHBsaWNhdGlvblRhc2tIb29rKCBUYXNrSGFuZGxlX3QgeFRhc2ssIHZvaWQgKnB2UGFyYW1ldGVyICk7CitUYXNrSGFuZGxlX3QgTVBVX3hUYXNrR2V0SWRsZVRhc2tIYW5kbGUoIHZvaWQgKTsKK1VCYXNlVHlwZV90IE1QVV91eFRhc2tHZXRTeXN0ZW1TdGF0ZSggVGFza1N0YXR1c190ICogY29uc3QgcHhUYXNrU3RhdHVzQXJyYXksIGNvbnN0IFVCYXNlVHlwZV90IHV4QXJyYXlTaXplLCB1aW50MzJfdCAqIGNvbnN0IHB1bFRvdGFsUnVuVGltZSApOwordm9pZCBNUFVfdlRhc2tMaXN0KCBjaGFyICogcGNXcml0ZUJ1ZmZlciApOwordm9pZCBNUFVfdlRhc2tHZXRSdW5UaW1lU3RhdHMoIGNoYXIgKnBjV3JpdGVCdWZmZXIgKTsKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrR2VuZXJpY05vdGlmeSggVGFza0hhbmRsZV90IHhUYXNrVG9Ob3RpZnksIHVpbnQzMl90IHVsVmFsdWUsIGVOb3RpZnlBY3Rpb24gZUFjdGlvbiwgdWludDMyX3QgKnB1bFByZXZpb3VzTm90aWZpY2F0aW9uVmFsdWUgKTsKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrTm90aWZ5V2FpdCggdWludDMyX3QgdWxCaXRzVG9DbGVhck9uRW50cnksIHVpbnQzMl90IHVsQml0c1RvQ2xlYXJPbkV4aXQsIHVpbnQzMl90ICpwdWxOb3RpZmljYXRpb25WYWx1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKK3VpbnQzMl90IE1QVV91bFRhc2tOb3RpZnlUYWtlKCBCYXNlVHlwZV90IHhDbGVhckNvdW50T25FeGl0LCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOworQmFzZVR5cGVfdCBNUFVfeFRhc2tOb3RpZnlTdGF0ZUNsZWFyKCBUYXNrSGFuZGxlX3QgeFRhc2sgKTsKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrSW5jcmVtZW50VGljayggdm9pZCApOworVGFza0hhbmRsZV90IE1QVV94VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCB2b2lkICk7Cit2b2lkIE1QVV92VGFza1NldFRpbWVPdXRTdGF0ZSggVGltZU91dF90ICogY29uc3QgcHhUaW1lT3V0ICk7CitCYXNlVHlwZV90IE1QVV94VGFza0NoZWNrRm9yVGltZU91dCggVGltZU91dF90ICogY29uc3QgcHhUaW1lT3V0LCBUaWNrVHlwZV90ICogY29uc3QgcHhUaWNrc1RvV2FpdCApOwordm9pZCBNUFVfdlRhc2tNaXNzZWRZaWVsZCggdm9pZCApOworQmFzZVR5cGVfdCBNUFVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSggdm9pZCApOworCisvKiBNUFUgdmVyc2lvbnMgb2YgcXVldWUuaCBBUEkgZnVuY3Rpb25zLiAqLworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlR2VuZXJpY1NlbmQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICogY29uc3QgcHZJdGVtVG9RdWV1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQsIGNvbnN0IEJhc2VUeXBlX3QgeENvcHlQb3NpdGlvbiApOworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlUmVjZWl2ZSggUXVldWVIYW5kbGVfdCB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKK0Jhc2VUeXBlX3QgTVBVX3hRdWV1ZVBlZWsoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCB2b2lkICogY29uc3QgcHZCdWZmZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7CitCYXNlVHlwZV90IE1QVV94UXVldWVTZW1hcGhvcmVUYWtlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKK1VCYXNlVHlwZV90IE1QVV91eFF1ZXVlTWVzc2FnZXNXYWl0aW5nKCBjb25zdCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApOworVUJhc2VUeXBlX3QgTVBVX3V4UXVldWVTcGFjZXNBdmFpbGFibGUoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICk7Cit2b2lkIE1QVV92UXVldWVEZWxldGUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICk7CitRdWV1ZUhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVNdXRleCggY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSApOworUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlTXV0ZXhTdGF0aWMoIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUsIFN0YXRpY1F1ZXVlX3QgKnB4U3RhdGljUXVldWUgKTsKK1F1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlKCBjb25zdCBVQmFzZVR5cGVfdCB1eE1heENvdW50LCBjb25zdCBVQmFzZVR5cGVfdCB1eEluaXRpYWxDb3VudCApOworUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmVTdGF0aWMoIGNvbnN0IFVCYXNlVHlwZV90IHV4TWF4Q291bnQsIGNvbnN0IFVCYXNlVHlwZV90IHV4SW5pdGlhbENvdW50LCBTdGF0aWNRdWV1ZV90ICpweFN0YXRpY1F1ZXVlICk7Cit2b2lkKiBNUFVfeFF1ZXVlR2V0TXV0ZXhIb2xkZXIoIFF1ZXVlSGFuZGxlX3QgeFNlbWFwaG9yZSApOworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlVGFrZU11dGV4UmVjdXJzaXZlKCBRdWV1ZUhhbmRsZV90IHhNdXRleCwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKK0Jhc2VUeXBlX3QgTVBVX3hRdWV1ZUdpdmVNdXRleFJlY3Vyc2l2ZSggUXVldWVIYW5kbGVfdCBweE11dGV4ICk7Cit2b2lkIE1QVV92UXVldWVBZGRUb1JlZ2lzdHJ5KCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgY29uc3QgY2hhciAqcGNOYW1lICk7Cit2b2lkIE1QVV92UXVldWVVbnJlZ2lzdGVyUXVldWUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICk7Citjb25zdCBjaGFyICogTVBVX3BjUXVldWVHZXROYW1lKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApOworUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlR2VuZXJpY0NyZWF0ZSggY29uc3QgVUJhc2VUeXBlX3QgdXhRdWV1ZUxlbmd0aCwgY29uc3QgVUJhc2VUeXBlX3QgdXhJdGVtU2l6ZSwgY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSApOworUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlR2VuZXJpY0NyZWF0ZVN0YXRpYyggY29uc3QgVUJhc2VUeXBlX3QgdXhRdWV1ZUxlbmd0aCwgY29uc3QgVUJhc2VUeXBlX3QgdXhJdGVtU2l6ZSwgdWludDhfdCAqcHVjUXVldWVTdG9yYWdlLCBTdGF0aWNRdWV1ZV90ICpweFN0YXRpY1F1ZXVlLCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlICk7CitRdWV1ZVNldEhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVTZXQoIGNvbnN0IFVCYXNlVHlwZV90IHV4RXZlbnRRdWV1ZUxlbmd0aCApOworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlQWRkVG9TZXQoIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgeFF1ZXVlT3JTZW1hcGhvcmUsIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0ICk7CitCYXNlVHlwZV90IE1QVV94UXVldWVSZW1vdmVGcm9tU2V0KCBRdWV1ZVNldE1lbWJlckhhbmRsZV90IHhRdWV1ZU9yU2VtYXBob3JlLCBRdWV1ZVNldEhhbmRsZV90IHhRdWV1ZVNldCApOworUXVldWVTZXRNZW1iZXJIYW5kbGVfdCBNUFVfeFF1ZXVlU2VsZWN0RnJvbVNldCggUXVldWVTZXRIYW5kbGVfdCB4UXVldWVTZXQsIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7CitCYXNlVHlwZV90IE1QVV94UXVldWVHZW5lcmljUmVzZXQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBCYXNlVHlwZV90IHhOZXdRdWV1ZSApOwordm9pZCBNUFVfdlF1ZXVlU2V0UXVldWVOdW1iZXIoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBVQmFzZVR5cGVfdCB1eFF1ZXVlTnVtYmVyICk7CitVQmFzZVR5cGVfdCBNUFVfdXhRdWV1ZUdldFF1ZXVlTnVtYmVyKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApOwordWludDhfdCBNUFVfdWNRdWV1ZUdldFF1ZXVlVHlwZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKTsKKworLyogTVBVIHZlcnNpb25zIG9mIHRpbWVycy5oIEFQSSBmdW5jdGlvbnMuICovCitUaW1lckhhbmRsZV90IE1QVV94VGltZXJDcmVhdGUoIGNvbnN0IGNoYXIgKiBjb25zdCBwY1RpbWVyTmFtZSwgY29uc3QgVGlja1R5cGVfdCB4VGltZXJQZXJpb2RJblRpY2tzLCBjb25zdCBVQmFzZVR5cGVfdCB1eEF1dG9SZWxvYWQsIHZvaWQgKiBjb25zdCBwdlRpbWVySUQsIFRpbWVyQ2FsbGJhY2tGdW5jdGlvbl90IHB4Q2FsbGJhY2tGdW5jdGlvbiApOworVGltZXJIYW5kbGVfdCBNUFVfeFRpbWVyQ3JlYXRlU3RhdGljKCBjb25zdCBjaGFyICogY29uc3QgcGNUaW1lck5hbWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpbWVyUGVyaW9kSW5UaWNrcywgY29uc3QgVUJhc2VUeXBlX3QgdXhBdXRvUmVsb2FkLCB2b2lkICogY29uc3QgcHZUaW1lcklELCBUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCBweENhbGxiYWNrRnVuY3Rpb24sIFN0YXRpY1RpbWVyX3QgKnB4VGltZXJCdWZmZXIgKTsKK3ZvaWQgKiBNUFVfcHZUaW1lckdldFRpbWVySUQoIGNvbnN0IFRpbWVySGFuZGxlX3QgeFRpbWVyICk7Cit2b2lkIE1QVV92VGltZXJTZXRUaW1lcklEKCBUaW1lckhhbmRsZV90IHhUaW1lciwgdm9pZCAqcHZOZXdJRCApOworQmFzZVR5cGVfdCBNUFVfeFRpbWVySXNUaW1lckFjdGl2ZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKTsKK1Rhc2tIYW5kbGVfdCBNUFVfeFRpbWVyR2V0VGltZXJEYWVtb25UYXNrSGFuZGxlKCB2b2lkICk7CitCYXNlVHlwZV90IE1QVV94VGltZXJQZW5kRnVuY3Rpb25DYWxsKCBQZW5kZWRGdW5jdGlvbl90IHhGdW5jdGlvblRvUGVuZCwgdm9pZCAqcHZQYXJhbWV0ZXIxLCB1aW50MzJfdCB1bFBhcmFtZXRlcjIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7Citjb25zdCBjaGFyICogTVBVX3BjVGltZXJHZXROYW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApOworVGlja1R5cGVfdCBNUFVfeFRpbWVyR2V0UGVyaW9kKCBUaW1lckhhbmRsZV90IHhUaW1lciApOworVGlja1R5cGVfdCBNUFVfeFRpbWVyR2V0RXhwaXJ5VGltZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKTsKK0Jhc2VUeXBlX3QgTVBVX3hUaW1lckNyZWF0ZVRpbWVyVGFzayggdm9pZCApOworQmFzZVR5cGVfdCBNUFVfeFRpbWVyR2VuZXJpY0NvbW1hbmQoIFRpbWVySGFuZGxlX3QgeFRpbWVyLCBjb25zdCBCYXNlVHlwZV90IHhDb21tYW5kSUQsIGNvbnN0IFRpY2tUeXBlX3QgeE9wdGlvbmFsVmFsdWUsIEJhc2VUeXBlX3QgKiBjb25zdCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuLCBjb25zdCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOworCisvKiBNUFUgdmVyc2lvbnMgb2YgZXZlbnRfZ3JvdXAuaCBBUEkgZnVuY3Rpb25zLiAqLworRXZlbnRHcm91cEhhbmRsZV90IE1QVV94RXZlbnRHcm91cENyZWF0ZSggdm9pZCApOworRXZlbnRHcm91cEhhbmRsZV90IE1QVV94RXZlbnRHcm91cENyZWF0ZVN0YXRpYyggU3RhdGljRXZlbnRHcm91cF90ICpweEV2ZW50R3JvdXBCdWZmZXIgKTsKK0V2ZW50Qml0c190IE1QVV94RXZlbnRHcm91cFdhaXRCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvV2FpdEZvciwgY29uc3QgQmFzZVR5cGVfdCB4Q2xlYXJPbkV4aXQsIGNvbnN0IEJhc2VUeXBlX3QgeFdhaXRGb3JBbGxCaXRzLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOworRXZlbnRCaXRzX3QgTVBVX3hFdmVudEdyb3VwQ2xlYXJCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvQ2xlYXIgKTsKK0V2ZW50Qml0c190IE1QVV94RXZlbnRHcm91cFNldEJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9TZXQgKTsKK0V2ZW50Qml0c190IE1QVV94RXZlbnRHcm91cFN5bmMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9TZXQsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvV2FpdEZvciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKK3ZvaWQgTVBVX3ZFdmVudEdyb3VwRGVsZXRlKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAgKTsKK1VCYXNlVHlwZV90IE1QVV91eEV2ZW50R3JvdXBHZXROdW1iZXIoIHZvaWQqIHhFdmVudEdyb3VwICk7CisKKy8qIE1QVSB2ZXJzaW9ucyBvZiBtZXNzYWdlL3N0cmVhbV9idWZmZXIuaCBBUEkgZnVuY3Rpb25zLiAqLworc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyU2VuZCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgY29uc3Qgdm9pZCAqcHZUeERhdGEsIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOworc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyU2VuZEZyb21JU1IoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIGNvbnN0IHZvaWQgKnB2VHhEYXRhLCBzaXplX3QgeERhdGFMZW5ndGhCeXRlcywgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKK3NpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclJlY2VpdmUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIHZvaWQgKnB2UnhEYXRhLCBzaXplX3QgeEJ1ZmZlckxlbmd0aEJ5dGVzLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOworc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyUmVjZWl2ZUZyb21JU1IoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIHZvaWQgKnB2UnhEYXRhLCBzaXplX3QgeEJ1ZmZlckxlbmd0aEJ5dGVzLCBCYXNlVHlwZV90ICogY29uc3QgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOwordm9pZCBNUFVfdlN0cmVhbUJ1ZmZlckRlbGV0ZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApOworQmFzZVR5cGVfdCBNUFVfeFN0cmVhbUJ1ZmZlcklzRnVsbCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApOworQmFzZVR5cGVfdCBNUFVfeFN0cmVhbUJ1ZmZlcklzRW1wdHkoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKTsKK0Jhc2VUeXBlX3QgTVBVX3hTdHJlYW1CdWZmZXJSZXNldCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApOworc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyU3BhY2VzQXZhaWxhYmxlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICk7CitzaXplX3QgTVBVX3hTdHJlYW1CdWZmZXJCeXRlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApOworQmFzZVR5cGVfdCBNUFVfeFN0cmVhbUJ1ZmZlclNldFRyaWdnZXJMZXZlbCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgc2l6ZV90IHhUcmlnZ2VyTGV2ZWwgKTsKK1N0cmVhbUJ1ZmZlckhhbmRsZV90IE1QVV94U3RyZWFtQnVmZmVyR2VuZXJpY0NyZWF0ZSggc2l6ZV90IHhCdWZmZXJTaXplQnl0ZXMsIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsIEJhc2VUeXBlX3QgeElzTWVzc2FnZUJ1ZmZlciApOworU3RyZWFtQnVmZmVySGFuZGxlX3QgTVBVX3hTdHJlYW1CdWZmZXJHZW5lcmljQ3JlYXRlU3RhdGljKCBzaXplX3QgeEJ1ZmZlclNpemVCeXRlcywgc2l6ZV90IHhUcmlnZ2VyTGV2ZWxCeXRlcywgQmFzZVR5cGVfdCB4SXNNZXNzYWdlQnVmZmVyLCB1aW50OF90ICogY29uc3QgcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEsIFN0YXRpY1N0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdGF0aWNTdHJlYW1CdWZmZXIgKTsKKworCisKKyNlbmRpZiAvKiBNUFVfUFJPVE9UWVBFU19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL21wdV93cmFwcGVycy5oIGIvU291cmNlL2luY2x1ZGUvbXB1X3dyYXBwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzMjZlNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9pbmNsdWRlL21wdV93cmFwcGVycy5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBNUFVfV1JBUFBFUlNfSAorI2RlZmluZSBNUFVfV1JBUFBFUlNfSAorCisvKiBUaGlzIGZpbGUgcmVkZWZpbmVzIEFQSSBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHRocm91Z2ggYSB3cmFwcGVyIG1hY3JvLCBidXQKK29ubHkgZm9yIHBvcnRzIHRoYXQgYXJlIHVzaW5nIHRoZSBNUFUuICovCisjaWZkZWYgcG9ydFVTSU5HX01QVV9XUkFQUEVSUworCisJLyogTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgd2lsbCBiZSBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzCisJaW5jbHVkZWQgZnJvbSBxdWV1ZS5jIG9yIHRhc2suYyB0byBwcmV2ZW50IGl0IGZyb20gaGF2aW5nIGFuIGVmZmVjdCB3aXRoaW4KKwl0aG9zZSBmaWxlcy4gKi8KKwkjaWZuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKwkJLyoKKwkJICogTWFwIHN0YW5kYXJkIChub24gTVBVKSBBUEkgZnVuY3Rpb25zIHRvIGVxdWl2YWxlbnRzIHRoYXQgc3RhcnQKKwkJICogIk1QVV8iLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBhcHBsaWNhdGlvbiBjb2RlIHRvIGNhbGwgdGhlIE1QVV8KKwkJICogdmVyc2lvbiwgd2hpY2ggd3JhcHMgdGhlIG5vbi1NUFUgdmVyc2lvbiB3aXRoIHByaXZpbGVnZSBwcm9tb3RpbmcKKwkJICogdGhlbiBkZW1vdGluZyBjb2RlLCBzbyB0aGUga2VybmVsIGNvZGUgYWx3YXlzIHJ1bnMgd2lsbCBmdWxsCisJCSAqIHByaXZpbGVnZXMuCisJCSAqLworCisJCS8qIE1hcCBzdGFuZGFyZCB0YXNrcy5oIEFQSSBmdW5jdGlvbnMgdG8gdGhlIE1QVSBlcXVpdmFsZW50cy4gKi8KKwkJI2RlZmluZSB4VGFza0NyZWF0ZQkJCQkJCQkJTVBVX3hUYXNrQ3JlYXRlCisJCSNkZWZpbmUgeFRhc2tDcmVhdGVTdGF0aWMJCQkJCQlNUFVfeFRhc2tDcmVhdGVTdGF0aWMKKwkJI2RlZmluZSB4VGFza0NyZWF0ZVJlc3RyaWN0ZWQJCQkJCU1QVV94VGFza0NyZWF0ZVJlc3RyaWN0ZWQKKwkJI2RlZmluZSB2VGFza0FsbG9jYXRlTVBVUmVnaW9ucwkJCQkJTVBVX3ZUYXNrQWxsb2NhdGVNUFVSZWdpb25zCisJCSNkZWZpbmUgdlRhc2tEZWxldGUJCQkJCQkJCU1QVV92VGFza0RlbGV0ZQorCQkjZGVmaW5lIHZUYXNrRGVsYXkJCQkJCQkJCU1QVV92VGFza0RlbGF5CisJCSNkZWZpbmUgdlRhc2tEZWxheVVudGlsCQkJCQkJCU1QVV92VGFza0RlbGF5VW50aWwKKwkJI2RlZmluZSB4VGFza0Fib3J0RGVsYXkJCQkJCQkJTVBVX3hUYXNrQWJvcnREZWxheQorCQkjZGVmaW5lIHV4VGFza1ByaW9yaXR5R2V0CQkJCQkJTVBVX3V4VGFza1ByaW9yaXR5R2V0CisJCSNkZWZpbmUgZVRhc2tHZXRTdGF0ZQkJCQkJCQlNUFVfZVRhc2tHZXRTdGF0ZQorCQkjZGVmaW5lIHZUYXNrR2V0SW5mbwkJCQkJCQlNUFVfdlRhc2tHZXRJbmZvCisJCSNkZWZpbmUgdlRhc2tQcmlvcml0eVNldAkJCQkJCU1QVV92VGFza1ByaW9yaXR5U2V0CisJCSNkZWZpbmUgdlRhc2tTdXNwZW5kCQkJCQkJCU1QVV92VGFza1N1c3BlbmQKKwkJI2RlZmluZSB2VGFza1Jlc3VtZQkJCQkJCQkJTVBVX3ZUYXNrUmVzdW1lCisJCSNkZWZpbmUgdlRhc2tTdXNwZW5kQWxsCQkJCQkJCU1QVV92VGFza1N1c3BlbmRBbGwKKwkJI2RlZmluZSB4VGFza1Jlc3VtZUFsbAkJCQkJCQlNUFVfeFRhc2tSZXN1bWVBbGwKKwkJI2RlZmluZSB4VGFza0dldFRpY2tDb3VudAkJCQkJCU1QVV94VGFza0dldFRpY2tDb3VudAorCQkjZGVmaW5lIHV4VGFza0dldE51bWJlck9mVGFza3MJCQkJCU1QVV91eFRhc2tHZXROdW1iZXJPZlRhc2tzCisJCSNkZWZpbmUgcGNUYXNrR2V0TmFtZQkJCQkJCQlNUFVfcGNUYXNrR2V0TmFtZQorCQkjZGVmaW5lIHhUYXNrR2V0SGFuZGxlCQkJCQkJCU1QVV94VGFza0dldEhhbmRsZQorCQkjZGVmaW5lIHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyawkJCQlNUFVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrCisJCSNkZWZpbmUgdlRhc2tTZXRBcHBsaWNhdGlvblRhc2tUYWcJCQkJTVBVX3ZUYXNrU2V0QXBwbGljYXRpb25UYXNrVGFnCisJCSNkZWZpbmUgeFRhc2tHZXRBcHBsaWNhdGlvblRhc2tUYWcJCQkJTVBVX3hUYXNrR2V0QXBwbGljYXRpb25UYXNrVGFnCisJCSNkZWZpbmUgdlRhc2tTZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyCQlNUFVfdlRhc2tTZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyCisJCSNkZWZpbmUgcHZUYXNrR2V0VGhyZWFkTG9jYWxTdG9yYWdlUG9pbnRlcgkJTVBVX3B2VGFza0dldFRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXIKKwkJI2RlZmluZSB4VGFza0NhbGxBcHBsaWNhdGlvblRhc2tIb29rCQkJTVBVX3hUYXNrQ2FsbEFwcGxpY2F0aW9uVGFza0hvb2sKKwkJI2RlZmluZSB4VGFza0dldElkbGVUYXNrSGFuZGxlCQkJCQlNUFVfeFRhc2tHZXRJZGxlVGFza0hhbmRsZQorCQkjZGVmaW5lIHV4VGFza0dldFN5c3RlbVN0YXRlCQkJCQlNUFVfdXhUYXNrR2V0U3lzdGVtU3RhdGUKKwkJI2RlZmluZSB2VGFza0xpc3QJCQkJCQkJCU1QVV92VGFza0xpc3QKKwkJI2RlZmluZSB2VGFza0dldFJ1blRpbWVTdGF0cwkJCQkJTVBVX3ZUYXNrR2V0UnVuVGltZVN0YXRzCisJCSNkZWZpbmUgeFRhc2tHZW5lcmljTm90aWZ5CQkJCQkJTVBVX3hUYXNrR2VuZXJpY05vdGlmeQorCQkjZGVmaW5lIHhUYXNrTm90aWZ5V2FpdAkJCQkJCQlNUFVfeFRhc2tOb3RpZnlXYWl0CisJCSNkZWZpbmUgdWxUYXNrTm90aWZ5VGFrZQkJCQkJCU1QVV91bFRhc2tOb3RpZnlUYWtlCisJCSNkZWZpbmUgeFRhc2tOb3RpZnlTdGF0ZUNsZWFyCQkJCQlNUFVfeFRhc2tOb3RpZnlTdGF0ZUNsZWFyCisKKwkJI2RlZmluZSB4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlCQkJCU1QVV94VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlCisJCSNkZWZpbmUgdlRhc2tTZXRUaW1lT3V0U3RhdGUJCQkJCU1QVV92VGFza1NldFRpbWVPdXRTdGF0ZQorCQkjZGVmaW5lIHhUYXNrQ2hlY2tGb3JUaW1lT3V0CQkJCQlNUFVfeFRhc2tDaGVja0ZvclRpbWVPdXQKKwkJI2RlZmluZSB4VGFza0dldFNjaGVkdWxlclN0YXRlCQkJCQlNUFVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZQorCisJCS8qIE1hcCBzdGFuZGFyZCBxdWV1ZS5oIEFQSSBmdW5jdGlvbnMgdG8gdGhlIE1QVSBlcXVpdmFsZW50cy4gKi8KKwkJI2RlZmluZSB4UXVldWVHZW5lcmljU2VuZAkJCQkJCU1QVV94UXVldWVHZW5lcmljU2VuZAorCQkjZGVmaW5lIHhRdWV1ZVJlY2VpdmUJCQkJCQkJTVBVX3hRdWV1ZVJlY2VpdmUKKwkJI2RlZmluZSB4UXVldWVQZWVrCQkJCQkJCQlNUFVfeFF1ZXVlUGVlaworCQkjZGVmaW5lIHhRdWV1ZVNlbWFwaG9yZVRha2UJCQkJCQlNUFVfeFF1ZXVlU2VtYXBob3JlVGFrZQorCQkjZGVmaW5lIHV4UXVldWVNZXNzYWdlc1dhaXRpbmcJCQkJCU1QVV91eFF1ZXVlTWVzc2FnZXNXYWl0aW5nCisJCSNkZWZpbmUgdXhRdWV1ZVNwYWNlc0F2YWlsYWJsZQkJCQkJTVBVX3V4UXVldWVTcGFjZXNBdmFpbGFibGUKKwkJI2RlZmluZSB2UXVldWVEZWxldGUJCQkJCQkJTVBVX3ZRdWV1ZURlbGV0ZQorCQkjZGVmaW5lIHhRdWV1ZUNyZWF0ZU11dGV4CQkJCQkJTVBVX3hRdWV1ZUNyZWF0ZU11dGV4CisJCSNkZWZpbmUgeFF1ZXVlQ3JlYXRlTXV0ZXhTdGF0aWMJCQkJCU1QVV94UXVldWVDcmVhdGVNdXRleFN0YXRpYworCQkjZGVmaW5lIHhRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlCQkJTVBVX3hRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlCisJCSNkZWZpbmUgeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmVTdGF0aWMJCU1QVV94UXVldWVDcmVhdGVDb3VudGluZ1NlbWFwaG9yZVN0YXRpYworCQkjZGVmaW5lIHhRdWV1ZUdldE11dGV4SG9sZGVyCQkJCQlNUFVfeFF1ZXVlR2V0TXV0ZXhIb2xkZXIKKwkJI2RlZmluZSB4UXVldWVUYWtlTXV0ZXhSZWN1cnNpdmUJCQkJTVBVX3hRdWV1ZVRha2VNdXRleFJlY3Vyc2l2ZQorCQkjZGVmaW5lIHhRdWV1ZUdpdmVNdXRleFJlY3Vyc2l2ZQkJCQlNUFVfeFF1ZXVlR2l2ZU11dGV4UmVjdXJzaXZlCisJCSNkZWZpbmUgeFF1ZXVlR2VuZXJpY0NyZWF0ZQkJCQkJCU1QVV94UXVldWVHZW5lcmljQ3JlYXRlCisJCSNkZWZpbmUgeFF1ZXVlR2VuZXJpY0NyZWF0ZVN0YXRpYwkJCQlNUFVfeFF1ZXVlR2VuZXJpY0NyZWF0ZVN0YXRpYworCQkjZGVmaW5lIHhRdWV1ZUNyZWF0ZVNldAkJCQkJCQlNUFVfeFF1ZXVlQ3JlYXRlU2V0CisJCSNkZWZpbmUgeFF1ZXVlQWRkVG9TZXQJCQkJCQkJTVBVX3hRdWV1ZUFkZFRvU2V0CisJCSNkZWZpbmUgeFF1ZXVlUmVtb3ZlRnJvbVNldAkJCQkJCU1QVV94UXVldWVSZW1vdmVGcm9tU2V0CisJCSNkZWZpbmUgeFF1ZXVlU2VsZWN0RnJvbVNldAkJCQkJCU1QVV94UXVldWVTZWxlY3RGcm9tU2V0CisJCSNkZWZpbmUgeFF1ZXVlR2VuZXJpY1Jlc2V0CQkJCQkJTVBVX3hRdWV1ZUdlbmVyaWNSZXNldAorCisJCSNpZiggY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDAgKQorCQkJI2RlZmluZSB2UXVldWVBZGRUb1JlZ2lzdHJ5CQkJCQkJTVBVX3ZRdWV1ZUFkZFRvUmVnaXN0cnkKKwkJCSNkZWZpbmUgdlF1ZXVlVW5yZWdpc3RlclF1ZXVlCQkJCQlNUFVfdlF1ZXVlVW5yZWdpc3RlclF1ZXVlCisJCQkjZGVmaW5lIHBjUXVldWVHZXROYW1lCQkJCQkJCU1QVV9wY1F1ZXVlR2V0TmFtZQorCQkjZW5kaWYKKworCQkvKiBNYXAgc3RhbmRhcmQgdGltZXIuaCBBUEkgZnVuY3Rpb25zIHRvIHRoZSBNUFUgZXF1aXZhbGVudHMuICovCisJCSNkZWZpbmUgeFRpbWVyQ3JlYXRlCQkJCQkJCU1QVV94VGltZXJDcmVhdGUKKwkJI2RlZmluZSB4VGltZXJDcmVhdGVTdGF0aWMJCQkJCQlNUFVfeFRpbWVyQ3JlYXRlU3RhdGljCisJCSNkZWZpbmUgcHZUaW1lckdldFRpbWVySUQJCQkJCQlNUFVfcHZUaW1lckdldFRpbWVySUQKKwkJI2RlZmluZSB2VGltZXJTZXRUaW1lcklECQkJCQkJTVBVX3ZUaW1lclNldFRpbWVySUQKKwkJI2RlZmluZSB4VGltZXJJc1RpbWVyQWN0aXZlCQkJCQkJTVBVX3hUaW1lcklzVGltZXJBY3RpdmUKKwkJI2RlZmluZSB4VGltZXJHZXRUaW1lckRhZW1vblRhc2tIYW5kbGUJCQlNUFVfeFRpbWVyR2V0VGltZXJEYWVtb25UYXNrSGFuZGxlCisJCSNkZWZpbmUgeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbAkJCQkJTVBVX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwKKwkJI2RlZmluZSBwY1RpbWVyR2V0TmFtZQkJCQkJCQlNUFVfcGNUaW1lckdldE5hbWUKKwkJI2RlZmluZSB4VGltZXJHZXRQZXJpb2QJCQkJCQkJTVBVX3hUaW1lckdldFBlcmlvZAorCQkjZGVmaW5lIHhUaW1lckdldEV4cGlyeVRpbWUJCQkJCQlNUFVfeFRpbWVyR2V0RXhwaXJ5VGltZQorCQkjZGVmaW5lIHhUaW1lckdlbmVyaWNDb21tYW5kCQkJCQlNUFVfeFRpbWVyR2VuZXJpY0NvbW1hbmQKKworCQkvKiBNYXAgc3RhbmRhcmQgZXZlbnRfZ3JvdXAuaCBBUEkgZnVuY3Rpb25zIHRvIHRoZSBNUFUgZXF1aXZhbGVudHMuICovCisJCSNkZWZpbmUgeEV2ZW50R3JvdXBDcmVhdGUJCQkJCQlNUFVfeEV2ZW50R3JvdXBDcmVhdGUKKwkJI2RlZmluZSB4RXZlbnRHcm91cENyZWF0ZVN0YXRpYwkJCQkJTVBVX3hFdmVudEdyb3VwQ3JlYXRlU3RhdGljCisJCSNkZWZpbmUgeEV2ZW50R3JvdXBXYWl0Qml0cwkJCQkJCU1QVV94RXZlbnRHcm91cFdhaXRCaXRzCisJCSNkZWZpbmUgeEV2ZW50R3JvdXBDbGVhckJpdHMJCQkJCU1QVV94RXZlbnRHcm91cENsZWFyQml0cworCQkjZGVmaW5lIHhFdmVudEdyb3VwU2V0Qml0cwkJCQkJCU1QVV94RXZlbnRHcm91cFNldEJpdHMKKwkJI2RlZmluZSB4RXZlbnRHcm91cFN5bmMJCQkJCQkJTVBVX3hFdmVudEdyb3VwU3luYworCQkjZGVmaW5lIHZFdmVudEdyb3VwRGVsZXRlCQkJCQkJTVBVX3ZFdmVudEdyb3VwRGVsZXRlCisKKwkJLyogTWFwIHN0YW5kYXJkIG1lc3NhZ2Uvc3RyZWFtX2J1ZmZlci5oIEFQSSBmdW5jdGlvbnMgdG8gdGhlIE1QVQorCQllcXVpdmFsZW50cy4gKi8KKwkJI2RlZmluZSB4U3RyZWFtQnVmZmVyU2VuZAkJCQkJCU1QVV94U3RyZWFtQnVmZmVyU2VuZAorCQkjZGVmaW5lIHhTdHJlYW1CdWZmZXJTZW5kRnJvbUlTUgkJCQlNUFVfeFN0cmVhbUJ1ZmZlclNlbmRGcm9tSVNSCisJCSNkZWZpbmUgeFN0cmVhbUJ1ZmZlclJlY2VpdmUJCQkJCU1QVV94U3RyZWFtQnVmZmVyUmVjZWl2ZQorCQkjZGVmaW5lIHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUgkJCQlNUFVfeFN0cmVhbUJ1ZmZlclJlY2VpdmVGcm9tSVNSCisJCSNkZWZpbmUgdlN0cmVhbUJ1ZmZlckRlbGV0ZQkJCQkJCU1QVV92U3RyZWFtQnVmZmVyRGVsZXRlCisJCSNkZWZpbmUgeFN0cmVhbUJ1ZmZlcklzRnVsbAkJCQkJCU1QVV94U3RyZWFtQnVmZmVySXNGdWxsCisJCSNkZWZpbmUgeFN0cmVhbUJ1ZmZlcklzRW1wdHkJCQkJCU1QVV94U3RyZWFtQnVmZmVySXNFbXB0eQorCQkjZGVmaW5lIHhTdHJlYW1CdWZmZXJSZXNldAkJCQkJCU1QVV94U3RyZWFtQnVmZmVyUmVzZXQKKwkJI2RlZmluZSB4U3RyZWFtQnVmZmVyU3BhY2VzQXZhaWxhYmxlCQkJTVBVX3hTdHJlYW1CdWZmZXJTcGFjZXNBdmFpbGFibGUKKwkJI2RlZmluZSB4U3RyZWFtQnVmZmVyQnl0ZXNBdmFpbGFibGUJCQkJTVBVX3hTdHJlYW1CdWZmZXJCeXRlc0F2YWlsYWJsZQorCQkjZGVmaW5lIHhTdHJlYW1CdWZmZXJTZXRUcmlnZ2VyTGV2ZWwJCQlNUFVfeFN0cmVhbUJ1ZmZlclNldFRyaWdnZXJMZXZlbAorCQkjZGVmaW5lIHhTdHJlYW1CdWZmZXJHZW5lcmljQ3JlYXRlCQkJCU1QVV94U3RyZWFtQnVmZmVyR2VuZXJpY0NyZWF0ZQorCQkjZGVmaW5lIHhTdHJlYW1CdWZmZXJHZW5lcmljQ3JlYXRlU3RhdGljCQlNUFVfeFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGVTdGF0aWMKKworCisJCS8qIFJlbW92ZSB0aGUgcHJpdmlsZWdlZCBmdW5jdGlvbiBtYWNybywgYnV0IGtlZXAgdGhlIFBSSVZJTEVHRURfREFUQQorCQltYWNybyBzbyBhcHBsaWNhdGlvbnMgY2FuIHBsYWNlIGRhdGEgaW4gcHJpdmlsZWdlZCBhY2Nlc3Mgc2VjdGlvbnMKKwkJKHVzZWZ1bCB3aGVuIHVzaW5nIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG9iamVjdHMpLiAqLworCQkjZGVmaW5lIFBSSVZJTEVHRURfRlVOQ1RJT04KKwkJI2RlZmluZSBQUklWSUxFR0VEX0RBVEEgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigicHJpdmlsZWdlZF9kYXRhIikpKQorCisJI2Vsc2UgLyogTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgKi8KKworCQkvKiBFbnN1cmUgQVBJIGZ1bmN0aW9ucyBnbyBpbiB0aGUgcHJpdmlsZWdlZCBleGVjdXRpb24gc2VjdGlvbi4gKi8KKwkJI2RlZmluZSBQUklWSUxFR0VEX0ZVTkNUSU9OIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oInByaXZpbGVnZWRfZnVuY3Rpb25zIikpKQorCQkjZGVmaW5lIFBSSVZJTEVHRURfREFUQSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJwcml2aWxlZ2VkX2RhdGEiKSkpCisKKwkjZW5kaWYgLyogTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgKi8KKworI2Vsc2UgLyogcG9ydFVTSU5HX01QVV9XUkFQUEVSUyAqLworCisJI2RlZmluZSBQUklWSUxFR0VEX0ZVTkNUSU9OCisJI2RlZmluZSBQUklWSUxFR0VEX0RBVEEKKwkjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMgMAorCisjZW5kaWYgLyogcG9ydFVTSU5HX01QVV9XUkFQUEVSUyAqLworCisKKyNlbmRpZiAvKiBNUFVfV1JBUFBFUlNfSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9wb3J0YWJsZS5oIGIvU291cmNlL2luY2x1ZGUvcG9ydGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDBlZjBhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL2luY2x1ZGUvcG9ydGFibGUuaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnRhYmxlIGxheWVyIEFQSS4gIEVhY2ggZnVuY3Rpb24gbXVzdCBiZSBkZWZpbmVkIGZvciBlYWNoIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIFBPUlRBQkxFX0gKKyNkZWZpbmUgUE9SVEFCTEVfSAorCisvKiBFYWNoIEZyZWVSVE9TIHBvcnQgaGFzIGEgdW5pcXVlIHBvcnRtYWNyby5oIGhlYWRlciBmaWxlLiAgT3JpZ2luYWxseSBhCitwcmUtcHJvY2Vzc29yIGRlZmluaXRpb24gd2FzIHVzZWQgdG8gZW5zdXJlIHRoZSBwcmUtcHJvY2Vzc29yIGZvdW5kIHRoZSBjb3JyZWN0Citwb3J0bWFjcm8uaCBmaWxlIGZvciB0aGUgcG9ydCBiZWluZyB1c2VkLiAgVGhhdCBzY2hlbWUgd2FzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyCitvZiBzZXR0aW5nIHRoZSBjb21waWxlcidzIGluY2x1ZGUgcGF0aCBzdWNoIHRoYXQgaXQgZm91bmQgdGhlIGNvcnJlY3QKK3BvcnRtYWNyby5oIGZpbGUgLSByZW1vdmluZyB0aGUgbmVlZCBmb3IgdGhlIGNvbnN0YW50IGFuZCBhbGxvd2luZyB0aGUKK3BvcnRtYWNyby5oIGZpbGUgdG8gYmUgbG9jYXRlZCBhbnl3aGVyZSBpbiByZWxhdGlvbiB0byB0aGUgcG9ydCBiZWluZyB1c2VkLgorUHVyZWx5IGZvciByZWFzb25zIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdGhlIG9sZCBtZXRob2QgaXMgc3RpbGwgdmFsaWQsIGJ1dAordG8gbWFrZSBpdCBjbGVhciB0aGF0IG5ldyBwcm9qZWN0cyBzaG91bGQgbm90IHVzZSBpdCwgc3VwcG9ydCBmb3IgdGhlIHBvcnQKK3NwZWNpZmljIGNvbnN0YW50cyBoYXMgYmVlbiBtb3ZlZCBpbnRvIHRoZSBkZXByZWNhdGVkX2RlZmluaXRpb25zLmggaGVhZGVyCitmaWxlLiAqLworI2luY2x1ZGUgImRlcHJlY2F0ZWRfZGVmaW5pdGlvbnMuaCIKKworLyogSWYgcG9ydEVOVEVSX0NSSVRJQ0FMIGlzIG5vdCBkZWZpbmVkIHRoZW4gaW5jbHVkaW5nIGRlcHJlY2F0ZWRfZGVmaW5pdGlvbnMuaAorZGlkIG5vdCByZXN1bHQgaW4gYSBwb3J0bWFjcm8uaCBoZWFkZXIgZmlsZSBiZWluZyBpbmNsdWRlZCAtIGFuZCBpdCBzaG91bGQgYmUKK2luY2x1ZGVkIGhlcmUuICBJbiB0aGlzIGNhc2UgdGhlIHBhdGggdG8gdGhlIGNvcnJlY3QgcG9ydG1hY3JvLmggaGVhZGVyIGZpbGUKK211c3QgYmUgc2V0IGluIHRoZSBjb21waWxlcidzIGluY2x1ZGUgcGF0aC4gKi8KKyNpZm5kZWYgcG9ydEVOVEVSX0NSSVRJQ0FMCisJI2luY2x1ZGUgInBvcnRtYWNyby5oIgorI2VuZGlmCisKKyNpZiBwb3J0QllURV9BTElHTk1FTlQgPT0gMzIKKwkjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICggMHgwMDFmICkKKyNlbmRpZgorCisjaWYgcG9ydEJZVEVfQUxJR05NRU5UID09IDE2CisJI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlRfTUFTSyAoIDB4MDAwZiApCisjZW5kaWYKKworI2lmIHBvcnRCWVRFX0FMSUdOTUVOVCA9PSA4CisJI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlRfTUFTSyAoIDB4MDAwNyApCisjZW5kaWYKKworI2lmIHBvcnRCWVRFX0FMSUdOTUVOVCA9PSA0CisJI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlRfTUFTSwkoIDB4MDAwMyApCisjZW5kaWYKKworI2lmIHBvcnRCWVRFX0FMSUdOTUVOVCA9PSAyCisJI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlRfTUFTSwkoIDB4MDAwMSApCisjZW5kaWYKKworI2lmIHBvcnRCWVRFX0FMSUdOTUVOVCA9PSAxCisJI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlRfTUFTSwkoIDB4MDAwMCApCisjZW5kaWYKKworI2lmbmRlZiBwb3J0QllURV9BTElHTk1FTlRfTUFTSworCSNlcnJvciAiSW52YWxpZCBwb3J0QllURV9BTElHTk1FTlQgZGVmaW5pdGlvbiIKKyNlbmRpZgorCisjaWZuZGVmIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMKKwkjZGVmaW5lIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMgMQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgIm1wdV93cmFwcGVycy5oIgorCisvKgorICogU2V0dXAgdGhlIHN0YWNrIG9mIGEgbmV3IHRhc2sgc28gaXQgaXMgcmVhZHkgdG8gYmUgcGxhY2VkIHVuZGVyIHRoZQorICogc2NoZWR1bGVyIGNvbnRyb2wuICBUaGUgcmVnaXN0ZXJzIGhhdmUgdG8gYmUgcGxhY2VkIG9uIHRoZSBzdGFjayBpbgorICogdGhlIG9yZGVyIHRoYXQgdGhlIHBvcnQgZXhwZWN0cyB0byBmaW5kIHRoZW0uCisgKgorICovCisjaWYoIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMgPT0gMSApCisJU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMsIEJhc2VUeXBlX3QgeFJ1blByaXZpbGVnZWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworI2Vsc2UKKwlTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycyApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYKKworLyogVXNlZCBieSBoZWFwXzUuYy4gKi8KK3R5cGVkZWYgc3RydWN0IEhlYXBSZWdpb24KK3sKKwl1aW50OF90ICpwdWNTdGFydEFkZHJlc3M7CisJc2l6ZV90IHhTaXplSW5CeXRlczsKK30gSGVhcFJlZ2lvbl90OworCisvKgorICogVXNlZCB0byBkZWZpbmUgbXVsdGlwbGUgaGVhcCByZWdpb25zIGZvciB1c2UgYnkgaGVhcF81LmMuICBUaGlzIGZ1bmN0aW9uCisgKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IGNhbGxzIHRvIHB2UG9ydE1hbGxvYygpIC0gbm90IGNyZWF0aW5nIGEgdGFzaywKKyAqIHF1ZXVlLCBzZW1hcGhvcmUsIG11dGV4LCBzb2Z0d2FyZSB0aW1lciwgZXZlbnQgZ3JvdXAsIGV0Yy4gd2lsbCByZXN1bHQgaW4KKyAqIHB2UG9ydE1hbGxvYyBiZWluZyBjYWxsZWQuCisgKgorICogcHhIZWFwUmVnaW9ucyBwYXNzZXMgaW4gYW4gYXJyYXkgb2YgSGVhcFJlZ2lvbl90IHN0cnVjdHVyZXMgLSBlYWNoIG9mIHdoaWNoCisgKiBkZWZpbmVzIGEgcmVnaW9uIG9mIG1lbW9yeSB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBoZWFwLiAgVGhlIGFycmF5IGlzCisgKiB0ZXJtaW5hdGVkIGJ5IGEgSGVhcFJlZ2lvbnNfdCBzdHJ1Y3R1cmUgdGhhdCBoYXMgYSBzaXplIG9mIDAuICBUaGUgcmVnaW9uCisgKiB3aXRoIHRoZSBsb3dlc3Qgc3RhcnQgYWRkcmVzcyBtdXN0IGFwcGVhciBmaXJzdCBpbiB0aGUgYXJyYXkuCisgKi8KK3ZvaWQgdlBvcnREZWZpbmVIZWFwUmVnaW9ucyggY29uc3QgSGVhcFJlZ2lvbl90ICogY29uc3QgcHhIZWFwUmVnaW9ucyApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKworLyoKKyAqIE1hcCB0byB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMgcmVxdWlyZWQgZm9yIHRoZSBwb3J0LgorICovCit2b2lkICpwdlBvcnRNYWxsb2MoIHNpemVfdCB4U2l6ZSApIFBSSVZJTEVHRURfRlVOQ1RJT047Cit2b2lkIHZQb3J0RnJlZSggdm9pZCAqcHYgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwordm9pZCB2UG9ydEluaXRpYWxpc2VCbG9ja3MoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworc2l6ZV90IHhQb3J0R2V0RnJlZUhlYXBTaXplKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK3NpemVfdCB4UG9ydEdldE1pbmltdW1FdmVyRnJlZUhlYXBTaXplKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFNldHVwIHRoZSBoYXJkd2FyZSByZWFkeSBmb3IgdGhlIHNjaGVkdWxlciB0byB0YWtlIGNvbnRyb2wuICBUaGlzIGdlbmVyYWxseQorICogc2V0cyB1cCBhIHRpY2sgaW50ZXJydXB0IGFuZCBzZXRzIHRpbWVycyBmb3IgdGhlIGNvcnJlY3QgdGljayBmcmVxdWVuY3kuCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBVbmRvIGFueSBoYXJkd2FyZS9JU1Igc2V0dXAgdGhhdCB3YXMgcGVyZm9ybWVkIGJ5IHhQb3J0U3RhcnRTY2hlZHVsZXIoKSBzbworICogdGhlIGhhcmR3YXJlIGlzIGxlZnQgaW4gaXRzIG9yaWdpbmFsIGNvbmRpdGlvbiBhZnRlciB0aGUgc2NoZWR1bGVyIHN0b3BzCisgKiBleGVjdXRpbmcuCisgKi8KK3ZvaWQgdlBvcnRFbmRTY2hlZHVsZXIoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogVGhlIHN0cnVjdHVyZXMgYW5kIG1ldGhvZHMgb2YgbWFuaXB1bGF0aW5nIHRoZSBNUFUgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlCisgKiBwb3J0IGxheWVyLgorICoKKyAqIEZpbGxzIHRoZSB4TVBVU2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggdGhlIG1lbW9yeSByZWdpb24gaW5mb3JtYXRpb24KKyAqIGNvbnRhaW5lZCBpbiB4UmVnaW9ucy4KKyAqLworI2lmKCBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDEgKQorCXN0cnVjdCB4TUVNT1JZX1JFR0lPTjsKKwl2b2lkIHZQb3J0U3RvcmVUYXNrTVBVU2V0dGluZ3MoIHhNUFVfU0VUVElOR1MgKnhNUFVTZXR0aW5ncywgY29uc3Qgc3RydWN0IHhNRU1PUllfUkVHSU9OICogY29uc3QgeFJlZ2lvbnMsIFN0YWNrVHlwZV90ICpweEJvdHRvbU9mU3RhY2ssIHVpbnQzMl90IHVsU3RhY2tEZXB0aCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRBQkxFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvU291cmNlL2luY2x1ZGUvcHJvamRlZnMuaCBiL1NvdXJjZS9pbmNsdWRlL3Byb2pkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczMzdhOAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9pbmNsdWRlL3Byb2pkZWZzLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIFBST0pERUZTX0gKKyNkZWZpbmUgUFJPSkRFRlNfSAorCisvKgorICogRGVmaW5lcyB0aGUgcHJvdG90eXBlIHRvIHdoaWNoIHRhc2sgZnVuY3Rpb25zIG11c3QgY29uZm9ybS4gIERlZmluZWQgaW4gdGhpcworICogZmlsZSB0byBlbnN1cmUgdGhlIHR5cGUgaXMga25vd24gYmVmb3JlIHBvcnRhYmxlLmggaXMgaW5jbHVkZWQuCisgKi8KK3R5cGVkZWYgdm9pZCAoKlRhc2tGdW5jdGlvbl90KSggdm9pZCAqICk7CisKKy8qIENvbnZlcnRzIGEgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gYSB0aW1lIGluIHRpY2tzLiAgVGhpcyBtYWNybyBjYW4gYmUKK292ZXJyaWRkZW4gYnkgYSBtYWNybyBvZiB0aGUgc2FtZSBuYW1lIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaCBpbiBjYXNlIHRoZQorZGVmaW5pdGlvbiBoZXJlIGlzIG5vdCBzdWl0YWJsZSBmb3IgeW91ciBhcHBsaWNhdGlvbi4gKi8KKyNpZm5kZWYgcGRNU19UT19USUNLUworCSNkZWZpbmUgcGRNU19UT19USUNLUyggeFRpbWVJbk1zICkgKCAoIFRpY2tUeXBlX3QgKSAoICggKCBUaWNrVHlwZV90ICkgKCB4VGltZUluTXMgKSAqICggVGlja1R5cGVfdCApIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC8gKCBUaWNrVHlwZV90ICkgMTAwMCApICkKKyNlbmRpZgorCisjZGVmaW5lIHBkRkFMU0UJCQkoICggQmFzZVR5cGVfdCApIDAgKQorI2RlZmluZSBwZFRSVUUJCQkoICggQmFzZVR5cGVfdCApIDEgKQorCisjZGVmaW5lIHBkUEFTUwkJCSggcGRUUlVFICkKKyNkZWZpbmUgcGRGQUlMCQkJKCBwZEZBTFNFICkKKyNkZWZpbmUgZXJyUVVFVUVfRU1QVFkJKCAoIEJhc2VUeXBlX3QgKSAwICkKKyNkZWZpbmUgZXJyUVVFVUVfRlVMTAkoICggQmFzZVR5cGVfdCApIDAgKQorCisvKiBGcmVlUlRPUyBlcnJvciBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgZXJyQ09VTERfTk9UX0FMTE9DQVRFX1JFUVVJUkVEX01FTU9SWQkoIC0xICkKKyNkZWZpbmUgZXJyUVVFVUVfQkxPQ0tFRAkJCQkJCSggLTQgKQorI2RlZmluZSBlcnJRVUVVRV9ZSUVMRAkJCQkJCQkoIC01ICkKKworLyogTWFjcm9zIHVzZWQgZm9yIGJhc2ljIGRhdGEgY29ycnVwdGlvbiBjaGVja3MuICovCisjaWZuZGVmIGNvbmZpZ1VTRV9MSVNUX0RBVEFfSU5URUdSSVRZX0NIRUNLX0JZVEVTCisJI2RlZmluZSBjb25maWdVU0VfTElTVF9EQVRBX0lOVEVHUklUWV9DSEVDS19CWVRFUyAwCisjZW5kaWYKKworI2lmKCBjb25maWdVU0VfMTZfQklUX1RJQ0tTID09IDEgKQorCSNkZWZpbmUgcGRJTlRFR1JJVFlfQ0hFQ0tfVkFMVUUgMHg1YTVhCisjZWxzZQorCSNkZWZpbmUgcGRJTlRFR1JJVFlfQ0hFQ0tfVkFMVUUgMHg1YTVhNWE1YVVMCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBlcnJubyB2YWx1ZXMgYXJlIHVzZWQgYnkgRnJlZVJUT1MrIGNvbXBvbmVudHMsIG5vdCBGcmVlUlRPUworaXRzZWxmLiAqLworI2RlZmluZSBwZEZSRUVSVE9TX0VSUk5PX05PTkUJCQkwCS8qIE5vIGVycm9ycyAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VOT0VOVAkJCTIJLyogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VJTlRSCQkJNAkvKiBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VJTwkJCTUJLyogSS9PIGVycm9yICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRU5YSU8JCQk2CS8qIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FQkFERgkJCTkJLyogQmFkIGZpbGUgbnVtYmVyICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRUFHQUlOCQkJMTEJLyogTm8gbW9yZSBwcm9jZXNzZXMgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FV09VTERCTE9DSwkxMQkvKiBPcGVyYXRpb24gd291bGQgYmxvY2sgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FTk9NRU0JCQkxMgkvKiBOb3QgZW5vdWdoIG1lbW9yeSAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VBQ0NFUwkJCTEzCS8qIFBlcm1pc3Npb24gZGVuaWVkICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRUZBVUxUCQkJMTQJLyogQmFkIGFkZHJlc3MgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FQlVTWQkJCTE2CS8qIE1vdW50IGRldmljZSBidXN5ICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRUVYSVNUCQkJMTcJLyogRmlsZSBleGlzdHMgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FWERFVgkJCTE4CS8qIENyb3NzLWRldmljZSBsaW5rICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRU5PREVWCQkJMTkJLyogTm8gc3VjaCBkZXZpY2UgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FTk9URElSCQkyMAkvKiBOb3QgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FSVNESVIJCQkyMQkvKiBJcyBhIGRpcmVjdG9yeSAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VJTlZBTAkJCTIyCS8qIEludmFsaWQgYXJndW1lbnQgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FTk9TUEMJCQkyOAkvKiBObyBzcGFjZSBsZWZ0IG9uIGRldmljZSAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VTUElQRQkJCTI5CS8qIElsbGVnYWwgc2VlayAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VST0ZTCQkJMzAJLyogUmVhZCBvbmx5IGZpbGUgc3lzdGVtICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRVVOQVRDSAkJNDIJLyogUHJvdG9jb2wgZHJpdmVyIG5vdCBhdHRhY2hlZCAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VCQURFCQkJNTAJLyogSW52YWxpZCBleGNoYW5nZSAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VGVFlQRQkJCTc5CS8qIEluYXBwcm9wcmlhdGUgZmlsZSB0eXBlIG9yIGZvcm1hdCAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VOTUZJTEUJCTg5CS8qIE5vIG1vcmUgZmlsZXMgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FTk9URU1QVFkJCTkwCS8qIERpcmVjdG9yeSBub3QgZW1wdHkgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FTkFNRVRPT0xPTkcgCTkxCS8qIEZpbGUgb3IgcGF0aCBuYW1lIHRvbyBsb25nICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRU9QTk9UU1VQUAkJOTUJLyogT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50ICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRU5PQlVGUwkJMTA1CS8qIE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FTk9QUk9UT09QVAkxMDkJLyogUHJvdG9jb2wgbm90IGF2YWlsYWJsZSAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VBRERSSU5VU0UJCTExMgkvKiBBZGRyZXNzIGFscmVhZHkgaW4gdXNlICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRVRJTUVET1VUCQkxMTYJLyogQ29ubmVjdGlvbiB0aW1lZCBvdXQgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FSU5QUk9HUkVTUwkxMTkJLyogQ29ubmVjdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRUFMUkVBRFkJCTEyMAkvKiBTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FQUREUk5PVEFWQUlMIAkxMjUJLyogQWRkcmVzcyBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lCXBkRlJFRVJUT1NfRVJSTk9fRUlTQ09OTgkJMTI3CS8qIFNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VOT1RDT05OCQkxMjgJLyogU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FTk9NRURJVU0JCTEzNQkvKiBObyBtZWRpdW0gaW5zZXJ0ZWQgKi8KKyNkZWZpbmUJcGRGUkVFUlRPU19FUlJOT19FSUxTRVEJCQkxMzgJLyogQW4gaW52YWxpZCBVVEYtMTYgc2VxdWVuY2Ugd2FzIGVuY291bnRlcmVkLiAqLworI2RlZmluZQlwZEZSRUVSVE9TX0VSUk5PX0VDQU5DRUxFRAkJMTQwCS8qIE9wZXJhdGlvbiBjYW5jZWxlZC4gKi8KKworLyogVGhlIGZvbGxvd2luZyBlbmRpYW4gdmFsdWVzIGFyZSB1c2VkIGJ5IEZyZWVSVE9TKyBjb21wb25lbnRzLCBub3QgRnJlZVJUT1MKK2l0c2VsZi4gKi8KKyNkZWZpbmUgcGRGUkVFUlRPU19MSVRUTEVfRU5ESUFOCQkwCisjZGVmaW5lIHBkRlJFRVJUT1NfQklHX0VORElBTgkJCTEKKworLyogUmUtZGVmaW5pbmcgZW5kaWFuIHZhbHVlcyBmb3IgZ2VuZXJpYyBuYW1pbmcuICovCisjZGVmaW5lIHBkTElUVExFX0VORElBTgkJCQkJcGRGUkVFUlRPU19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIHBkQklHX0VORElBTgkJCQkJcGRGUkVFUlRPU19CSUdfRU5ESUFOCisKKworI2VuZGlmIC8qIFBST0pERUZTX0ggKi8KKworCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL3F1ZXVlLmggYi9Tb3VyY2UvaW5jbHVkZS9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2ZhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvaW5jbHVkZS9xdWV1ZS5oCkBAIC0wLDAgKzEsMTY1MyBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKworI2lmbmRlZiBRVUVVRV9ICisjZGVmaW5lIFFVRVVFX0gKKworI2lmbmRlZiBJTkNfRlJFRVJUT1NfSAorCSNlcnJvciAiaW5jbHVkZSBGcmVlUlRPUy5oIiBtdXN0IGFwcGVhciBpbiBzb3VyY2UgZmlsZXMgYmVmb3JlICJpbmNsdWRlIHF1ZXVlLmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKgorICogVHlwZSBieSB3aGljaCBxdWV1ZXMgYXJlIHJlZmVyZW5jZWQuICBGb3IgZXhhbXBsZSwgYSBjYWxsIHRvIHhRdWV1ZUNyZWF0ZSgpCisgKiByZXR1cm5zIGFuIFF1ZXVlSGFuZGxlX3QgdmFyaWFibGUgdGhhdCBjYW4gdGhlbiBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvCisgKiB4UXVldWVTZW5kKCksIHhRdWV1ZVJlY2VpdmUoKSwgZXRjLgorICovCit0eXBlZGVmIHZvaWQgKiBRdWV1ZUhhbmRsZV90OworCisvKioKKyAqIFR5cGUgYnkgd2hpY2ggcXVldWUgc2V0cyBhcmUgcmVmZXJlbmNlZC4gIEZvciBleGFtcGxlLCBhIGNhbGwgdG8KKyAqIHhRdWV1ZUNyZWF0ZVNldCgpIHJldHVybnMgYW4geFF1ZXVlU2V0IHZhcmlhYmxlIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCBhcyBhCisgKiBwYXJhbWV0ZXIgdG8geFF1ZXVlU2VsZWN0RnJvbVNldCgpLCB4UXVldWVBZGRUb1NldCgpLCBldGMuCisgKi8KK3R5cGVkZWYgdm9pZCAqIFF1ZXVlU2V0SGFuZGxlX3Q7CisKKy8qKgorICogUXVldWUgc2V0cyBjYW4gY29udGFpbiBib3RoIHF1ZXVlcyBhbmQgc2VtYXBob3Jlcywgc28gdGhlCisgKiBRdWV1ZVNldE1lbWJlckhhbmRsZV90IGlzIGRlZmluZWQgYXMgYSB0eXBlIHRvIGJlIHVzZWQgd2hlcmUgYSBwYXJhbWV0ZXIgb3IKKyAqIHJldHVybiB2YWx1ZSBjYW4gYmUgZWl0aGVyIGFuIFF1ZXVlSGFuZGxlX3Qgb3IgYW4gU2VtYXBob3JlSGFuZGxlX3QuCisgKi8KK3R5cGVkZWYgdm9pZCAqIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3Q7CisKKy8qIEZvciBpbnRlcm5hbCB1c2Ugb25seS4gKi8KKyNkZWZpbmUJcXVldWVTRU5EX1RPX0JBQ0sJCSggKCBCYXNlVHlwZV90ICkgMCApCisjZGVmaW5lCXF1ZXVlU0VORF9UT19GUk9OVAkJKCAoIEJhc2VUeXBlX3QgKSAxICkKKyNkZWZpbmUgcXVldWVPVkVSV1JJVEUJCQkoICggQmFzZVR5cGVfdCApIDIgKQorCisvKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGVzZSBkZWZpbml0aW9ucyAqbXVzdCogbWF0Y2ggdGhvc2UgaW4gcXVldWUuYy4gKi8KKyNkZWZpbmUgcXVldWVRVUVVRV9UWVBFX0JBU0UJCQkJKCAoIHVpbnQ4X3QgKSAwVSApCisjZGVmaW5lIHF1ZXVlUVVFVUVfVFlQRV9TRVQJCQkJCSggKCB1aW50OF90ICkgMFUgKQorI2RlZmluZSBxdWV1ZVFVRVVFX1RZUEVfTVVURVggCQkJCSggKCB1aW50OF90ICkgMVUgKQorI2RlZmluZSBxdWV1ZVFVRVVFX1RZUEVfQ09VTlRJTkdfU0VNQVBIT1JFCSggKCB1aW50OF90ICkgMlUgKQorI2RlZmluZSBxdWV1ZVFVRVVFX1RZUEVfQklOQVJZX1NFTUFQSE9SRQkoICggdWludDhfdCApIDNVICkKKyNkZWZpbmUgcXVldWVRVUVVRV9UWVBFX1JFQ1VSU0lWRV9NVVRFWAkJKCAoIHVpbnQ4X3QgKSA0VSApCisKKy8qKgorICogcXVldWUuIGgKKyAqIDxwcmU+CisgUXVldWVIYW5kbGVfdCB4UXVldWVDcmVhdGUoCisJCQkJCQkJICBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLAorCQkJCQkJCSAgVUJhc2VUeXBlX3QgdXhJdGVtU2l6ZQorCQkJCQkJICApOworICogPC9wcmU+CisgKgorICogQ3JlYXRlcyBhIG5ldyBxdWV1ZSBpbnN0YW5jZSwgYW5kIHJldHVybnMgYSBoYW5kbGUgYnkgd2hpY2ggdGhlIG5ldyBxdWV1ZQorICogY2FuIGJlIHJlZmVyZW5jZWQuCisgKgorICogSW50ZXJuYWxseSwgd2l0aGluIHRoZSBGcmVlUlRPUyBpbXBsZW1lbnRhdGlvbiwgcXVldWVzIHVzZSB0d28gYmxvY2tzIG9mCisgKiBtZW1vcnkuICBUaGUgZmlyc3QgYmxvY2sgaXMgdXNlZCB0byBob2xkIHRoZSBxdWV1ZSdzIGRhdGEgc3RydWN0dXJlcy4gIFRoZQorICogc2Vjb25kIGJsb2NrIGlzIHVzZWQgdG8gaG9sZCBpdGVtcyBwbGFjZWQgaW50byB0aGUgcXVldWUuICBJZiBhIHF1ZXVlIGlzCisgKiBjcmVhdGVkIHVzaW5nIHhRdWV1ZUNyZWF0ZSgpIHRoZW4gYm90aCBibG9ja3Mgb2YgbWVtb3J5IGFyZSBhdXRvbWF0aWNhbGx5CisgKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgaW5zaWRlIHRoZSB4UXVldWVDcmVhdGUoKSBmdW5jdGlvbi4gIChzZWUKKyAqIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExMS5odG1sKS4gIElmIGEgcXVldWUgaXMgY3JlYXRlZCB1c2luZworICogeFF1ZXVlQ3JlYXRlU3RhdGljKCkgdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgcHJvdmlkZSB0aGUgbWVtb3J5IHRoYXQKKyAqIHdpbGwgZ2V0IHVzZWQgYnkgdGhlIHF1ZXVlLiAgeFF1ZXVlQ3JlYXRlU3RhdGljKCkgdGhlcmVmb3JlIGFsbG93cyBhIHF1ZXVlIHRvCisgKiBiZSBjcmVhdGVkIHdpdGhvdXQgdXNpbmcgYW55IGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvRW1iZWRkZWQtUlRPUy1RdWV1ZXMuaHRtbAorICoKKyAqIEBwYXJhbSB1eFF1ZXVlTGVuZ3RoIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IHRoZSBxdWV1ZSBjYW4gY29udGFpbi4KKyAqCisgKiBAcGFyYW0gdXhJdGVtU2l6ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGVhY2ggaXRlbSBpbiB0aGUgcXVldWUgd2lsbCByZXF1aXJlLgorICogSXRlbXMgYXJlIHF1ZXVlZCBieSBjb3B5LCBub3QgYnkgcmVmZXJlbmNlLCBzbyB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIHRoYXQgd2lsbCBiZSBjb3BpZWQgZm9yIGVhY2ggcG9zdGVkIGl0ZW0uICBFYWNoIGl0ZW0gb24gdGhlIHF1ZXVlIG11c3QgYmUKKyAqIHRoZSBzYW1lIHNpemUuCisgKgorICogQHJldHVybiBJZiB0aGUgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZSB0aGVuIGEgaGFuZGxlIHRvIHRoZSBuZXdseQorICogY3JlYXRlZCBxdWV1ZSBpcyByZXR1cm5lZC4gIElmIHRoZSBxdWV1ZSBjYW5ub3QgYmUgY3JlYXRlZCB0aGVuIDAgaXMKKyAqIHJldHVybmVkLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIHN0cnVjdCBBTWVzc2FnZQorIHsKKwljaGFyIHVjTWVzc2FnZUlEOworCWNoYXIgdWNEYXRhWyAyMCBdOworIH07CisKKyB2b2lkIHZBVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyB7CisgUXVldWVIYW5kbGVfdCB4UXVldWUxLCB4UXVldWUyOworCisJLy8gQ3JlYXRlIGEgcXVldWUgY2FwYWJsZSBvZiBjb250YWluaW5nIDEwIHVpbnQzMl90IHZhbHVlcy4KKwl4UXVldWUxID0geFF1ZXVlQ3JlYXRlKCAxMCwgc2l6ZW9mKCB1aW50MzJfdCApICk7CisJaWYoIHhRdWV1ZTEgPT0gMCApCisJeworCQkvLyBRdWV1ZSB3YXMgbm90IGNyZWF0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuCisJfQorCisJLy8gQ3JlYXRlIGEgcXVldWUgY2FwYWJsZSBvZiBjb250YWluaW5nIDEwIHBvaW50ZXJzIHRvIEFNZXNzYWdlIHN0cnVjdHVyZXMuCisJLy8gVGhlc2Ugc2hvdWxkIGJlIHBhc3NlZCBieSBwb2ludGVyIGFzIHRoZXkgY29udGFpbiBhIGxvdCBvZiBkYXRhLgorCXhRdWV1ZTIgPSB4UXVldWVDcmVhdGUoIDEwLCBzaXplb2YoIHN0cnVjdCBBTWVzc2FnZSAqICkgKTsKKwlpZiggeFF1ZXVlMiA9PSAwICkKKwl7CisJCS8vIFF1ZXVlIHdhcyBub3QgY3JlYXRlZCBhbmQgbXVzdCBub3QgYmUgdXNlZC4KKwl9CisKKwkvLyAuLi4gUmVzdCBvZiB0YXNrIGNvZGUuCisgfQorIDwvcHJlPgorICogXGRlZmdyb3VwIHhRdWV1ZUNyZWF0ZSB4UXVldWVDcmVhdGUKKyAqIFxpbmdyb3VwIFF1ZXVlTWFuYWdlbWVudAorICovCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCSNkZWZpbmUgeFF1ZXVlQ3JlYXRlKCB1eFF1ZXVlTGVuZ3RoLCB1eEl0ZW1TaXplICkgeFF1ZXVlR2VuZXJpY0NyZWF0ZSggKCB1eFF1ZXVlTGVuZ3RoICksICggdXhJdGVtU2l6ZSApLCAoIHF1ZXVlUVVFVUVfVFlQRV9CQVNFICkgKQorI2VuZGlmCisKKy8qKgorICogcXVldWUuIGgKKyAqIDxwcmU+CisgUXVldWVIYW5kbGVfdCB4UXVldWVDcmVhdGVTdGF0aWMoCisJCQkJCQkJICBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLAorCQkJCQkJCSAgVUJhc2VUeXBlX3QgdXhJdGVtU2l6ZSwKKwkJCQkJCQkgIHVpbnQ4X3QgKnB1Y1F1ZXVlU3RvcmFnZUJ1ZmZlciwKKwkJCQkJCQkgIFN0YXRpY1F1ZXVlX3QgKnB4UXVldWVCdWZmZXIKKwkJCQkJCSAgKTsKKyAqIDwvcHJlPgorICoKKyAqIENyZWF0ZXMgYSBuZXcgcXVldWUgaW5zdGFuY2UsIGFuZCByZXR1cm5zIGEgaGFuZGxlIGJ5IHdoaWNoIHRoZSBuZXcgcXVldWUKKyAqIGNhbiBiZSByZWZlcmVuY2VkLgorICoKKyAqIEludGVybmFsbHksIHdpdGhpbiB0aGUgRnJlZVJUT1MgaW1wbGVtZW50YXRpb24sIHF1ZXVlcyB1c2UgdHdvIGJsb2NrcyBvZgorICogbWVtb3J5LiAgVGhlIGZpcnN0IGJsb2NrIGlzIHVzZWQgdG8gaG9sZCB0aGUgcXVldWUncyBkYXRhIHN0cnVjdHVyZXMuICBUaGUKKyAqIHNlY29uZCBibG9jayBpcyB1c2VkIHRvIGhvbGQgaXRlbXMgcGxhY2VkIGludG8gdGhlIHF1ZXVlLiAgSWYgYSBxdWV1ZSBpcworICogY3JlYXRlZCB1c2luZyB4UXVldWVDcmVhdGUoKSB0aGVuIGJvdGggYmxvY2tzIG9mIG1lbW9yeSBhcmUgYXV0b21hdGljYWxseQorICogZHluYW1pY2FsbHkgYWxsb2NhdGVkIGluc2lkZSB0aGUgeFF1ZXVlQ3JlYXRlKCkgZnVuY3Rpb24uICAoc2VlCisgKiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTEuaHRtbCkuICBJZiBhIHF1ZXVlIGlzIGNyZWF0ZWQgdXNpbmcKKyAqIHhRdWV1ZUNyZWF0ZVN0YXRpYygpIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0IHByb3ZpZGUgdGhlIG1lbW9yeSB0aGF0CisgKiB3aWxsIGdldCB1c2VkIGJ5IHRoZSBxdWV1ZS4gIHhRdWV1ZUNyZWF0ZVN0YXRpYygpIHRoZXJlZm9yZSBhbGxvd3MgYSBxdWV1ZSB0bworICogYmUgY3JlYXRlZCB3aXRob3V0IHVzaW5nIGFueSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL0VtYmVkZGVkLVJUT1MtUXVldWVzLmh0bWwKKyAqCisgKiBAcGFyYW0gdXhRdWV1ZUxlbmd0aCBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCB0aGUgcXVldWUgY2FuIGNvbnRhaW4uCisgKgorICogQHBhcmFtIHV4SXRlbVNpemUgVGhlIG51bWJlciBvZiBieXRlcyBlYWNoIGl0ZW0gaW4gdGhlIHF1ZXVlIHdpbGwgcmVxdWlyZS4KKyAqIEl0ZW1zIGFyZSBxdWV1ZWQgYnkgY29weSwgbm90IGJ5IHJlZmVyZW5jZSwgc28gdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiB0aGF0IHdpbGwgYmUgY29waWVkIGZvciBlYWNoIHBvc3RlZCBpdGVtLiAgRWFjaCBpdGVtIG9uIHRoZSBxdWV1ZSBtdXN0IGJlCisgKiB0aGUgc2FtZSBzaXplLgorICoKKyAqIEBwYXJhbSBwdWNRdWV1ZVN0b3JhZ2VCdWZmZXIgSWYgdXhJdGVtU2l6ZSBpcyBub3QgemVybyB0aGVuCisgKiBwdWNRdWV1ZVN0b3JhZ2VCdWZmZXIgbXVzdCBwb2ludCB0byBhIHVpbnQ4X3QgYXJyYXkgdGhhdCBpcyBhdCBsZWFzdCBsYXJnZQorICogZW5vdWdoIHRvIGhvbGQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIGluIHRoZSBxdWV1ZSBhdCBhbnkKKyAqIG9uZSB0aW1lIC0gd2hpY2ggaXMgKCB1eFF1ZXVlTGVuZ3RoICogdXhJdGVtc1NpemUgKSBieXRlcy4gIElmIHV4SXRlbVNpemUgaXMKKyAqIHplcm8gdGhlbiBwdWNRdWV1ZVN0b3JhZ2VCdWZmZXIgY2FuIGJlIE5VTEwuCisgKgorICogQHBhcmFtIHB4UXVldWVCdWZmZXIgTXVzdCBwb2ludCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgU3RhdGljUXVldWVfdCwgd2hpY2gKKyAqIHdpbGwgYmUgdXNlZCB0byBob2xkIHRoZSBxdWV1ZSdzIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIEByZXR1cm4gSWYgdGhlIHF1ZXVlIGlzIGNyZWF0ZWQgdGhlbiBhIGhhbmRsZSB0byB0aGUgY3JlYXRlZCBxdWV1ZSBpcworICogcmV0dXJuZWQuICBJZiBweFF1ZXVlQnVmZmVyIGlzIE5VTEwgdGhlbiBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIHN0cnVjdCBBTWVzc2FnZQorIHsKKwljaGFyIHVjTWVzc2FnZUlEOworCWNoYXIgdWNEYXRhWyAyMCBdOworIH07CisKKyAjZGVmaW5lIFFVRVVFX0xFTkdUSCAxMAorICNkZWZpbmUgSVRFTV9TSVpFIHNpemVvZiggdWludDMyX3QgKQorCisgLy8geFF1ZXVlQnVmZmVyIHdpbGwgaG9sZCB0aGUgcXVldWUgc3RydWN0dXJlLgorIFN0YXRpY1F1ZXVlX3QgeFF1ZXVlQnVmZmVyOworCisgLy8gdWNRdWV1ZVN0b3JhZ2Ugd2lsbCBob2xkIHRoZSBpdGVtcyBwb3N0ZWQgdG8gdGhlIHF1ZXVlLiAgTXVzdCBiZSBhdCBsZWFzdAorIC8vIFsocXVldWUgbGVuZ3RoKSAqICggcXVldWUgaXRlbSBzaXplKV0gYnl0ZXMgbG9uZy4KKyB1aW50OF90IHVjUXVldWVTdG9yYWdlWyBRVUVVRV9MRU5HVEggKiBJVEVNX1NJWkUgXTsKKworIHZvaWQgdkFUYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorIHsKKyBRdWV1ZUhhbmRsZV90IHhRdWV1ZTE7CisKKwkvLyBDcmVhdGUgYSBxdWV1ZSBjYXBhYmxlIG9mIGNvbnRhaW5pbmcgMTAgdWludDMyX3QgdmFsdWVzLgorCXhRdWV1ZTEgPSB4UXVldWVDcmVhdGUoIFFVRVVFX0xFTkdUSCwgLy8gVGhlIG51bWJlciBvZiBpdGVtcyB0aGUgcXVldWUgY2FuIGhvbGQuCisJCQkJCQkJSVRFTV9TSVpFCSAgLy8gVGhlIHNpemUgb2YgZWFjaCBpdGVtIGluIHRoZSBxdWV1ZQorCQkJCQkJCSYoIHVjUXVldWVTdG9yYWdlWyAwIF0gKSwgLy8gVGhlIGJ1ZmZlciB0aGF0IHdpbGwgaG9sZCB0aGUgaXRlbXMgaW4gdGhlIHF1ZXVlLgorCQkJCQkJCSZ4UXVldWVCdWZmZXIgKTsgLy8gVGhlIGJ1ZmZlciB0aGF0IHdpbGwgaG9sZCB0aGUgcXVldWUgc3RydWN0dXJlLgorCisJLy8gVGhlIHF1ZXVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkgYXMgbm8gZHluYW1pYyBtZW1vcnkKKwkvLyBhbGxvY2F0aW9uIGlzIHVzZWQuICBUaGVyZWZvcmUgeFF1ZXVlMSBpcyBub3cgYSBoYW5kbGUgdG8gYSB2YWxpZCBxdWV1ZS4KKworCS8vIC4uLiBSZXN0IG9mIHRhc2sgY29kZS4KKyB9CisgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFF1ZXVlQ3JlYXRlU3RhdGljIHhRdWV1ZUNyZWF0ZVN0YXRpYworICogXGluZ3JvdXAgUXVldWVNYW5hZ2VtZW50CisgKi8KKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKwkjZGVmaW5lIHhRdWV1ZUNyZWF0ZVN0YXRpYyggdXhRdWV1ZUxlbmd0aCwgdXhJdGVtU2l6ZSwgcHVjUXVldWVTdG9yYWdlLCBweFF1ZXVlQnVmZmVyICkgeFF1ZXVlR2VuZXJpY0NyZWF0ZVN0YXRpYyggKCB1eFF1ZXVlTGVuZ3RoICksICggdXhJdGVtU2l6ZSApLCAoIHB1Y1F1ZXVlU3RvcmFnZSApLCAoIHB4UXVldWVCdWZmZXIgKSwgKCBxdWV1ZVFVRVVFX1RZUEVfQkFTRSApICkKKyNlbmRpZiAvKiBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OICovCisKKy8qKgorICogcXVldWUuIGgKKyAqIDxwcmU+CisgQmFzZVR5cGVfdCB4UXVldWVTZW5kVG9Ub0Zyb250KAorCQkJCQkJCQkgICBRdWV1ZUhhbmRsZV90CXhRdWV1ZSwKKwkJCQkJCQkJICAgY29uc3Qgdm9pZAkJKnB2SXRlbVRvUXVldWUsCisJCQkJCQkJCSAgIFRpY2tUeXBlX3QJCXhUaWNrc1RvV2FpdAorCQkJCQkJCSAgICk7CisgKiA8L3ByZT4KKyAqCisgKiBQb3N0IGFuIGl0ZW0gdG8gdGhlIGZyb250IG9mIGEgcXVldWUuICBUaGUgaXRlbSBpcyBxdWV1ZWQgYnkgY29weSwgbm90IGJ5CisgKiByZWZlcmVuY2UuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBzZXJ2aWNlCisgKiByb3V0aW5lLiAgU2VlIHhRdWV1ZVNlbmRGcm9tSVNSICgpIGZvciBhbiBhbHRlcm5hdGl2ZSB3aGljaCBtYXkgYmUgdXNlZAorICogaW4gYW4gSVNSLgorICoKKyAqIEBwYXJhbSB4UXVldWUgVGhlIGhhbmRsZSB0byB0aGUgcXVldWUgb24gd2hpY2ggdGhlIGl0ZW0gaXMgdG8gYmUgcG9zdGVkLgorICoKKyAqIEBwYXJhbSBwdkl0ZW1Ub1F1ZXVlIEEgcG9pbnRlciB0byB0aGUgaXRlbSB0aGF0IGlzIHRvIGJlIHBsYWNlZCBvbiB0aGUKKyAqIHF1ZXVlLiAgVGhlIHNpemUgb2YgdGhlIGl0ZW1zIHRoZSBxdWV1ZSB3aWxsIGhvbGQgd2FzIGRlZmluZWQgd2hlbiB0aGUKKyAqIHF1ZXVlIHdhcyBjcmVhdGVkLCBzbyB0aGlzIG1hbnkgYnl0ZXMgd2lsbCBiZSBjb3BpZWQgZnJvbSBwdkl0ZW1Ub1F1ZXVlCisgKiBpbnRvIHRoZSBxdWV1ZSBzdG9yYWdlIGFyZWEuCisgKgorICogQHBhcmFtIHhUaWNrc1RvV2FpdCBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0aGUgdGFzayBzaG91bGQgYmxvY2sKKyAqIHdhaXRpbmcgZm9yIHNwYWNlIHRvIGJlY29tZSBhdmFpbGFibGUgb24gdGhlIHF1ZXVlLCBzaG91bGQgaXQgYWxyZWFkeQorICogYmUgZnVsbC4gIFRoZSBjYWxsIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoaXMgaXMgc2V0IHRvIDAgYW5kIHRoZQorICogcXVldWUgaXMgZnVsbC4gIFRoZSB0aW1lIGlzIGRlZmluZWQgaW4gdGljayBwZXJpb2RzIHNvIHRoZSBjb25zdGFudAorICogcG9ydFRJQ0tfUEVSSU9EX01TIHNob3VsZCBiZSB1c2VkIHRvIGNvbnZlcnQgdG8gcmVhbCB0aW1lIGlmIHRoaXMgaXMgcmVxdWlyZWQuCisgKgorICogQHJldHVybiBwZFRSVUUgaWYgdGhlIGl0ZW0gd2FzIHN1Y2Nlc3NmdWxseSBwb3N0ZWQsIG90aGVyd2lzZSBlcnJRVUVVRV9GVUxMLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIHN0cnVjdCBBTWVzc2FnZQorIHsKKwljaGFyIHVjTWVzc2FnZUlEOworCWNoYXIgdWNEYXRhWyAyMCBdOworIH0geE1lc3NhZ2U7CisKKyB1aW50MzJfdCB1bFZhciA9IDEwVUw7CisKKyB2b2lkIHZBVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyB7CisgUXVldWVIYW5kbGVfdCB4UXVldWUxLCB4UXVldWUyOworIHN0cnVjdCBBTWVzc2FnZSAqcHhNZXNzYWdlOworCisJLy8gQ3JlYXRlIGEgcXVldWUgY2FwYWJsZSBvZiBjb250YWluaW5nIDEwIHVpbnQzMl90IHZhbHVlcy4KKwl4UXVldWUxID0geFF1ZXVlQ3JlYXRlKCAxMCwgc2l6ZW9mKCB1aW50MzJfdCApICk7CisKKwkvLyBDcmVhdGUgYSBxdWV1ZSBjYXBhYmxlIG9mIGNvbnRhaW5pbmcgMTAgcG9pbnRlcnMgdG8gQU1lc3NhZ2Ugc3RydWN0dXJlcy4KKwkvLyBUaGVzZSBzaG91bGQgYmUgcGFzc2VkIGJ5IHBvaW50ZXIgYXMgdGhleSBjb250YWluIGEgbG90IG9mIGRhdGEuCisJeFF1ZXVlMiA9IHhRdWV1ZUNyZWF0ZSggMTAsIHNpemVvZiggc3RydWN0IEFNZXNzYWdlICogKSApOworCisJLy8gLi4uCisKKwlpZiggeFF1ZXVlMSAhPSAwICkKKwl7CisJCS8vIFNlbmQgYW4gdWludDMyX3QuICBXYWl0IGZvciAxMCB0aWNrcyBmb3Igc3BhY2UgdG8gYmVjb21lCisJCS8vIGF2YWlsYWJsZSBpZiBuZWNlc3NhcnkuCisJCWlmKCB4UXVldWVTZW5kVG9Gcm9udCggeFF1ZXVlMSwgKCB2b2lkICogKSAmdWxWYXIsICggVGlja1R5cGVfdCApIDEwICkgIT0gcGRQQVNTICkKKwkJeworCQkJLy8gRmFpbGVkIHRvIHBvc3QgdGhlIG1lc3NhZ2UsIGV2ZW4gYWZ0ZXIgMTAgdGlja3MuCisJCX0KKwl9CisKKwlpZiggeFF1ZXVlMiAhPSAwICkKKwl7CisJCS8vIFNlbmQgYSBwb2ludGVyIHRvIGEgc3RydWN0IEFNZXNzYWdlIG9iamVjdC4gIERvbid0IGJsb2NrIGlmIHRoZQorCQkvLyBxdWV1ZSBpcyBhbHJlYWR5IGZ1bGwuCisJCXB4TWVzc2FnZSA9ICYgeE1lc3NhZ2U7CisJCXhRdWV1ZVNlbmRUb0Zyb250KCB4UXVldWUyLCAoIHZvaWQgKiApICZweE1lc3NhZ2UsICggVGlja1R5cGVfdCApIDAgKTsKKwl9CisKKwkvLyAuLi4gUmVzdCBvZiB0YXNrIGNvZGUuCisgfQorIDwvcHJlPgorICogXGRlZmdyb3VwIHhRdWV1ZVNlbmQgeFF1ZXVlU2VuZAorICogXGluZ3JvdXAgUXVldWVNYW5hZ2VtZW50CisgKi8KKyNkZWZpbmUgeFF1ZXVlU2VuZFRvRnJvbnQoIHhRdWV1ZSwgcHZJdGVtVG9RdWV1ZSwgeFRpY2tzVG9XYWl0ICkgeFF1ZXVlR2VuZXJpY1NlbmQoICggeFF1ZXVlICksICggcHZJdGVtVG9RdWV1ZSApLCAoIHhUaWNrc1RvV2FpdCApLCBxdWV1ZVNFTkRfVE9fRlJPTlQgKQorCisvKioKKyAqIHF1ZXVlLiBoCisgKiA8cHJlPgorIEJhc2VUeXBlX3QgeFF1ZXVlU2VuZFRvQmFjaygKKwkJCQkJCQkJICAgUXVldWVIYW5kbGVfdAl4UXVldWUsCisJCQkJCQkJCSAgIGNvbnN0IHZvaWQJCSpwdkl0ZW1Ub1F1ZXVlLAorCQkJCQkJCQkgICBUaWNrVHlwZV90CQl4VGlja3NUb1dhaXQKKwkJCQkJCQkgICApOworICogPC9wcmU+CisgKgorICogVGhpcyBpcyBhIG1hY3JvIHRoYXQgY2FsbHMgeFF1ZXVlR2VuZXJpY1NlbmQoKS4KKyAqCisgKiBQb3N0IGFuIGl0ZW0gdG8gdGhlIGJhY2sgb2YgYSBxdWV1ZS4gIFRoZSBpdGVtIGlzIHF1ZXVlZCBieSBjb3B5LCBub3QgYnkKKyAqIHJlZmVyZW5jZS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IHNlcnZpY2UKKyAqIHJvdXRpbmUuICBTZWUgeFF1ZXVlU2VuZEZyb21JU1IgKCkgZm9yIGFuIGFsdGVybmF0aXZlIHdoaWNoIG1heSBiZSB1c2VkCisgKiBpbiBhbiBJU1IuCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIHRvIHRoZSBxdWV1ZSBvbiB3aGljaCB0aGUgaXRlbSBpcyB0byBiZSBwb3N0ZWQuCisgKgorICogQHBhcmFtIHB2SXRlbVRvUXVldWUgQSBwb2ludGVyIHRvIHRoZSBpdGVtIHRoYXQgaXMgdG8gYmUgcGxhY2VkIG9uIHRoZQorICogcXVldWUuICBUaGUgc2l6ZSBvZiB0aGUgaXRlbXMgdGhlIHF1ZXVlIHdpbGwgaG9sZCB3YXMgZGVmaW5lZCB3aGVuIHRoZQorICogcXVldWUgd2FzIGNyZWF0ZWQsIHNvIHRoaXMgbWFueSBieXRlcyB3aWxsIGJlIGNvcGllZCBmcm9tIHB2SXRlbVRvUXVldWUKKyAqIGludG8gdGhlIHF1ZXVlIHN0b3JhZ2UgYXJlYS4KKyAqCisgKiBAcGFyYW0geFRpY2tzVG9XYWl0IFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRoZSB0YXNrIHNob3VsZCBibG9jaworICogd2FpdGluZyBmb3Igc3BhY2UgdG8gYmVjb21lIGF2YWlsYWJsZSBvbiB0aGUgcXVldWUsIHNob3VsZCBpdCBhbHJlYWR5CisgKiBiZSBmdWxsLiAgVGhlIGNhbGwgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhpcyBpcyBzZXQgdG8gMCBhbmQgdGhlIHF1ZXVlCisgKiBpcyBmdWxsLiAgVGhlICB0aW1lIGlzIGRlZmluZWQgaW4gdGljayBwZXJpb2RzIHNvIHRoZSBjb25zdGFudAorICogcG9ydFRJQ0tfUEVSSU9EX01TIHNob3VsZCBiZSB1c2VkIHRvIGNvbnZlcnQgdG8gcmVhbCB0aW1lIGlmIHRoaXMgaXMgcmVxdWlyZWQuCisgKgorICogQHJldHVybiBwZFRSVUUgaWYgdGhlIGl0ZW0gd2FzIHN1Y2Nlc3NmdWxseSBwb3N0ZWQsIG90aGVyd2lzZSBlcnJRVUVVRV9GVUxMLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIHN0cnVjdCBBTWVzc2FnZQorIHsKKwljaGFyIHVjTWVzc2FnZUlEOworCWNoYXIgdWNEYXRhWyAyMCBdOworIH0geE1lc3NhZ2U7CisKKyB1aW50MzJfdCB1bFZhciA9IDEwVUw7CisKKyB2b2lkIHZBVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyB7CisgUXVldWVIYW5kbGVfdCB4UXVldWUxLCB4UXVldWUyOworIHN0cnVjdCBBTWVzc2FnZSAqcHhNZXNzYWdlOworCisJLy8gQ3JlYXRlIGEgcXVldWUgY2FwYWJsZSBvZiBjb250YWluaW5nIDEwIHVpbnQzMl90IHZhbHVlcy4KKwl4UXVldWUxID0geFF1ZXVlQ3JlYXRlKCAxMCwgc2l6ZW9mKCB1aW50MzJfdCApICk7CisKKwkvLyBDcmVhdGUgYSBxdWV1ZSBjYXBhYmxlIG9mIGNvbnRhaW5pbmcgMTAgcG9pbnRlcnMgdG8gQU1lc3NhZ2Ugc3RydWN0dXJlcy4KKwkvLyBUaGVzZSBzaG91bGQgYmUgcGFzc2VkIGJ5IHBvaW50ZXIgYXMgdGhleSBjb250YWluIGEgbG90IG9mIGRhdGEuCisJeFF1ZXVlMiA9IHhRdWV1ZUNyZWF0ZSggMTAsIHNpemVvZiggc3RydWN0IEFNZXNzYWdlICogKSApOworCisJLy8gLi4uCisKKwlpZiggeFF1ZXVlMSAhPSAwICkKKwl7CisJCS8vIFNlbmQgYW4gdWludDMyX3QuICBXYWl0IGZvciAxMCB0aWNrcyBmb3Igc3BhY2UgdG8gYmVjb21lCisJCS8vIGF2YWlsYWJsZSBpZiBuZWNlc3NhcnkuCisJCWlmKCB4UXVldWVTZW5kVG9CYWNrKCB4UXVldWUxLCAoIHZvaWQgKiApICZ1bFZhciwgKCBUaWNrVHlwZV90ICkgMTAgKSAhPSBwZFBBU1MgKQorCQl7CisJCQkvLyBGYWlsZWQgdG8gcG9zdCB0aGUgbWVzc2FnZSwgZXZlbiBhZnRlciAxMCB0aWNrcy4KKwkJfQorCX0KKworCWlmKCB4UXVldWUyICE9IDAgKQorCXsKKwkJLy8gU2VuZCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgQU1lc3NhZ2Ugb2JqZWN0LiAgRG9uJ3QgYmxvY2sgaWYgdGhlCisJCS8vIHF1ZXVlIGlzIGFscmVhZHkgZnVsbC4KKwkJcHhNZXNzYWdlID0gJiB4TWVzc2FnZTsKKwkJeFF1ZXVlU2VuZFRvQmFjayggeFF1ZXVlMiwgKCB2b2lkICogKSAmcHhNZXNzYWdlLCAoIFRpY2tUeXBlX3QgKSAwICk7CisJfQorCisJLy8gLi4uIFJlc3Qgb2YgdGFzayBjb2RlLgorIH0KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4UXVldWVTZW5kIHhRdWV1ZVNlbmQKKyAqIFxpbmdyb3VwIFF1ZXVlTWFuYWdlbWVudAorICovCisjZGVmaW5lIHhRdWV1ZVNlbmRUb0JhY2soIHhRdWV1ZSwgcHZJdGVtVG9RdWV1ZSwgeFRpY2tzVG9XYWl0ICkgeFF1ZXVlR2VuZXJpY1NlbmQoICggeFF1ZXVlICksICggcHZJdGVtVG9RdWV1ZSApLCAoIHhUaWNrc1RvV2FpdCApLCBxdWV1ZVNFTkRfVE9fQkFDSyApCisKKy8qKgorICogcXVldWUuIGgKKyAqIDxwcmU+CisgQmFzZVR5cGVfdCB4UXVldWVTZW5kKAorCQkJCQkJCSAgUXVldWVIYW5kbGVfdCB4UXVldWUsCisJCQkJCQkJICBjb25zdCB2b2lkICogcHZJdGVtVG9RdWV1ZSwKKwkJCQkJCQkgIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0CisJCQkJCQkgKTsKKyAqIDwvcHJlPgorICoKKyAqIFRoaXMgaXMgYSBtYWNybyB0aGF0IGNhbGxzIHhRdWV1ZUdlbmVyaWNTZW5kKCkuICBJdCBpcyBpbmNsdWRlZCBmb3IKKyAqIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyBvZiBGcmVlUlRPUy5vcmcgdGhhdCBkaWQgbm90CisgKiBpbmNsdWRlIHRoZSB4UXVldWVTZW5kVG9Gcm9udCgpIGFuZCB4UXVldWVTZW5kVG9CYWNrKCkgbWFjcm9zLiAgSXQgaXMKKyAqIGVxdWl2YWxlbnQgdG8geFF1ZXVlU2VuZFRvQmFjaygpLgorICoKKyAqIFBvc3QgYW4gaXRlbSBvbiBhIHF1ZXVlLiAgVGhlIGl0ZW0gaXMgcXVldWVkIGJ5IGNvcHksIG5vdCBieSByZWZlcmVuY2UuCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKiBTZWUgeFF1ZXVlU2VuZEZyb21JU1IgKCkgZm9yIGFuIGFsdGVybmF0aXZlIHdoaWNoIG1heSBiZSB1c2VkIGluIGFuIElTUi4KKyAqCisgKiBAcGFyYW0geFF1ZXVlIFRoZSBoYW5kbGUgdG8gdGhlIHF1ZXVlIG9uIHdoaWNoIHRoZSBpdGVtIGlzIHRvIGJlIHBvc3RlZC4KKyAqCisgKiBAcGFyYW0gcHZJdGVtVG9RdWV1ZSBBIHBvaW50ZXIgdG8gdGhlIGl0ZW0gdGhhdCBpcyB0byBiZSBwbGFjZWQgb24gdGhlCisgKiBxdWV1ZS4gIFRoZSBzaXplIG9mIHRoZSBpdGVtcyB0aGUgcXVldWUgd2lsbCBob2xkIHdhcyBkZWZpbmVkIHdoZW4gdGhlCisgKiBxdWV1ZSB3YXMgY3JlYXRlZCwgc28gdGhpcyBtYW55IGJ5dGVzIHdpbGwgYmUgY29waWVkIGZyb20gcHZJdGVtVG9RdWV1ZQorICogaW50byB0aGUgcXVldWUgc3RvcmFnZSBhcmVhLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhlIHRhc2sgc2hvdWxkIGJsb2NrCisgKiB3YWl0aW5nIGZvciBzcGFjZSB0byBiZWNvbWUgYXZhaWxhYmxlIG9uIHRoZSBxdWV1ZSwgc2hvdWxkIGl0IGFscmVhZHkKKyAqIGJlIGZ1bGwuICBUaGUgY2FsbCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGlzIGlzIHNldCB0byAwIGFuZCB0aGUKKyAqIHF1ZXVlIGlzIGZ1bGwuICBUaGUgdGltZSBpcyBkZWZpbmVkIGluIHRpY2sgcGVyaW9kcyBzbyB0aGUgY29uc3RhbnQKKyAqIHBvcnRUSUNLX1BFUklPRF9NUyBzaG91bGQgYmUgdXNlZCB0byBjb252ZXJ0IHRvIHJlYWwgdGltZSBpZiB0aGlzIGlzIHJlcXVpcmVkLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIHRoZSBpdGVtIHdhcyBzdWNjZXNzZnVsbHkgcG9zdGVkLCBvdGhlcndpc2UgZXJyUVVFVUVfRlVMTC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKyBzdHJ1Y3QgQU1lc3NhZ2UKKyB7CisJY2hhciB1Y01lc3NhZ2VJRDsKKwljaGFyIHVjRGF0YVsgMjAgXTsKKyB9IHhNZXNzYWdlOworCisgdWludDMyX3QgdWxWYXIgPSAxMFVMOworCisgdm9pZCB2QVRhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApCisgeworIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlMSwgeFF1ZXVlMjsKKyBzdHJ1Y3QgQU1lc3NhZ2UgKnB4TWVzc2FnZTsKKworCS8vIENyZWF0ZSBhIHF1ZXVlIGNhcGFibGUgb2YgY29udGFpbmluZyAxMCB1aW50MzJfdCB2YWx1ZXMuCisJeFF1ZXVlMSA9IHhRdWV1ZUNyZWF0ZSggMTAsIHNpemVvZiggdWludDMyX3QgKSApOworCisJLy8gQ3JlYXRlIGEgcXVldWUgY2FwYWJsZSBvZiBjb250YWluaW5nIDEwIHBvaW50ZXJzIHRvIEFNZXNzYWdlIHN0cnVjdHVyZXMuCisJLy8gVGhlc2Ugc2hvdWxkIGJlIHBhc3NlZCBieSBwb2ludGVyIGFzIHRoZXkgY29udGFpbiBhIGxvdCBvZiBkYXRhLgorCXhRdWV1ZTIgPSB4UXVldWVDcmVhdGUoIDEwLCBzaXplb2YoIHN0cnVjdCBBTWVzc2FnZSAqICkgKTsKKworCS8vIC4uLgorCisJaWYoIHhRdWV1ZTEgIT0gMCApCisJeworCQkvLyBTZW5kIGFuIHVpbnQzMl90LiAgV2FpdCBmb3IgMTAgdGlja3MgZm9yIHNwYWNlIHRvIGJlY29tZQorCQkvLyBhdmFpbGFibGUgaWYgbmVjZXNzYXJ5LgorCQlpZiggeFF1ZXVlU2VuZCggeFF1ZXVlMSwgKCB2b2lkICogKSAmdWxWYXIsICggVGlja1R5cGVfdCApIDEwICkgIT0gcGRQQVNTICkKKwkJeworCQkJLy8gRmFpbGVkIHRvIHBvc3QgdGhlIG1lc3NhZ2UsIGV2ZW4gYWZ0ZXIgMTAgdGlja3MuCisJCX0KKwl9CisKKwlpZiggeFF1ZXVlMiAhPSAwICkKKwl7CisJCS8vIFNlbmQgYSBwb2ludGVyIHRvIGEgc3RydWN0IEFNZXNzYWdlIG9iamVjdC4gIERvbid0IGJsb2NrIGlmIHRoZQorCQkvLyBxdWV1ZSBpcyBhbHJlYWR5IGZ1bGwuCisJCXB4TWVzc2FnZSA9ICYgeE1lc3NhZ2U7CisJCXhRdWV1ZVNlbmQoIHhRdWV1ZTIsICggdm9pZCAqICkgJnB4TWVzc2FnZSwgKCBUaWNrVHlwZV90ICkgMCApOworCX0KKworCS8vIC4uLiBSZXN0IG9mIHRhc2sgY29kZS4KKyB9CisgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFF1ZXVlU2VuZCB4UXVldWVTZW5kCisgKiBcaW5ncm91cCBRdWV1ZU1hbmFnZW1lbnQKKyAqLworI2RlZmluZSB4UXVldWVTZW5kKCB4UXVldWUsIHB2SXRlbVRvUXVldWUsIHhUaWNrc1RvV2FpdCApIHhRdWV1ZUdlbmVyaWNTZW5kKCAoIHhRdWV1ZSApLCAoIHB2SXRlbVRvUXVldWUgKSwgKCB4VGlja3NUb1dhaXQgKSwgcXVldWVTRU5EX1RPX0JBQ0sgKQorCisvKioKKyAqIHF1ZXVlLiBoCisgKiA8cHJlPgorIEJhc2VUeXBlX3QgeFF1ZXVlT3ZlcndyaXRlKAorCQkJCQkJCSAgUXVldWVIYW5kbGVfdCB4UXVldWUsCisJCQkJCQkJICBjb25zdCB2b2lkICogcHZJdGVtVG9RdWV1ZQorCQkJCQkJICk7CisgKiA8L3ByZT4KKyAqCisgKiBPbmx5IGZvciB1c2Ugd2l0aCBxdWV1ZXMgdGhhdCBoYXZlIGEgbGVuZ3RoIG9mIG9uZSAtIHNvIHRoZSBxdWV1ZSBpcyBlaXRoZXIKKyAqIGVtcHR5IG9yIGZ1bGwuCisgKgorICogUG9zdCBhbiBpdGVtIG9uIGEgcXVldWUuICBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBmdWxsIHRoZW4gb3ZlcndyaXRlIHRoZQorICogdmFsdWUgaGVsZCBpbiB0aGUgcXVldWUuICBUaGUgaXRlbSBpcyBxdWV1ZWQgYnkgY29weSwgbm90IGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKiBTZWUgeFF1ZXVlT3ZlcndyaXRlRnJvbUlTUiAoKSBmb3IgYW4gYWx0ZXJuYXRpdmUgd2hpY2ggbWF5IGJlIHVzZWQgaW4gYW4gSVNSLgorICoKKyAqIEBwYXJhbSB4UXVldWUgVGhlIGhhbmRsZSBvZiB0aGUgcXVldWUgdG8gd2hpY2ggdGhlIGRhdGEgaXMgYmVpbmcgc2VudC4KKyAqCisgKiBAcGFyYW0gcHZJdGVtVG9RdWV1ZSBBIHBvaW50ZXIgdG8gdGhlIGl0ZW0gdGhhdCBpcyB0byBiZSBwbGFjZWQgb24gdGhlCisgKiBxdWV1ZS4gIFRoZSBzaXplIG9mIHRoZSBpdGVtcyB0aGUgcXVldWUgd2lsbCBob2xkIHdhcyBkZWZpbmVkIHdoZW4gdGhlCisgKiBxdWV1ZSB3YXMgY3JlYXRlZCwgc28gdGhpcyBtYW55IGJ5dGVzIHdpbGwgYmUgY29waWVkIGZyb20gcHZJdGVtVG9RdWV1ZQorICogaW50byB0aGUgcXVldWUgc3RvcmFnZSBhcmVhLgorICoKKyAqIEByZXR1cm4geFF1ZXVlT3ZlcndyaXRlKCkgaXMgYSBtYWNybyB0aGF0IGNhbGxzIHhRdWV1ZUdlbmVyaWNTZW5kKCksIGFuZAorICogdGhlcmVmb3JlIGhhcyB0aGUgc2FtZSByZXR1cm4gdmFsdWVzIGFzIHhRdWV1ZVNlbmRUb0Zyb250KCkuICBIb3dldmVyLCBwZFBBU1MKKyAqIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgY2FuIGJlIHJldHVybmVkIGJlY2F1c2UgeFF1ZXVlT3ZlcndyaXRlKCkgd2lsbCB3cml0ZQorICogdG8gdGhlIHF1ZXVlIGV2ZW4gd2hlbiB0aGUgcXVldWUgaXMgYWxyZWFkeSBmdWxsLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorCisgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisgeworIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlOworIHVpbnQzMl90IHVsVmFyVG9TZW5kLCB1bFZhbFJlY2VpdmVkOworCisJLy8gQ3JlYXRlIGEgcXVldWUgdG8gaG9sZCBvbmUgdWludDMyX3QgdmFsdWUuICBJdCBpcyBzdHJvbmdseQorCS8vIHJlY29tbWVuZGVkICpub3QqIHRvIHVzZSB4UXVldWVPdmVyd3JpdGUoKSBvbiBxdWV1ZXMgdGhhdCBjYW4KKwkvLyBjb250YWluIG1vcmUgdGhhbiBvbmUgdmFsdWUsIGFuZCBkb2luZyBzbyB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0aW9uCisJLy8gaWYgY29uZmlnQVNTRVJUKCkgaXMgZGVmaW5lZC4KKwl4UXVldWUgPSB4UXVldWVDcmVhdGUoIDEsIHNpemVvZiggdWludDMyX3QgKSApOworCisJLy8gV3JpdGUgdGhlIHZhbHVlIDEwIHRvIHRoZSBxdWV1ZSB1c2luZyB4UXVldWVPdmVyd3JpdGUoKS4KKwl1bFZhclRvU2VuZCA9IDEwOworCXhRdWV1ZU92ZXJ3cml0ZSggeFF1ZXVlLCAmdWxWYXJUb1NlbmQgKTsKKworCS8vIFBlZWtpbmcgdGhlIHF1ZXVlIHNob3VsZCBub3cgcmV0dXJuIDEwLCBidXQgbGVhdmUgdGhlIHZhbHVlIDEwIGluCisJLy8gdGhlIHF1ZXVlLiAgQSBibG9jayB0aW1lIG9mIHplcm8gaXMgdXNlZCBhcyBpdCBpcyBrbm93biB0aGF0IHRoZQorCS8vIHF1ZXVlIGhvbGRzIGEgdmFsdWUuCisJdWxWYWxSZWNlaXZlZCA9IDA7CisJeFF1ZXVlUGVlayggeFF1ZXVlLCAmdWxWYWxSZWNlaXZlZCwgMCApOworCisJaWYoIHVsVmFsUmVjZWl2ZWQgIT0gMTAgKQorCXsKKwkJLy8gRXJyb3IgdW5sZXNzIHRoZSBpdGVtIHdhcyByZW1vdmVkIGJ5IGEgZGlmZmVyZW50IHRhc2suCisJfQorCisJLy8gVGhlIHF1ZXVlIGlzIHN0aWxsIGZ1bGwuICBVc2UgeFF1ZXVlT3ZlcndyaXRlKCkgdG8gb3ZlcndyaXRlIHRoZQorCS8vIHZhbHVlIGhlbGQgaW4gdGhlIHF1ZXVlIHdpdGggMTAwLgorCXVsVmFyVG9TZW5kID0gMTAwOworCXhRdWV1ZU92ZXJ3cml0ZSggeFF1ZXVlLCAmdWxWYXJUb1NlbmQgKTsKKworCS8vIFRoaXMgdGltZSByZWFkIGZyb20gdGhlIHF1ZXVlLCBsZWF2aW5nIHRoZSBxdWV1ZSBlbXB0eSBvbmNlIG1vcmUuCisJLy8gQSBibG9jayB0aW1lIG9mIDAgaXMgdXNlZCBhZ2Fpbi4KKwl4UXVldWVSZWNlaXZlKCB4UXVldWUsICZ1bFZhbFJlY2VpdmVkLCAwICk7CisKKwkvLyBUaGUgdmFsdWUgcmVhZCBzaG91bGQgYmUgdGhlIGxhc3QgdmFsdWUgd3JpdHRlbiwgZXZlbiB0aG91Z2ggdGhlCisJLy8gcXVldWUgd2FzIGFscmVhZHkgZnVsbCB3aGVuIHRoZSB2YWx1ZSB3YXMgd3JpdHRlbi4KKwlpZiggdWxWYWxSZWNlaXZlZCAhPSAxMDAgKQorCXsKKwkJLy8gRXJyb3IhCisJfQorCisJLy8gLi4uCit9CisgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFF1ZXVlT3ZlcndyaXRlIHhRdWV1ZU92ZXJ3cml0ZQorICogXGluZ3JvdXAgUXVldWVNYW5hZ2VtZW50CisgKi8KKyNkZWZpbmUgeFF1ZXVlT3ZlcndyaXRlKCB4UXVldWUsIHB2SXRlbVRvUXVldWUgKSB4UXVldWVHZW5lcmljU2VuZCggKCB4UXVldWUgKSwgKCBwdkl0ZW1Ub1F1ZXVlICksIDAsIHF1ZXVlT1ZFUldSSVRFICkKKworCisvKioKKyAqIHF1ZXVlLiBoCisgKiA8cHJlPgorIEJhc2VUeXBlX3QgeFF1ZXVlR2VuZXJpY1NlbmQoCisJCQkJCQkJCQlRdWV1ZUhhbmRsZV90IHhRdWV1ZSwKKwkJCQkJCQkJCWNvbnN0IHZvaWQgKiBwdkl0ZW1Ub1F1ZXVlLAorCQkJCQkJCQkJVGlja1R5cGVfdCB4VGlja3NUb1dhaXQKKwkJCQkJCQkJCUJhc2VUeXBlX3QgeENvcHlQb3NpdGlvbgorCQkJCQkJCQkpOworICogPC9wcmU+CisgKgorICogSXQgaXMgcHJlZmVycmVkIHRoYXQgdGhlIG1hY3JvcyB4UXVldWVTZW5kKCksIHhRdWV1ZVNlbmRUb0Zyb250KCkgYW5kCisgKiB4UXVldWVTZW5kVG9CYWNrKCkgYXJlIHVzZWQgaW4gcGxhY2Ugb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgorICoKKyAqIFBvc3QgYW4gaXRlbSBvbiBhIHF1ZXVlLiAgVGhlIGl0ZW0gaXMgcXVldWVkIGJ5IGNvcHksIG5vdCBieSByZWZlcmVuY2UuCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKiBTZWUgeFF1ZXVlU2VuZEZyb21JU1IgKCkgZm9yIGFuIGFsdGVybmF0aXZlIHdoaWNoIG1heSBiZSB1c2VkIGluIGFuIElTUi4KKyAqCisgKiBAcGFyYW0geFF1ZXVlIFRoZSBoYW5kbGUgdG8gdGhlIHF1ZXVlIG9uIHdoaWNoIHRoZSBpdGVtIGlzIHRvIGJlIHBvc3RlZC4KKyAqCisgKiBAcGFyYW0gcHZJdGVtVG9RdWV1ZSBBIHBvaW50ZXIgdG8gdGhlIGl0ZW0gdGhhdCBpcyB0byBiZSBwbGFjZWQgb24gdGhlCisgKiBxdWV1ZS4gIFRoZSBzaXplIG9mIHRoZSBpdGVtcyB0aGUgcXVldWUgd2lsbCBob2xkIHdhcyBkZWZpbmVkIHdoZW4gdGhlCisgKiBxdWV1ZSB3YXMgY3JlYXRlZCwgc28gdGhpcyBtYW55IGJ5dGVzIHdpbGwgYmUgY29waWVkIGZyb20gcHZJdGVtVG9RdWV1ZQorICogaW50byB0aGUgcXVldWUgc3RvcmFnZSBhcmVhLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhlIHRhc2sgc2hvdWxkIGJsb2NrCisgKiB3YWl0aW5nIGZvciBzcGFjZSB0byBiZWNvbWUgYXZhaWxhYmxlIG9uIHRoZSBxdWV1ZSwgc2hvdWxkIGl0IGFscmVhZHkKKyAqIGJlIGZ1bGwuICBUaGUgY2FsbCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGlzIGlzIHNldCB0byAwIGFuZCB0aGUKKyAqIHF1ZXVlIGlzIGZ1bGwuICBUaGUgdGltZSBpcyBkZWZpbmVkIGluIHRpY2sgcGVyaW9kcyBzbyB0aGUgY29uc3RhbnQKKyAqIHBvcnRUSUNLX1BFUklPRF9NUyBzaG91bGQgYmUgdXNlZCB0byBjb252ZXJ0IHRvIHJlYWwgdGltZSBpZiB0aGlzIGlzIHJlcXVpcmVkLgorICoKKyAqIEBwYXJhbSB4Q29weVBvc2l0aW9uIENhbiB0YWtlIHRoZSB2YWx1ZSBxdWV1ZVNFTkRfVE9fQkFDSyB0byBwbGFjZSB0aGUKKyAqIGl0ZW0gYXQgdGhlIGJhY2sgb2YgdGhlIHF1ZXVlLCBvciBxdWV1ZVNFTkRfVE9fRlJPTlQgdG8gcGxhY2UgdGhlIGl0ZW0KKyAqIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUgKGZvciBoaWdoIHByaW9yaXR5IG1lc3NhZ2VzKS4KKyAqCisgKiBAcmV0dXJuIHBkVFJVRSBpZiB0aGUgaXRlbSB3YXMgc3VjY2Vzc2Z1bGx5IHBvc3RlZCwgb3RoZXJ3aXNlIGVyclFVRVVFX0ZVTEwuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+Cisgc3RydWN0IEFNZXNzYWdlCisgeworCWNoYXIgdWNNZXNzYWdlSUQ7CisJY2hhciB1Y0RhdGFbIDIwIF07CisgfSB4TWVzc2FnZTsKKworIHVpbnQzMl90IHVsVmFyID0gMTBVTDsKKworIHZvaWQgdkFUYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorIHsKKyBRdWV1ZUhhbmRsZV90IHhRdWV1ZTEsIHhRdWV1ZTI7Cisgc3RydWN0IEFNZXNzYWdlICpweE1lc3NhZ2U7CisKKwkvLyBDcmVhdGUgYSBxdWV1ZSBjYXBhYmxlIG9mIGNvbnRhaW5pbmcgMTAgdWludDMyX3QgdmFsdWVzLgorCXhRdWV1ZTEgPSB4UXVldWVDcmVhdGUoIDEwLCBzaXplb2YoIHVpbnQzMl90ICkgKTsKKworCS8vIENyZWF0ZSBhIHF1ZXVlIGNhcGFibGUgb2YgY29udGFpbmluZyAxMCBwb2ludGVycyB0byBBTWVzc2FnZSBzdHJ1Y3R1cmVzLgorCS8vIFRoZXNlIHNob3VsZCBiZSBwYXNzZWQgYnkgcG9pbnRlciBhcyB0aGV5IGNvbnRhaW4gYSBsb3Qgb2YgZGF0YS4KKwl4UXVldWUyID0geFF1ZXVlQ3JlYXRlKCAxMCwgc2l6ZW9mKCBzdHJ1Y3QgQU1lc3NhZ2UgKiApICk7CisKKwkvLyAuLi4KKworCWlmKCB4UXVldWUxICE9IDAgKQorCXsKKwkJLy8gU2VuZCBhbiB1aW50MzJfdC4gIFdhaXQgZm9yIDEwIHRpY2tzIGZvciBzcGFjZSB0byBiZWNvbWUKKwkJLy8gYXZhaWxhYmxlIGlmIG5lY2Vzc2FyeS4KKwkJaWYoIHhRdWV1ZUdlbmVyaWNTZW5kKCB4UXVldWUxLCAoIHZvaWQgKiApICZ1bFZhciwgKCBUaWNrVHlwZV90ICkgMTAsIHF1ZXVlU0VORF9UT19CQUNLICkgIT0gcGRQQVNTICkKKwkJeworCQkJLy8gRmFpbGVkIHRvIHBvc3QgdGhlIG1lc3NhZ2UsIGV2ZW4gYWZ0ZXIgMTAgdGlja3MuCisJCX0KKwl9CisKKwlpZiggeFF1ZXVlMiAhPSAwICkKKwl7CisJCS8vIFNlbmQgYSBwb2ludGVyIHRvIGEgc3RydWN0IEFNZXNzYWdlIG9iamVjdC4gIERvbid0IGJsb2NrIGlmIHRoZQorCQkvLyBxdWV1ZSBpcyBhbHJlYWR5IGZ1bGwuCisJCXB4TWVzc2FnZSA9ICYgeE1lc3NhZ2U7CisJCXhRdWV1ZUdlbmVyaWNTZW5kKCB4UXVldWUyLCAoIHZvaWQgKiApICZweE1lc3NhZ2UsICggVGlja1R5cGVfdCApIDAsIHF1ZXVlU0VORF9UT19CQUNLICk7CisJfQorCisJLy8gLi4uIFJlc3Qgb2YgdGFzayBjb2RlLgorIH0KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4UXVldWVTZW5kIHhRdWV1ZVNlbmQKKyAqIFxpbmdyb3VwIFF1ZXVlTWFuYWdlbWVudAorICovCitCYXNlVHlwZV90IHhRdWV1ZUdlbmVyaWNTZW5kKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgY29uc3Qgdm9pZCAqIGNvbnN0IHB2SXRlbVRvUXVldWUsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0LCBjb25zdCBCYXNlVHlwZV90IHhDb3B5UG9zaXRpb24gKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHF1ZXVlLiBoCisgKiA8cHJlPgorIEJhc2VUeXBlX3QgeFF1ZXVlUGVlaygKKwkJCQkJCQkgUXVldWVIYW5kbGVfdCB4UXVldWUsCisJCQkJCQkJIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwKKwkJCQkJCQkgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQKKwkJCQkJCSApOzwvcHJlPgorICoKKyAqIFJlY2VpdmUgYW4gaXRlbSBmcm9tIGEgcXVldWUgd2l0aG91dCByZW1vdmluZyB0aGUgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KKyAqIFRoZSBpdGVtIGlzIHJlY2VpdmVkIGJ5IGNvcHkgc28gYSBidWZmZXIgb2YgYWRlcXVhdGUgc2l6ZSBtdXN0IGJlCisgKiBwcm92aWRlZC4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIGJ1ZmZlciB3YXMgZGVmaW5lZCB3aGVuCisgKiB0aGUgcXVldWUgd2FzIGNyZWF0ZWQuCisgKgorICogU3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGl0ZW1zIHJlbWFpbiBvbiB0aGUgcXVldWUgc28gd2lsbCBiZSByZXR1cm5lZCBhZ2FpbgorICogYnkgdGhlIG5leHQgY2FsbCwgb3IgYSBjYWxsIHRvIHhRdWV1ZVJlY2VpdmUoKS4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3Qgbm90IGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gIFNlZQorICogeFF1ZXVlUGVla0Zyb21JU1IoKSBmb3IgYW4gYWx0ZXJuYXRpdmUgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0CisgKiBzZXJ2aWNlIHJvdXRpbmUuCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIHRvIHRoZSBxdWV1ZSBmcm9tIHdoaWNoIHRoZSBpdGVtIGlzIHRvIGJlCisgKiByZWNlaXZlZC4KKyAqCisgKiBAcGFyYW0gcHZCdWZmZXIgUG9pbnRlciB0byB0aGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIHJlY2VpdmVkIGl0ZW0gd2lsbAorICogYmUgY29waWVkLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhlIHRhc2sgc2hvdWxkIGJsb2NrCisgKiB3YWl0aW5nIGZvciBhbiBpdGVtIHRvIHJlY2VpdmUgc2hvdWxkIHRoZSBxdWV1ZSBiZSBlbXB0eSBhdCB0aGUgdGltZQorICogb2YgdGhlIGNhbGwuCSBUaGUgdGltZSBpcyBkZWZpbmVkIGluIHRpY2sgcGVyaW9kcyBzbyB0aGUgY29uc3RhbnQKKyAqIHBvcnRUSUNLX1BFUklPRF9NUyBzaG91bGQgYmUgdXNlZCB0byBjb252ZXJ0IHRvIHJlYWwgdGltZSBpZiB0aGlzIGlzIHJlcXVpcmVkLgorICogeFF1ZXVlUGVlaygpIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHhUaWNrc1RvV2FpdCBpcyAwIGFuZCB0aGUgcXVldWUKKyAqIGlzIGVtcHR5LgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIGFuIGl0ZW0gd2FzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBmcm9tIHRoZSBxdWV1ZSwKKyAqIG90aGVyd2lzZSBwZEZBTFNFLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIHN0cnVjdCBBTWVzc2FnZQorIHsKKwljaGFyIHVjTWVzc2FnZUlEOworCWNoYXIgdWNEYXRhWyAyMCBdOworIH0geE1lc3NhZ2U7CisKKyBRdWV1ZUhhbmRsZV90IHhRdWV1ZTsKKworIC8vIFRhc2sgdG8gY3JlYXRlIGEgcXVldWUgYW5kIHBvc3QgYSB2YWx1ZS4KKyB2b2lkIHZBVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyB7Cisgc3RydWN0IEFNZXNzYWdlICpweE1lc3NhZ2U7CisKKwkvLyBDcmVhdGUgYSBxdWV1ZSBjYXBhYmxlIG9mIGNvbnRhaW5pbmcgMTAgcG9pbnRlcnMgdG8gQU1lc3NhZ2Ugc3RydWN0dXJlcy4KKwkvLyBUaGVzZSBzaG91bGQgYmUgcGFzc2VkIGJ5IHBvaW50ZXIgYXMgdGhleSBjb250YWluIGEgbG90IG9mIGRhdGEuCisJeFF1ZXVlID0geFF1ZXVlQ3JlYXRlKCAxMCwgc2l6ZW9mKCBzdHJ1Y3QgQU1lc3NhZ2UgKiApICk7CisJaWYoIHhRdWV1ZSA9PSAwICkKKwl7CisJCS8vIEZhaWxlZCB0byBjcmVhdGUgdGhlIHF1ZXVlLgorCX0KKworCS8vIC4uLgorCisJLy8gU2VuZCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgQU1lc3NhZ2Ugb2JqZWN0LiAgRG9uJ3QgYmxvY2sgaWYgdGhlCisJLy8gcXVldWUgaXMgYWxyZWFkeSBmdWxsLgorCXB4TWVzc2FnZSA9ICYgeE1lc3NhZ2U7CisJeFF1ZXVlU2VuZCggeFF1ZXVlLCAoIHZvaWQgKiApICZweE1lc3NhZ2UsICggVGlja1R5cGVfdCApIDAgKTsKKworCS8vIC4uLiBSZXN0IG9mIHRhc2sgY29kZS4KKyB9CisKKyAvLyBUYXNrIHRvIHBlZWsgdGhlIGRhdGEgZnJvbSB0aGUgcXVldWUuCisgdm9pZCB2QURpZmZlcmVudFRhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApCisgeworIHN0cnVjdCBBTWVzc2FnZSAqcHhSeGVkTWVzc2FnZTsKKworCWlmKCB4UXVldWUgIT0gMCApCisJeworCQkvLyBQZWVrIGEgbWVzc2FnZSBvbiB0aGUgY3JlYXRlZCBxdWV1ZS4gIEJsb2NrIGZvciAxMCB0aWNrcyBpZiBhCisJCS8vIG1lc3NhZ2UgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKwkJaWYoIHhRdWV1ZVBlZWsoIHhRdWV1ZSwgJiggcHhSeGVkTWVzc2FnZSApLCAoIFRpY2tUeXBlX3QgKSAxMCApICkKKwkJeworCQkJLy8gcGNSeGVkTWVzc2FnZSBub3cgcG9pbnRzIHRvIHRoZSBzdHJ1Y3QgQU1lc3NhZ2UgdmFyaWFibGUgcG9zdGVkCisJCQkvLyBieSB2QVRhc2ssIGJ1dCB0aGUgaXRlbSBzdGlsbCByZW1haW5zIG9uIHRoZSBxdWV1ZS4KKwkJfQorCX0KKworCS8vIC4uLiBSZXN0IG9mIHRhc2sgY29kZS4KKyB9CisgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFF1ZXVlUGVlayB4UXVldWVQZWVrCisgKiBcaW5ncm91cCBRdWV1ZU1hbmFnZW1lbnQKKyAqLworQmFzZVR5cGVfdCB4UXVldWVQZWVrKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgdm9pZCAqIGNvbnN0IHB2QnVmZmVyLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogcXVldWUuIGgKKyAqIDxwcmU+CisgQmFzZVR5cGVfdCB4UXVldWVQZWVrRnJvbUlTUigKKwkJCQkJCQkJCVF1ZXVlSGFuZGxlX3QgeFF1ZXVlLAorCQkJCQkJCQkJdm9pZCAqcHZCdWZmZXIsCisJCQkJCQkJCSk7PC9wcmU+CisgKgorICogQSB2ZXJzaW9uIG9mIHhRdWV1ZVBlZWsoKSB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgc2VydmljZQorICogcm91dGluZSAoSVNSKS4KKyAqCisgKiBSZWNlaXZlIGFuIGl0ZW0gZnJvbSBhIHF1ZXVlIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIGl0ZW0gZnJvbSB0aGUgcXVldWUuCisgKiBUaGUgaXRlbSBpcyByZWNlaXZlZCBieSBjb3B5IHNvIGEgYnVmZmVyIG9mIGFkZXF1YXRlIHNpemUgbXVzdCBiZQorICogcHJvdmlkZWQuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIHRoZSBidWZmZXIgd2FzIGRlZmluZWQgd2hlbgorICogdGhlIHF1ZXVlIHdhcyBjcmVhdGVkLgorICoKKyAqIFN1Y2Nlc3NmdWxseSByZWNlaXZlZCBpdGVtcyByZW1haW4gb24gdGhlIHF1ZXVlIHNvIHdpbGwgYmUgcmV0dXJuZWQgYWdhaW4KKyAqIGJ5IHRoZSBuZXh0IGNhbGwsIG9yIGEgY2FsbCB0byB4UXVldWVSZWNlaXZlKCkuCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIHRvIHRoZSBxdWV1ZSBmcm9tIHdoaWNoIHRoZSBpdGVtIGlzIHRvIGJlCisgKiByZWNlaXZlZC4KKyAqCisgKiBAcGFyYW0gcHZCdWZmZXIgUG9pbnRlciB0byB0aGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIHJlY2VpdmVkIGl0ZW0gd2lsbAorICogYmUgY29waWVkLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIGFuIGl0ZW0gd2FzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBmcm9tIHRoZSBxdWV1ZSwKKyAqIG90aGVyd2lzZSBwZEZBTFNFLgorICoKKyAqIFxkZWZncm91cCB4UXVldWVQZWVrRnJvbUlTUiB4UXVldWVQZWVrRnJvbUlTUgorICogXGluZ3JvdXAgUXVldWVNYW5hZ2VtZW50CisgKi8KK0Jhc2VUeXBlX3QgeFF1ZXVlUGVla0Zyb21JU1IoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCB2b2lkICogY29uc3QgcHZCdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHF1ZXVlLiBoCisgKiA8cHJlPgorIEJhc2VUeXBlX3QgeFF1ZXVlUmVjZWl2ZSgKKwkJCQkJCQkJIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLAorCQkJCQkJCQkgdm9pZCAqcHZCdWZmZXIsCisJCQkJCQkJCSBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdAorCQkJCQkJCSk7PC9wcmU+CisgKgorICogUmVjZWl2ZSBhbiBpdGVtIGZyb20gYSBxdWV1ZS4gIFRoZSBpdGVtIGlzIHJlY2VpdmVkIGJ5IGNvcHkgc28gYSBidWZmZXIgb2YKKyAqIGFkZXF1YXRlIHNpemUgbXVzdCBiZSBwcm92aWRlZC4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIGJ1ZmZlcgorICogd2FzIGRlZmluZWQgd2hlbiB0aGUgcXVldWUgd2FzIGNyZWF0ZWQuCisgKgorICogU3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgdXNlZCBpbiBhbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAgU2VlCisgKiB4UXVldWVSZWNlaXZlRnJvbUlTUiBmb3IgYW4gYWx0ZXJuYXRpdmUgdGhhdCBjYW4uCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIHRvIHRoZSBxdWV1ZSBmcm9tIHdoaWNoIHRoZSBpdGVtIGlzIHRvIGJlCisgKiByZWNlaXZlZC4KKyAqCisgKiBAcGFyYW0gcHZCdWZmZXIgUG9pbnRlciB0byB0aGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIHJlY2VpdmVkIGl0ZW0gd2lsbAorICogYmUgY29waWVkLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhlIHRhc2sgc2hvdWxkIGJsb2NrCisgKiB3YWl0aW5nIGZvciBhbiBpdGVtIHRvIHJlY2VpdmUgc2hvdWxkIHRoZSBxdWV1ZSBiZSBlbXB0eSBhdCB0aGUgdGltZQorICogb2YgdGhlIGNhbGwuCSB4UXVldWVSZWNlaXZlKCkgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgeFRpY2tzVG9XYWl0CisgKiBpcyB6ZXJvIGFuZCB0aGUgcXVldWUgaXMgZW1wdHkuICBUaGUgdGltZSBpcyBkZWZpbmVkIGluIHRpY2sgcGVyaW9kcyBzbyB0aGUKKyAqIGNvbnN0YW50IHBvcnRUSUNLX1BFUklPRF9NUyBzaG91bGQgYmUgdXNlZCB0byBjb252ZXJ0IHRvIHJlYWwgdGltZSBpZiB0aGlzIGlzCisgKiByZXF1aXJlZC4KKyAqCisgKiBAcmV0dXJuIHBkVFJVRSBpZiBhbiBpdGVtIHdhcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgZnJvbSB0aGUgcXVldWUsCisgKiBvdGhlcndpc2UgcGRGQUxTRS4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKyBzdHJ1Y3QgQU1lc3NhZ2UKKyB7CisJY2hhciB1Y01lc3NhZ2VJRDsKKwljaGFyIHVjRGF0YVsgMjAgXTsKKyB9IHhNZXNzYWdlOworCisgUXVldWVIYW5kbGVfdCB4UXVldWU7CisKKyAvLyBUYXNrIHRvIGNyZWF0ZSBhIHF1ZXVlIGFuZCBwb3N0IGEgdmFsdWUuCisgdm9pZCB2QVRhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApCisgeworIHN0cnVjdCBBTWVzc2FnZSAqcHhNZXNzYWdlOworCisJLy8gQ3JlYXRlIGEgcXVldWUgY2FwYWJsZSBvZiBjb250YWluaW5nIDEwIHBvaW50ZXJzIHRvIEFNZXNzYWdlIHN0cnVjdHVyZXMuCisJLy8gVGhlc2Ugc2hvdWxkIGJlIHBhc3NlZCBieSBwb2ludGVyIGFzIHRoZXkgY29udGFpbiBhIGxvdCBvZiBkYXRhLgorCXhRdWV1ZSA9IHhRdWV1ZUNyZWF0ZSggMTAsIHNpemVvZiggc3RydWN0IEFNZXNzYWdlICogKSApOworCWlmKCB4UXVldWUgPT0gMCApCisJeworCQkvLyBGYWlsZWQgdG8gY3JlYXRlIHRoZSBxdWV1ZS4KKwl9CisKKwkvLyAuLi4KKworCS8vIFNlbmQgYSBwb2ludGVyIHRvIGEgc3RydWN0IEFNZXNzYWdlIG9iamVjdC4gIERvbid0IGJsb2NrIGlmIHRoZQorCS8vIHF1ZXVlIGlzIGFscmVhZHkgZnVsbC4KKwlweE1lc3NhZ2UgPSAmIHhNZXNzYWdlOworCXhRdWV1ZVNlbmQoIHhRdWV1ZSwgKCB2b2lkICogKSAmcHhNZXNzYWdlLCAoIFRpY2tUeXBlX3QgKSAwICk7CisKKwkvLyAuLi4gUmVzdCBvZiB0YXNrIGNvZGUuCisgfQorCisgLy8gVGFzayB0byByZWNlaXZlIGZyb20gdGhlIHF1ZXVlLgorIHZvaWQgdkFEaWZmZXJlbnRUYXNrKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorIHsKKyBzdHJ1Y3QgQU1lc3NhZ2UgKnB4UnhlZE1lc3NhZ2U7CisKKwlpZiggeFF1ZXVlICE9IDAgKQorCXsKKwkJLy8gUmVjZWl2ZSBhIG1lc3NhZ2Ugb24gdGhlIGNyZWF0ZWQgcXVldWUuICBCbG9jayBmb3IgMTAgdGlja3MgaWYgYQorCQkvLyBtZXNzYWdlIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUuCisJCWlmKCB4UXVldWVSZWNlaXZlKCB4UXVldWUsICYoIHB4UnhlZE1lc3NhZ2UgKSwgKCBUaWNrVHlwZV90ICkgMTAgKSApCisJCXsKKwkJCS8vIHBjUnhlZE1lc3NhZ2Ugbm93IHBvaW50cyB0byB0aGUgc3RydWN0IEFNZXNzYWdlIHZhcmlhYmxlIHBvc3RlZAorCQkJLy8gYnkgdkFUYXNrLgorCQl9CisJfQorCisJLy8gLi4uIFJlc3Qgb2YgdGFzayBjb2RlLgorIH0KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4UXVldWVSZWNlaXZlIHhRdWV1ZVJlY2VpdmUKKyAqIFxpbmdyb3VwIFF1ZXVlTWFuYWdlbWVudAorICovCitCYXNlVHlwZV90IHhRdWV1ZVJlY2VpdmUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCB2b2lkICogY29uc3QgcHZCdWZmZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBxdWV1ZS4gaAorICogPHByZT5VQmFzZVR5cGVfdCB1eFF1ZXVlTWVzc2FnZXNXYWl0aW5nKCBjb25zdCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApOzwvcHJlPgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHN0b3JlZCBpbiBhIHF1ZXVlLgorICoKKyAqIEBwYXJhbSB4UXVldWUgQSBoYW5kbGUgdG8gdGhlIHF1ZXVlIGJlaW5nIHF1ZXJpZWQuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIG1lc3NhZ2VzIGF2YWlsYWJsZSBpbiB0aGUgcXVldWUuCisgKgorICogXGRlZmdyb3VwIHV4UXVldWVNZXNzYWdlc1dhaXRpbmcgdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZworICogXGluZ3JvdXAgUXVldWVNYW5hZ2VtZW50CisgKi8KK1VCYXNlVHlwZV90IHV4UXVldWVNZXNzYWdlc1dhaXRpbmcoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBxdWV1ZS4gaAorICogPHByZT5VQmFzZVR5cGVfdCB1eFF1ZXVlU3BhY2VzQXZhaWxhYmxlKCBjb25zdCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApOzwvcHJlPgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgc3BhY2VzIGF2YWlsYWJsZSBpbiBhIHF1ZXVlLiAgVGhpcyBpcyBlcXVhbCB0byB0aGUKKyAqIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBzZW50IHRvIHRoZSBxdWV1ZSBiZWZvcmUgdGhlIHF1ZXVlIGJlY29tZXMgZnVsbAorICogaWYgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCisgKgorICogQHBhcmFtIHhRdWV1ZSBBIGhhbmRsZSB0byB0aGUgcXVldWUgYmVpbmcgcXVlcmllZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygc3BhY2VzIGF2YWlsYWJsZSBpbiB0aGUgcXVldWUuCisgKgorICogXGRlZmdyb3VwIHV4UXVldWVNZXNzYWdlc1dhaXRpbmcgdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZworICogXGluZ3JvdXAgUXVldWVNYW5hZ2VtZW50CisgKi8KK1VCYXNlVHlwZV90IHV4UXVldWVTcGFjZXNBdmFpbGFibGUoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBxdWV1ZS4gaAorICogPHByZT52b2lkIHZRdWV1ZURlbGV0ZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKTs8L3ByZT4KKyAqCisgKiBEZWxldGUgYSBxdWV1ZSAtIGZyZWVpbmcgYWxsIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBzdG9yaW5nIG9mIGl0ZW1zCisgKiBwbGFjZWQgb24gdGhlIHF1ZXVlLgorICoKKyAqIEBwYXJhbSB4UXVldWUgQSBoYW5kbGUgdG8gdGhlIHF1ZXVlIHRvIGJlIGRlbGV0ZWQuCisgKgorICogXGRlZmdyb3VwIHZRdWV1ZURlbGV0ZSB2UXVldWVEZWxldGUKKyAqIFxpbmdyb3VwIFF1ZXVlTWFuYWdlbWVudAorICovCit2b2lkIHZRdWV1ZURlbGV0ZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHF1ZXVlLiBoCisgKiA8cHJlPgorIEJhc2VUeXBlX3QgeFF1ZXVlU2VuZFRvRnJvbnRGcm9tSVNSKAorCQkJCQkJCQkJCSBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwKKwkJCQkJCQkJCQkgY29uc3Qgdm9pZCAqcHZJdGVtVG9RdWV1ZSwKKwkJCQkJCQkJCQkgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbgorCQkJCQkJCQkJICApOworIDwvcHJlPgorICoKKyAqIFRoaXMgaXMgYSBtYWNybyB0aGF0IGNhbGxzIHhRdWV1ZUdlbmVyaWNTZW5kRnJvbUlTUigpLgorICoKKyAqIFBvc3QgYW4gaXRlbSB0byB0aGUgZnJvbnQgb2YgYSBxdWV1ZS4gIEl0IGlzIHNhZmUgdG8gdXNlIHRoaXMgbWFjcm8gZnJvbQorICogd2l0aGluIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKgorICogSXRlbXMgYXJlIHF1ZXVlZCBieSBjb3B5IG5vdCByZWZlcmVuY2Ugc28gaXQgaXMgcHJlZmVyYWJsZSB0byBvbmx5CisgKiBxdWV1ZSBzbWFsbCBpdGVtcywgZXNwZWNpYWxseSB3aGVuIGNhbGxlZCBmcm9tIGFuIElTUi4gIEluIG1vc3QgY2FzZXMKKyAqIGl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8gc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBpdGVtIGJlaW5nIHF1ZXVlZC4KKyAqCisgKiBAcGFyYW0geFF1ZXVlIFRoZSBoYW5kbGUgdG8gdGhlIHF1ZXVlIG9uIHdoaWNoIHRoZSBpdGVtIGlzIHRvIGJlIHBvc3RlZC4KKyAqCisgKiBAcGFyYW0gcHZJdGVtVG9RdWV1ZSBBIHBvaW50ZXIgdG8gdGhlIGl0ZW0gdGhhdCBpcyB0byBiZSBwbGFjZWQgb24gdGhlCisgKiBxdWV1ZS4gIFRoZSBzaXplIG9mIHRoZSBpdGVtcyB0aGUgcXVldWUgd2lsbCBob2xkIHdhcyBkZWZpbmVkIHdoZW4gdGhlCisgKiBxdWV1ZSB3YXMgY3JlYXRlZCwgc28gdGhpcyBtYW55IGJ5dGVzIHdpbGwgYmUgY29waWVkIGZyb20gcHZJdGVtVG9RdWV1ZQorICogaW50byB0aGUgcXVldWUgc3RvcmFnZSBhcmVhLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHhRdWV1ZVNlbmRUb0Zyb250RnJvbUlTUigpIHdpbGwgc2V0CisgKiAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB0byBwZFRSVUUgaWYgc2VuZGluZyB0byB0aGUgcXVldWUgY2F1c2VkIGEgdGFzaworICogdG8gdW5ibG9jaywgYW5kIHRoZSB1bmJsb2NrZWQgdGFzayBoYXMgYSBwcmlvcml0eSBoaWdoZXIgdGhhbiB0aGUgY3VycmVudGx5CisgKiBydW5uaW5nIHRhc2suICBJZiB4UXVldWVTZW5kVG9Gcm9tRnJvbUlTUigpIHNldHMgdGhpcyB2YWx1ZSB0byBwZFRSVUUgdGhlbgorICogYSBjb250ZXh0IHN3aXRjaCBzaG91bGQgYmUgcmVxdWVzdGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIGV4aXRlZC4KKyAqCisgKiBAcmV0dXJuIHBkVFJVRSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIHF1ZXVlLCBvdGhlcndpc2UKKyAqIGVyclFVRVVFX0ZVTEwuCisgKgorICogRXhhbXBsZSB1c2FnZSBmb3IgYnVmZmVyZWQgSU8gKHdoZXJlIHRoZSBJU1IgY2FuIG9idGFpbiBtb3JlIHRoYW4gb25lIHZhbHVlCisgKiBwZXIgY2FsbCk6CisgICA8cHJlPgorIHZvaWQgdkJ1ZmZlcklTUiggdm9pZCApCisgeworIGNoYXIgY0luOworIEJhc2VUeXBlX3QgeEhpZ2hlclByaW9yaXRUYXNrV29rZW47CisKKwkvLyBXZSBoYXZlIG5vdCB3b2tlbiBhIHRhc2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBJU1IuCisJeEhpZ2hlclByaW9yaXR5VGFza1dva2VuID0gcGRGQUxTRTsKKworCS8vIExvb3AgdW50aWwgdGhlIGJ1ZmZlciBpcyBlbXB0eS4KKwlkbworCXsKKwkJLy8gT2J0YWluIGEgYnl0ZSBmcm9tIHRoZSBidWZmZXIuCisJCWNJbiA9IHBvcnRJTlBVVF9CWVRFKCBSWF9SRUdJU1RFUl9BRERSRVNTICk7CisKKwkJLy8gUG9zdCB0aGUgYnl0ZS4KKwkJeFF1ZXVlU2VuZFRvRnJvbnRGcm9tSVNSKCB4UnhRdWV1ZSwgJmNJbiwgJnhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworCisJfSB3aGlsZSggcG9ydElOUFVUX0JZVEUoIEJVRkZFUl9DT1VOVCApICk7CisKKwkvLyBOb3cgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBjYW4gc3dpdGNoIGNvbnRleHQgaWYgbmVjZXNzYXJ5LgorCWlmKCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKQorCXsKKwkJdGFza1lJRUxEICgpOworCX0KKyB9CisgPC9wcmU+CisgKgorICogXGRlZmdyb3VwIHhRdWV1ZVNlbmRGcm9tSVNSIHhRdWV1ZVNlbmRGcm9tSVNSCisgKiBcaW5ncm91cCBRdWV1ZU1hbmFnZW1lbnQKKyAqLworI2RlZmluZSB4UXVldWVTZW5kVG9Gcm9udEZyb21JU1IoIHhRdWV1ZSwgcHZJdGVtVG9RdWV1ZSwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApIHhRdWV1ZUdlbmVyaWNTZW5kRnJvbUlTUiggKCB4UXVldWUgKSwgKCBwdkl0ZW1Ub1F1ZXVlICksICggcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApLCBxdWV1ZVNFTkRfVE9fRlJPTlQgKQorCisKKy8qKgorICogcXVldWUuIGgKKyAqIDxwcmU+CisgQmFzZVR5cGVfdCB4UXVldWVTZW5kVG9CYWNrRnJvbUlTUigKKwkJCQkJCQkJCQkgUXVldWVIYW5kbGVfdCB4UXVldWUsCisJCQkJCQkJCQkJIGNvbnN0IHZvaWQgKnB2SXRlbVRvUXVldWUsCisJCQkJCQkJCQkJIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4KKwkJCQkJCQkJCSAgKTsKKyA8L3ByZT4KKyAqCisgKiBUaGlzIGlzIGEgbWFjcm8gdGhhdCBjYWxscyB4UXVldWVHZW5lcmljU2VuZEZyb21JU1IoKS4KKyAqCisgKiBQb3N0IGFuIGl0ZW0gdG8gdGhlIGJhY2sgb2YgYSBxdWV1ZS4gIEl0IGlzIHNhZmUgdG8gdXNlIHRoaXMgbWFjcm8gZnJvbQorICogd2l0aGluIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKgorICogSXRlbXMgYXJlIHF1ZXVlZCBieSBjb3B5IG5vdCByZWZlcmVuY2Ugc28gaXQgaXMgcHJlZmVyYWJsZSB0byBvbmx5CisgKiBxdWV1ZSBzbWFsbCBpdGVtcywgZXNwZWNpYWxseSB3aGVuIGNhbGxlZCBmcm9tIGFuIElTUi4gIEluIG1vc3QgY2FzZXMKKyAqIGl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8gc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBpdGVtIGJlaW5nIHF1ZXVlZC4KKyAqCisgKiBAcGFyYW0geFF1ZXVlIFRoZSBoYW5kbGUgdG8gdGhlIHF1ZXVlIG9uIHdoaWNoIHRoZSBpdGVtIGlzIHRvIGJlIHBvc3RlZC4KKyAqCisgKiBAcGFyYW0gcHZJdGVtVG9RdWV1ZSBBIHBvaW50ZXIgdG8gdGhlIGl0ZW0gdGhhdCBpcyB0byBiZSBwbGFjZWQgb24gdGhlCisgKiBxdWV1ZS4gIFRoZSBzaXplIG9mIHRoZSBpdGVtcyB0aGUgcXVldWUgd2lsbCBob2xkIHdhcyBkZWZpbmVkIHdoZW4gdGhlCisgKiBxdWV1ZSB3YXMgY3JlYXRlZCwgc28gdGhpcyBtYW55IGJ5dGVzIHdpbGwgYmUgY29waWVkIGZyb20gcHZJdGVtVG9RdWV1ZQorICogaW50byB0aGUgcXVldWUgc3RvcmFnZSBhcmVhLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHhRdWV1ZVNlbmRUb0JhY2tGcm9tSVNSKCkgd2lsbCBzZXQKKyAqICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHRvIHBkVFJVRSBpZiBzZW5kaW5nIHRvIHRoZSBxdWV1ZSBjYXVzZWQgYSB0YXNrCisgKiB0byB1bmJsb2NrLCBhbmQgdGhlIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50bHkKKyAqIHJ1bm5pbmcgdGFzay4gIElmIHhRdWV1ZVNlbmRUb0JhY2tGcm9tSVNSKCkgc2V0cyB0aGlzIHZhbHVlIHRvIHBkVFJVRSB0aGVuCisgKiBhIGNvbnRleHQgc3dpdGNoIHNob3VsZCBiZSByZXF1ZXN0ZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgaXMgZXhpdGVkLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgcXVldWUsIG90aGVyd2lzZQorICogZXJyUVVFVUVfRlVMTC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlIGZvciBidWZmZXJlZCBJTyAod2hlcmUgdGhlIElTUiBjYW4gb2J0YWluIG1vcmUgdGhhbiBvbmUgdmFsdWUKKyAqIHBlciBjYWxsKToKKyAgIDxwcmU+Cisgdm9pZCB2QnVmZmVySVNSKCB2b2lkICkKKyB7CisgY2hhciBjSW47CisgQmFzZVR5cGVfdCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW47CisKKwkvLyBXZSBoYXZlIG5vdCB3b2tlbiBhIHRhc2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBJU1IuCisJeEhpZ2hlclByaW9yaXR5VGFza1dva2VuID0gcGRGQUxTRTsKKworCS8vIExvb3AgdW50aWwgdGhlIGJ1ZmZlciBpcyBlbXB0eS4KKwlkbworCXsKKwkJLy8gT2J0YWluIGEgYnl0ZSBmcm9tIHRoZSBidWZmZXIuCisJCWNJbiA9IHBvcnRJTlBVVF9CWVRFKCBSWF9SRUdJU1RFUl9BRERSRVNTICk7CisKKwkJLy8gUG9zdCB0aGUgYnl0ZS4KKwkJeFF1ZXVlU2VuZFRvQmFja0Zyb21JU1IoIHhSeFF1ZXVlLCAmY0luLCAmeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisKKwl9IHdoaWxlKCBwb3J0SU5QVVRfQllURSggQlVGRkVSX0NPVU5UICkgKTsKKworCS8vIE5vdyB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIGNhbiBzd2l0Y2ggY29udGV4dCBpZiBuZWNlc3NhcnkuCisJaWYoIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApCisJeworCQl0YXNrWUlFTEQgKCk7CisJfQorIH0KKyA8L3ByZT4KKyAqCisgKiBcZGVmZ3JvdXAgeFF1ZXVlU2VuZEZyb21JU1IgeFF1ZXVlU2VuZEZyb21JU1IKKyAqIFxpbmdyb3VwIFF1ZXVlTWFuYWdlbWVudAorICovCisjZGVmaW5lIHhRdWV1ZVNlbmRUb0JhY2tGcm9tSVNSKCB4UXVldWUsIHB2SXRlbVRvUXVldWUsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSB4UXVldWVHZW5lcmljU2VuZEZyb21JU1IoICggeFF1ZXVlICksICggcHZJdGVtVG9RdWV1ZSApLCAoIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSwgcXVldWVTRU5EX1RPX0JBQ0sgKQorCisvKioKKyAqIHF1ZXVlLiBoCisgKiA8cHJlPgorIEJhc2VUeXBlX3QgeFF1ZXVlT3ZlcndyaXRlRnJvbUlTUigKKwkJCQkJCQkgIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLAorCQkJCQkJCSAgY29uc3Qgdm9pZCAqIHB2SXRlbVRvUXVldWUsCisJCQkJCQkJICBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuCisJCQkJCQkgKTsKKyAqIDwvcHJlPgorICoKKyAqIEEgdmVyc2lvbiBvZiB4UXVldWVPdmVyd3JpdGUoKSB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIGludGVycnVwdCBzZXJ2aWNlCisgKiByb3V0aW5lIChJU1IpLgorICoKKyAqIE9ubHkgZm9yIHVzZSB3aXRoIHF1ZXVlcyB0aGF0IGNhbiBob2xkIGEgc2luZ2xlIGl0ZW0gLSBzbyB0aGUgcXVldWUgaXMgZWl0aGVyCisgKiBlbXB0eSBvciBmdWxsLgorICoKKyAqIFBvc3QgYW4gaXRlbSBvbiBhIHF1ZXVlLiAgSWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkgZnVsbCB0aGVuIG92ZXJ3cml0ZSB0aGUKKyAqIHZhbHVlIGhlbGQgaW4gdGhlIHF1ZXVlLiAgVGhlIGl0ZW0gaXMgcXVldWVkIGJ5IGNvcHksIG5vdCBieSByZWZlcmVuY2UuCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIHRvIHRoZSBxdWV1ZSBvbiB3aGljaCB0aGUgaXRlbSBpcyB0byBiZSBwb3N0ZWQuCisgKgorICogQHBhcmFtIHB2SXRlbVRvUXVldWUgQSBwb2ludGVyIHRvIHRoZSBpdGVtIHRoYXQgaXMgdG8gYmUgcGxhY2VkIG9uIHRoZQorICogcXVldWUuICBUaGUgc2l6ZSBvZiB0aGUgaXRlbXMgdGhlIHF1ZXVlIHdpbGwgaG9sZCB3YXMgZGVmaW5lZCB3aGVuIHRoZQorICogcXVldWUgd2FzIGNyZWF0ZWQsIHNvIHRoaXMgbWFueSBieXRlcyB3aWxsIGJlIGNvcGllZCBmcm9tIHB2SXRlbVRvUXVldWUKKyAqIGludG8gdGhlIHF1ZXVlIHN0b3JhZ2UgYXJlYS4KKyAqCisgKiBAcGFyYW0gcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB4UXVldWVPdmVyd3JpdGVGcm9tSVNSKCkgd2lsbCBzZXQKKyAqICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHRvIHBkVFJVRSBpZiBzZW5kaW5nIHRvIHRoZSBxdWV1ZSBjYXVzZWQgYSB0YXNrCisgKiB0byB1bmJsb2NrLCBhbmQgdGhlIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50bHkKKyAqIHJ1bm5pbmcgdGFzay4gIElmIHhRdWV1ZU92ZXJ3cml0ZUZyb21JU1IoKSBzZXRzIHRoaXMgdmFsdWUgdG8gcGRUUlVFIHRoZW4KKyAqIGEgY29udGV4dCBzd2l0Y2ggc2hvdWxkIGJlIHJlcXVlc3RlZCBiZWZvcmUgdGhlIGludGVycnVwdCBpcyBleGl0ZWQuCisgKgorICogQHJldHVybiB4UXVldWVPdmVyd3JpdGVGcm9tSVNSKCkgaXMgYSBtYWNybyB0aGF0IGNhbGxzCisgKiB4UXVldWVHZW5lcmljU2VuZEZyb21JU1IoKSwgYW5kIHRoZXJlZm9yZSBoYXMgdGhlIHNhbWUgcmV0dXJuIHZhbHVlcyBhcworICogeFF1ZXVlU2VuZFRvRnJvbnRGcm9tSVNSKCkuICBIb3dldmVyLCBwZFBBU1MgaXMgdGhlIG9ubHkgdmFsdWUgdGhhdCBjYW4gYmUKKyAqIHJldHVybmVkIGJlY2F1c2UgeFF1ZXVlT3ZlcndyaXRlRnJvbUlTUigpIHdpbGwgd3JpdGUgdG8gdGhlIHF1ZXVlIGV2ZW4gd2hlbgorICogdGhlIHF1ZXVlIGlzIGFscmVhZHkgZnVsbC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKworIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlOworCisgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisgeworIAkvLyBDcmVhdGUgYSBxdWV1ZSB0byBob2xkIG9uZSB1aW50MzJfdCB2YWx1ZS4gIEl0IGlzIHN0cm9uZ2x5CisJLy8gcmVjb21tZW5kZWQgKm5vdCogdG8gdXNlIHhRdWV1ZU92ZXJ3cml0ZUZyb21JU1IoKSBvbiBxdWV1ZXMgdGhhdCBjYW4KKwkvLyBjb250YWluIG1vcmUgdGhhbiBvbmUgdmFsdWUsIGFuZCBkb2luZyBzbyB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0aW9uCisJLy8gaWYgY29uZmlnQVNTRVJUKCkgaXMgZGVmaW5lZC4KKwl4UXVldWUgPSB4UXVldWVDcmVhdGUoIDEsIHNpemVvZiggdWludDMyX3QgKSApOworfQorCit2b2lkIHZBbkludGVycnVwdEhhbmRsZXIoIHZvaWQgKQoreworLy8geEhpZ2hlclByaW9yaXR5VGFza1dva2VuIG11c3QgYmUgc2V0IHRvIHBkRkFMU0UgYmVmb3JlIGl0IGlzIHVzZWQuCitCYXNlVHlwZV90IHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkRkFMU0U7Cit1aW50MzJfdCB1bFZhclRvU2VuZCwgdWxWYWxSZWNlaXZlZDsKKworCS8vIFdyaXRlIHRoZSB2YWx1ZSAxMCB0byB0aGUgcXVldWUgdXNpbmcgeFF1ZXVlT3ZlcndyaXRlRnJvbUlTUigpLgorCXVsVmFyVG9TZW5kID0gMTA7CisJeFF1ZXVlT3ZlcndyaXRlRnJvbUlTUiggeFF1ZXVlLCAmdWxWYXJUb1NlbmQsICZ4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKworCS8vIFRoZSBxdWV1ZSBpcyBmdWxsLCBidXQgY2FsbGluZyB4UXVldWVPdmVyd3JpdGVGcm9tSVNSKCkgYWdhaW4gd2lsbCBzdGlsbAorCS8vIHBhc3MgYmVjYXVzZSB0aGUgdmFsdWUgaGVsZCBpbiB0aGUgcXVldWUgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZQorCS8vIG5ldyB2YWx1ZS4KKwl1bFZhclRvU2VuZCA9IDEwMDsKKwl4UXVldWVPdmVyd3JpdGVGcm9tSVNSKCB4UXVldWUsICZ1bFZhclRvU2VuZCwgJnhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworCisJLy8gUmVhZGluZyBmcm9tIHRoZSBxdWV1ZSB3aWxsIG5vdyByZXR1cm4gMTAwLgorCisJLy8gLi4uCisKKwlpZiggeEhpZ2hlclByaW9yaXR5dGFza1dva2VuID09IHBkVFJVRSApCisJeworCQkvLyBXcml0aW5nIHRvIHRoZSBxdWV1ZSBjYXVzZWQgYSB0YXNrIHRvIHVuYmxvY2sgYW5kIHRoZSB1bmJsb2NrZWQgdGFzaworCQkvLyBoYXMgYSBwcmlvcml0eSBoaWdoZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJpb3JpdHkgb2YgdGhlIGN1cnJlbnRseQorCQkvLyBleGVjdXRpbmcgdGFzayAodGhlIHRhc2sgdGhpcyBpbnRlcnJ1cHQgaW50ZXJydXB0ZWQpLiAgUGVyZm9ybSBhIGNvbnRleHQKKwkJLy8gc3dpdGNoIHNvIHRoaXMgaW50ZXJydXB0IHJldHVybnMgZGlyZWN0bHkgdG8gdGhlIHVuYmxvY2tlZCB0YXNrLgorCQlwb3J0WUlFTERfRlJPTV9JU1IoKTsgLy8gb3IgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCkgZGVwZW5kaW5nIG9uIHRoZSBwb3J0LgorCX0KK30KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4UXVldWVPdmVyd3JpdGVGcm9tSVNSIHhRdWV1ZU92ZXJ3cml0ZUZyb21JU1IKKyAqIFxpbmdyb3VwIFF1ZXVlTWFuYWdlbWVudAorICovCisjZGVmaW5lIHhRdWV1ZU92ZXJ3cml0ZUZyb21JU1IoIHhRdWV1ZSwgcHZJdGVtVG9RdWV1ZSwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApIHhRdWV1ZUdlbmVyaWNTZW5kRnJvbUlTUiggKCB4UXVldWUgKSwgKCBwdkl0ZW1Ub1F1ZXVlICksICggcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApLCBxdWV1ZU9WRVJXUklURSApCisKKy8qKgorICogcXVldWUuIGgKKyAqIDxwcmU+CisgQmFzZVR5cGVfdCB4UXVldWVTZW5kRnJvbUlTUigKKwkJCQkJCQkJCSBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwKKwkJCQkJCQkJCSBjb25zdCB2b2lkICpwdkl0ZW1Ub1F1ZXVlLAorCQkJCQkJCQkJIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4KKwkJCQkJCQkJKTsKKyA8L3ByZT4KKyAqCisgKiBUaGlzIGlzIGEgbWFjcm8gdGhhdCBjYWxscyB4UXVldWVHZW5lcmljU2VuZEZyb21JU1IoKS4gIEl0IGlzIGluY2x1ZGVkCisgKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIG9mIEZyZWVSVE9TLm9yZyB0aGF0IGRpZCBub3QKKyAqIGluY2x1ZGUgdGhlIHhRdWV1ZVNlbmRUb0JhY2tGcm9tSVNSKCkgYW5kIHhRdWV1ZVNlbmRUb0Zyb250RnJvbUlTUigpCisgKiBtYWNyb3MuCisgKgorICogUG9zdCBhbiBpdGVtIHRvIHRoZSBiYWNrIG9mIGEgcXVldWUuICBJdCBpcyBzYWZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGZyb20KKyAqIHdpdGhpbiBhbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICoKKyAqIEl0ZW1zIGFyZSBxdWV1ZWQgYnkgY29weSBub3QgcmVmZXJlbmNlIHNvIGl0IGlzIHByZWZlcmFibGUgdG8gb25seQorICogcXVldWUgc21hbGwgaXRlbXMsIGVzcGVjaWFsbHkgd2hlbiBjYWxsZWQgZnJvbSBhbiBJU1IuICBJbiBtb3N0IGNhc2VzCisgKiBpdCB3b3VsZCBiZSBwcmVmZXJhYmxlIHRvIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgaXRlbSBiZWluZyBxdWV1ZWQuCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIHRvIHRoZSBxdWV1ZSBvbiB3aGljaCB0aGUgaXRlbSBpcyB0byBiZSBwb3N0ZWQuCisgKgorICogQHBhcmFtIHB2SXRlbVRvUXVldWUgQSBwb2ludGVyIHRvIHRoZSBpdGVtIHRoYXQgaXMgdG8gYmUgcGxhY2VkIG9uIHRoZQorICogcXVldWUuICBUaGUgc2l6ZSBvZiB0aGUgaXRlbXMgdGhlIHF1ZXVlIHdpbGwgaG9sZCB3YXMgZGVmaW5lZCB3aGVuIHRoZQorICogcXVldWUgd2FzIGNyZWF0ZWQsIHNvIHRoaXMgbWFueSBieXRlcyB3aWxsIGJlIGNvcGllZCBmcm9tIHB2SXRlbVRvUXVldWUKKyAqIGludG8gdGhlIHF1ZXVlIHN0b3JhZ2UgYXJlYS4KKyAqCisgKiBAcGFyYW0gcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB4UXVldWVTZW5kRnJvbUlTUigpIHdpbGwgc2V0CisgKiAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB0byBwZFRSVUUgaWYgc2VuZGluZyB0byB0aGUgcXVldWUgY2F1c2VkIGEgdGFzaworICogdG8gdW5ibG9jaywgYW5kIHRoZSB1bmJsb2NrZWQgdGFzayBoYXMgYSBwcmlvcml0eSBoaWdoZXIgdGhhbiB0aGUgY3VycmVudGx5CisgKiBydW5uaW5nIHRhc2suICBJZiB4UXVldWVTZW5kRnJvbUlTUigpIHNldHMgdGhpcyB2YWx1ZSB0byBwZFRSVUUgdGhlbgorICogYSBjb250ZXh0IHN3aXRjaCBzaG91bGQgYmUgcmVxdWVzdGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIGV4aXRlZC4KKyAqCisgKiBAcmV0dXJuIHBkVFJVRSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIHF1ZXVlLCBvdGhlcndpc2UKKyAqIGVyclFVRVVFX0ZVTEwuCisgKgorICogRXhhbXBsZSB1c2FnZSBmb3IgYnVmZmVyZWQgSU8gKHdoZXJlIHRoZSBJU1IgY2FuIG9idGFpbiBtb3JlIHRoYW4gb25lIHZhbHVlCisgKiBwZXIgY2FsbCk6CisgICA8cHJlPgorIHZvaWQgdkJ1ZmZlcklTUiggdm9pZCApCisgeworIGNoYXIgY0luOworIEJhc2VUeXBlX3QgeEhpZ2hlclByaW9yaXR5VGFza1dva2VuOworCisJLy8gV2UgaGF2ZSBub3Qgd29rZW4gYSB0YXNrIGF0IHRoZSBzdGFydCBvZiB0aGUgSVNSLgorCXhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkRkFMU0U7CisKKwkvLyBMb29wIHVudGlsIHRoZSBidWZmZXIgaXMgZW1wdHkuCisJZG8KKwl7CisJCS8vIE9idGFpbiBhIGJ5dGUgZnJvbSB0aGUgYnVmZmVyLgorCQljSW4gPSBwb3J0SU5QVVRfQllURSggUlhfUkVHSVNURVJfQUREUkVTUyApOworCisJCS8vIFBvc3QgdGhlIGJ5dGUuCisJCXhRdWV1ZVNlbmRGcm9tSVNSKCB4UnhRdWV1ZSwgJmNJbiwgJnhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworCisJfSB3aGlsZSggcG9ydElOUFVUX0JZVEUoIEJVRkZFUl9DT1VOVCApICk7CisKKwkvLyBOb3cgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBjYW4gc3dpdGNoIGNvbnRleHQgaWYgbmVjZXNzYXJ5LgorCWlmKCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKQorCXsKKwkJLy8gQWN0dWFsIG1hY3JvIHVzZWQgaGVyZSBpcyBwb3J0IHNwZWNpZmljLgorCQlwb3J0WUlFTERfRlJPTV9JU1IgKCk7CisJfQorIH0KKyA8L3ByZT4KKyAqCisgKiBcZGVmZ3JvdXAgeFF1ZXVlU2VuZEZyb21JU1IgeFF1ZXVlU2VuZEZyb21JU1IKKyAqIFxpbmdyb3VwIFF1ZXVlTWFuYWdlbWVudAorICovCisjZGVmaW5lIHhRdWV1ZVNlbmRGcm9tSVNSKCB4UXVldWUsIHB2SXRlbVRvUXVldWUsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSB4UXVldWVHZW5lcmljU2VuZEZyb21JU1IoICggeFF1ZXVlICksICggcHZJdGVtVG9RdWV1ZSApLCAoIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSwgcXVldWVTRU5EX1RPX0JBQ0sgKQorCisvKioKKyAqIHF1ZXVlLiBoCisgKiA8cHJlPgorIEJhc2VUeXBlX3QgeFF1ZXVlR2VuZXJpY1NlbmRGcm9tSVNSKAorCQkJCQkJCQkJCSAgIFF1ZXVlSGFuZGxlX3QJCXhRdWV1ZSwKKwkJCQkJCQkJCQkgICBjb25zdAl2b2lkCSpwdkl0ZW1Ub1F1ZXVlLAorCQkJCQkJCQkJCSAgIEJhc2VUeXBlX3QJKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4sCisJCQkJCQkJCQkJICAgQmFzZVR5cGVfdAl4Q29weVBvc2l0aW9uCisJCQkJCQkJCQkgICApOworIDwvcHJlPgorICoKKyAqIEl0IGlzIHByZWZlcnJlZCB0aGF0IHRoZSBtYWNyb3MgeFF1ZXVlU2VuZEZyb21JU1IoKSwKKyAqIHhRdWV1ZVNlbmRUb0Zyb250RnJvbUlTUigpIGFuZCB4UXVldWVTZW5kVG9CYWNrRnJvbUlTUigpIGJlIHVzZWQgaW4gcGxhY2UKKyAqIG9mIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4gIHhRdWV1ZUdpdmVGcm9tSVNSKCkgaXMgYW4KKyAqIGVxdWl2YWxlbnQgZm9yIHVzZSBieSBzZW1hcGhvcmVzIHRoYXQgZG9uJ3QgYWN0dWFsbHkgY29weSBhbnkgZGF0YS4KKyAqCisgKiBQb3N0IGFuIGl0ZW0gb24gYSBxdWV1ZS4gIEl0IGlzIHNhZmUgdG8gdXNlIHRoaXMgZnVuY3Rpb24gZnJvbSB3aXRoaW4gYW4KKyAqIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKgorICogSXRlbXMgYXJlIHF1ZXVlZCBieSBjb3B5IG5vdCByZWZlcmVuY2Ugc28gaXQgaXMgcHJlZmVyYWJsZSB0byBvbmx5CisgKiBxdWV1ZSBzbWFsbCBpdGVtcywgZXNwZWNpYWxseSB3aGVuIGNhbGxlZCBmcm9tIGFuIElTUi4gIEluIG1vc3QgY2FzZXMKKyAqIGl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8gc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBpdGVtIGJlaW5nIHF1ZXVlZC4KKyAqCisgKiBAcGFyYW0geFF1ZXVlIFRoZSBoYW5kbGUgdG8gdGhlIHF1ZXVlIG9uIHdoaWNoIHRoZSBpdGVtIGlzIHRvIGJlIHBvc3RlZC4KKyAqCisgKiBAcGFyYW0gcHZJdGVtVG9RdWV1ZSBBIHBvaW50ZXIgdG8gdGhlIGl0ZW0gdGhhdCBpcyB0byBiZSBwbGFjZWQgb24gdGhlCisgKiBxdWV1ZS4gIFRoZSBzaXplIG9mIHRoZSBpdGVtcyB0aGUgcXVldWUgd2lsbCBob2xkIHdhcyBkZWZpbmVkIHdoZW4gdGhlCisgKiBxdWV1ZSB3YXMgY3JlYXRlZCwgc28gdGhpcyBtYW55IGJ5dGVzIHdpbGwgYmUgY29waWVkIGZyb20gcHZJdGVtVG9RdWV1ZQorICogaW50byB0aGUgcXVldWUgc3RvcmFnZSBhcmVhLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHhRdWV1ZUdlbmVyaWNTZW5kRnJvbUlTUigpIHdpbGwgc2V0CisgKiAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB0byBwZFRSVUUgaWYgc2VuZGluZyB0byB0aGUgcXVldWUgY2F1c2VkIGEgdGFzaworICogdG8gdW5ibG9jaywgYW5kIHRoZSB1bmJsb2NrZWQgdGFzayBoYXMgYSBwcmlvcml0eSBoaWdoZXIgdGhhbiB0aGUgY3VycmVudGx5CisgKiBydW5uaW5nIHRhc2suICBJZiB4UXVldWVHZW5lcmljU2VuZEZyb21JU1IoKSBzZXRzIHRoaXMgdmFsdWUgdG8gcGRUUlVFIHRoZW4KKyAqIGEgY29udGV4dCBzd2l0Y2ggc2hvdWxkIGJlIHJlcXVlc3RlZCBiZWZvcmUgdGhlIGludGVycnVwdCBpcyBleGl0ZWQuCisgKgorICogQHBhcmFtIHhDb3B5UG9zaXRpb24gQ2FuIHRha2UgdGhlIHZhbHVlIHF1ZXVlU0VORF9UT19CQUNLIHRvIHBsYWNlIHRoZQorICogaXRlbSBhdCB0aGUgYmFjayBvZiB0aGUgcXVldWUsIG9yIHF1ZXVlU0VORF9UT19GUk9OVCB0byBwbGFjZSB0aGUgaXRlbQorICogYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZSAoZm9yIGhpZ2ggcHJpb3JpdHkgbWVzc2FnZXMpLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgcXVldWUsIG90aGVyd2lzZQorICogZXJyUVVFVUVfRlVMTC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlIGZvciBidWZmZXJlZCBJTyAod2hlcmUgdGhlIElTUiBjYW4gb2J0YWluIG1vcmUgdGhhbiBvbmUgdmFsdWUKKyAqIHBlciBjYWxsKToKKyAgIDxwcmU+Cisgdm9pZCB2QnVmZmVySVNSKCB2b2lkICkKKyB7CisgY2hhciBjSW47CisgQmFzZVR5cGVfdCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW5CeVBvc3Q7CisKKwkvLyBXZSBoYXZlIG5vdCB3b2tlbiBhIHRhc2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBJU1IuCisJeEhpZ2hlclByaW9yaXR5VGFza1dva2VuQnlQb3N0ID0gcGRGQUxTRTsKKworCS8vIExvb3AgdW50aWwgdGhlIGJ1ZmZlciBpcyBlbXB0eS4KKwlkbworCXsKKwkJLy8gT2J0YWluIGEgYnl0ZSBmcm9tIHRoZSBidWZmZXIuCisJCWNJbiA9IHBvcnRJTlBVVF9CWVRFKCBSWF9SRUdJU1RFUl9BRERSRVNTICk7CisKKwkJLy8gUG9zdCBlYWNoIGJ5dGUuCisJCXhRdWV1ZUdlbmVyaWNTZW5kRnJvbUlTUiggeFJ4UXVldWUsICZjSW4sICZ4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW5CeVBvc3QsIHF1ZXVlU0VORF9UT19CQUNLICk7CisKKwl9IHdoaWxlKCBwb3J0SU5QVVRfQllURSggQlVGRkVSX0NPVU5UICkgKTsKKworCS8vIE5vdyB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIGNhbiBzd2l0Y2ggY29udGV4dCBpZiBuZWNlc3NhcnkuICBOb3RlIHRoYXQgdGhlCisJLy8gbmFtZSBvZiB0aGUgeWllbGQgZnVuY3Rpb24gcmVxdWlyZWQgaXMgcG9ydCBzcGVjaWZpYy4KKwlpZiggeEhpZ2hlclByaW9yaXR5VGFza1dva2VuQnlQb3N0ICkKKwl7CisJCXRhc2tZSUVMRF9ZSUVMRF9GUk9NX0lTUigpOworCX0KKyB9CisgPC9wcmU+CisgKgorICogXGRlZmdyb3VwIHhRdWV1ZVNlbmRGcm9tSVNSIHhRdWV1ZVNlbmRGcm9tSVNSCisgKiBcaW5ncm91cCBRdWV1ZU1hbmFnZW1lbnQKKyAqLworQmFzZVR5cGVfdCB4UXVldWVHZW5lcmljU2VuZEZyb21JU1IoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICogY29uc3QgcHZJdGVtVG9RdWV1ZSwgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4sIGNvbnN0IEJhc2VUeXBlX3QgeENvcHlQb3NpdGlvbiApIFBSSVZJTEVHRURfRlVOQ1RJT047CitCYXNlVHlwZV90IHhRdWV1ZUdpdmVGcm9tSVNSKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHF1ZXVlLiBoCisgKiA8cHJlPgorIEJhc2VUeXBlX3QgeFF1ZXVlUmVjZWl2ZUZyb21JU1IoCisJCQkJCQkJCQkgICBRdWV1ZUhhbmRsZV90CXhRdWV1ZSwKKwkJCQkJCQkJCSAgIHZvaWQJKnB2QnVmZmVyLAorCQkJCQkJCQkJICAgQmFzZVR5cGVfdCAqcHhUYXNrV29rZW4KKwkJCQkJCQkJICAgKTsKKyAqIDwvcHJlPgorICoKKyAqIFJlY2VpdmUgYW4gaXRlbSBmcm9tIGEgcXVldWUuICBJdCBpcyBzYWZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGZyb20gd2l0aGluIGFuCisgKiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICoKKyAqIEBwYXJhbSB4UXVldWUgVGhlIGhhbmRsZSB0byB0aGUgcXVldWUgZnJvbSB3aGljaCB0aGUgaXRlbSBpcyB0byBiZQorICogcmVjZWl2ZWQuCisgKgorICogQHBhcmFtIHB2QnVmZmVyIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSByZWNlaXZlZCBpdGVtIHdpbGwKKyAqIGJlIGNvcGllZC4KKyAqCisgKiBAcGFyYW0gcHhUYXNrV29rZW4gQSB0YXNrIG1heSBiZSBibG9ja2VkIHdhaXRpbmcgZm9yIHNwYWNlIHRvIGJlY29tZQorICogYXZhaWxhYmxlIG9uIHRoZSBxdWV1ZS4gIElmIHhRdWV1ZVJlY2VpdmVGcm9tSVNSIGNhdXNlcyBzdWNoIGEgdGFzayB0bworICogdW5ibG9jayAqcHhUYXNrV29rZW4gd2lsbCBnZXQgc2V0IHRvIHBkVFJVRSwgb3RoZXJ3aXNlICpweFRhc2tXb2tlbiB3aWxsCisgKiByZW1haW4gdW5jaGFuZ2VkLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIGFuIGl0ZW0gd2FzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBmcm9tIHRoZSBxdWV1ZSwKKyAqIG90aGVyd2lzZSBwZEZBTFNFLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorCisgUXVldWVIYW5kbGVfdCB4UXVldWU7CisKKyAvLyBGdW5jdGlvbiB0byBjcmVhdGUgYSBxdWV1ZSBhbmQgcG9zdCBzb21lIHZhbHVlcy4KKyB2b2lkIHZBRnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisgeworIGNoYXIgY1ZhbHVlVG9Qb3N0OworIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ID0gKCBUaWNrVHlwZV90ICkweGZmOworCisJLy8gQ3JlYXRlIGEgcXVldWUgY2FwYWJsZSBvZiBjb250YWluaW5nIDEwIGNoYXJhY3RlcnMuCisJeFF1ZXVlID0geFF1ZXVlQ3JlYXRlKCAxMCwgc2l6ZW9mKCBjaGFyICkgKTsKKwlpZiggeFF1ZXVlID09IDAgKQorCXsKKwkJLy8gRmFpbGVkIHRvIGNyZWF0ZSB0aGUgcXVldWUuCisJfQorCisJLy8gLi4uCisKKwkvLyBQb3N0IHNvbWUgY2hhcmFjdGVycyB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoaW4gYW4gSVNSLiAgSWYgdGhlIHF1ZXVlCisJLy8gaXMgZnVsbCB0aGVuIHRoaXMgdGFzayB3aWxsIGJsb2NrIGZvciB4VGlja3NUb1dhaXQgdGlja3MuCisJY1ZhbHVlVG9Qb3N0ID0gJ2EnOworCXhRdWV1ZVNlbmQoIHhRdWV1ZSwgKCB2b2lkICogKSAmY1ZhbHVlVG9Qb3N0LCB4VGlja3NUb1dhaXQgKTsKKwljVmFsdWVUb1Bvc3QgPSAnYic7CisJeFF1ZXVlU2VuZCggeFF1ZXVlLCAoIHZvaWQgKiApICZjVmFsdWVUb1Bvc3QsIHhUaWNrc1RvV2FpdCApOworCisJLy8gLi4uIGtlZXAgcG9zdGluZyBjaGFyYWN0ZXJzIC4uLiB0aGlzIHRhc2sgbWF5IGJsb2NrIHdoZW4gdGhlIHF1ZXVlCisJLy8gYmVjb21lcyBmdWxsLgorCisJY1ZhbHVlVG9Qb3N0ID0gJ2MnOworCXhRdWV1ZVNlbmQoIHhRdWV1ZSwgKCB2b2lkICogKSAmY1ZhbHVlVG9Qb3N0LCB4VGlja3NUb1dhaXQgKTsKKyB9CisKKyAvLyBJU1IgdGhhdCBvdXRwdXRzIGFsbCB0aGUgY2hhcmFjdGVycyByZWNlaXZlZCBvbiB0aGUgcXVldWUuCisgdm9pZCB2SVNSX1JvdXRpbmUoIHZvaWQgKQorIHsKKyBCYXNlVHlwZV90IHhUYXNrV29rZW5CeVJlY2VpdmUgPSBwZEZBTFNFOworIGNoYXIgY1J4ZWRDaGFyOworCisJd2hpbGUoIHhRdWV1ZVJlY2VpdmVGcm9tSVNSKCB4UXVldWUsICggdm9pZCAqICkgJmNSeGVkQ2hhciwgJnhUYXNrV29rZW5CeVJlY2VpdmUpICkKKwl7CisJCS8vIEEgY2hhcmFjdGVyIHdhcyByZWNlaXZlZC4gIE91dHB1dCB0aGUgY2hhcmFjdGVyIG5vdy4KKwkJdk91dHB1dENoYXJhY3RlciggY1J4ZWRDaGFyICk7CisKKwkJLy8gSWYgcmVtb3ZpbmcgdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBxdWV1ZSB3b2tlIHRoZSB0YXNrIHRoYXQgd2FzCisJCS8vIHBvc3Rpbmcgb250byB0aGUgcXVldWUgY1Rhc2tXb2tlbkJ5UmVjZWl2ZSB3aWxsIGhhdmUgYmVlbiBzZXQgdG8KKwkJLy8gcGRUUlVFLiAgTm8gbWF0dGVyIGhvdyBtYW55IHRpbWVzIHRoaXMgbG9vcCBpdGVyYXRlcyBvbmx5IG9uZQorCQkvLyB0YXNrIHdpbGwgYmUgd29rZW4uCisJfQorCisJaWYoIGNUYXNrV29rZW5CeVBvc3QgIT0gKCBjaGFyICkgcGRGQUxTRTsKKwl7CisJCXRhc2tZSUVMRCAoKTsKKwl9CisgfQorIDwvcHJlPgorICogXGRlZmdyb3VwIHhRdWV1ZVJlY2VpdmVGcm9tSVNSIHhRdWV1ZVJlY2VpdmVGcm9tSVNSCisgKiBcaW5ncm91cCBRdWV1ZU1hbmFnZW1lbnQKKyAqLworQmFzZVR5cGVfdCB4UXVldWVSZWNlaXZlRnJvbUlTUiggUXVldWVIYW5kbGVfdCB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogVXRpbGl0aWVzIHRvIHF1ZXJ5IHF1ZXVlcyB0aGF0IGFyZSBzYWZlIHRvIHVzZSBmcm9tIGFuIElTUi4gIFRoZXNlIHV0aWxpdGllcworICogc2hvdWxkIGJlIHVzZWQgb25seSBmcm9tIHdpdGluIGFuIElTUiwgb3Igd2l0aGluIGEgY3JpdGljYWwgc2VjdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UXVldWVJc1F1ZXVlRW1wdHlGcm9tSVNSKCBjb25zdCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CitCYXNlVHlwZV90IHhRdWV1ZUlzUXVldWVGdWxsRnJvbUlTUiggY29uc3QgUXVldWVIYW5kbGVfdCB4UXVldWUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworVUJhc2VUeXBlX3QgdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZ0Zyb21JU1IoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFRoZSBmdW5jdGlvbnMgZGVmaW5lZCBhYm92ZSBhcmUgZm9yIHBhc3NpbmcgZGF0YSB0byBhbmQgZnJvbSB0YXNrcy4gIFRoZQorICogZnVuY3Rpb25zIGJlbG93IGFyZSB0aGUgZXF1aXZhbGVudHMgZm9yIHBhc3NpbmcgZGF0YSB0byBhbmQgZnJvbQorICogY28tcm91dGluZXMuCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSB0aGUgY28tcm91dGluZSBtYWNybyBpbXBsZW1lbnRhdGlvbiBhbmQKKyAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gYXBwbGljYXRpb24gY29kZS4gIEluc3RlYWQgdXNlIHRoZSBtYWNybworICogd3JhcHBlcnMgZGVmaW5lZCB3aXRoaW4gY3JvdXRpbmUuaC4KKyAqLworQmFzZVR5cGVfdCB4UXVldWVDUlNlbmRGcm9tSVNSKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgY29uc3Qgdm9pZCAqcHZJdGVtVG9RdWV1ZSwgQmFzZVR5cGVfdCB4Q29Sb3V0aW5lUHJldmlvdXNseVdva2VuICk7CitCYXNlVHlwZV90IHhRdWV1ZUNSUmVjZWl2ZUZyb21JU1IoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCB2b2lkICpwdkJ1ZmZlciwgQmFzZVR5cGVfdCAqcHhUYXNrV29rZW4gKTsKK0Jhc2VUeXBlX3QgeFF1ZXVlQ1JTZW5kKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgY29uc3Qgdm9pZCAqcHZJdGVtVG9RdWV1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKK0Jhc2VUeXBlX3QgeFF1ZXVlQ1JSZWNlaXZlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgdm9pZCAqcHZCdWZmZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7CisKKy8qCisgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBVc2UgeFNlbWFwaG9yZUNyZWF0ZU11dGV4KCksCisgKiB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoKSBvciB4U2VtYXBob3JlR2V0TXV0ZXhIb2xkZXIoKSBpbnN0ZWFkIG9mIGNhbGxpbmcKKyAqIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseS4KKyAqLworUXVldWVIYW5kbGVfdCB4UXVldWVDcmVhdGVNdXRleCggY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CitRdWV1ZUhhbmRsZV90IHhRdWV1ZUNyZWF0ZU11dGV4U3RhdGljKCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlLCBTdGF0aWNRdWV1ZV90ICpweFN0YXRpY1F1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK1F1ZXVlSGFuZGxlX3QgeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmUoIGNvbnN0IFVCYXNlVHlwZV90IHV4TWF4Q291bnQsIGNvbnN0IFVCYXNlVHlwZV90IHV4SW5pdGlhbENvdW50ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK1F1ZXVlSGFuZGxlX3QgeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmVTdGF0aWMoIGNvbnN0IFVCYXNlVHlwZV90IHV4TWF4Q291bnQsIGNvbnN0IFVCYXNlVHlwZV90IHV4SW5pdGlhbENvdW50LCBTdGF0aWNRdWV1ZV90ICpweFN0YXRpY1F1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK0Jhc2VUeXBlX3QgeFF1ZXVlU2VtYXBob3JlVGFrZSggUXVldWVIYW5kbGVfdCB4UXVldWUsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK3ZvaWQqIHhRdWV1ZUdldE11dGV4SG9sZGVyKCBRdWV1ZUhhbmRsZV90IHhTZW1hcGhvcmUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwordm9pZCogeFF1ZXVlR2V0TXV0ZXhIb2xkZXJGcm9tSVNSKCBRdWV1ZUhhbmRsZV90IHhTZW1hcGhvcmUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogRm9yIGludGVybmFsIHVzZSBvbmx5LiAgVXNlIHhTZW1hcGhvcmVUYWtlTXV0ZXhSZWN1cnNpdmUoKSBvcgorICogeFNlbWFwaG9yZUdpdmVNdXRleFJlY3Vyc2l2ZSgpIGluc3RlYWQgb2YgY2FsbGluZyB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkuCisgKi8KK0Jhc2VUeXBlX3QgeFF1ZXVlVGFrZU11dGV4UmVjdXJzaXZlKCBRdWV1ZUhhbmRsZV90IHhNdXRleCwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworQmFzZVR5cGVfdCB4UXVldWVHaXZlTXV0ZXhSZWN1cnNpdmUoIFF1ZXVlSGFuZGxlX3QgcHhNdXRleCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBSZXNldCBhIHF1ZXVlIGJhY2sgdG8gaXRzIG9yaWdpbmFsIGVtcHR5IHN0YXRlLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBub3cKKyAqIG9ic29sZXRlIGFuZCBpcyBhbHdheXMgc2V0IHRvIHBkUEFTUy4KKyAqLworI2RlZmluZSB4UXVldWVSZXNldCggeFF1ZXVlICkgeFF1ZXVlR2VuZXJpY1Jlc2V0KCB4UXVldWUsIHBkRkFMU0UgKQorCisvKgorICogVGhlIHJlZ2lzdHJ5IGlzIHByb3ZpZGVkIGFzIGEgbWVhbnMgZm9yIGtlcm5lbCBhd2FyZSBkZWJ1Z2dlcnMgdG8KKyAqIGxvY2F0ZSBxdWV1ZXMsIHNlbWFwaG9yZXMgYW5kIG11dGV4ZXMuICBDYWxsIHZRdWV1ZUFkZFRvUmVnaXN0cnkoKSBhZGQKKyAqIGEgcXVldWUsIHNlbWFwaG9yZSBvciBtdXRleCBoYW5kbGUgdG8gdGhlIHJlZ2lzdHJ5IGlmIHlvdSB3YW50IHRoZSBoYW5kbGUKKyAqIHRvIGJlIGF2YWlsYWJsZSB0byBhIGtlcm5lbCBhd2FyZSBkZWJ1Z2dlci4gIElmIHlvdSBhcmUgbm90IHVzaW5nIGEga2VybmVsCisgKiBhd2FyZSBkZWJ1Z2dlciB0aGVuIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGlnbm9yZWQuCisgKgorICogY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSBkZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBoYW5kbGVzIHRoZQorICogcmVnaXN0cnkgY2FuIGhvbGQuICBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAKKyAqIHdpdGhpbiBGcmVlUlRPU0NvbmZpZy5oIGZvciB0aGUgcmVnaXN0cnkgdG8gYmUgYXZhaWxhYmxlLiAgSXRzIHZhbHVlCisgKiBkb2VzIG5vdCBlZmZlY3QgdGhlIG51bWJlciBvZiBxdWV1ZXMsIHNlbWFwaG9yZXMgYW5kIG11dGV4ZXMgdGhhdCBjYW4gYmUKKyAqIGNyZWF0ZWQgLSBqdXN0IHRoZSBudW1iZXIgdGhhdCB0aGUgcmVnaXN0cnkgY2FuIGhvbGQuCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIG9mIHRoZSBxdWV1ZSBiZWluZyBhZGRlZCB0byB0aGUgcmVnaXN0cnkuICBUaGlzCisgKiBpcyB0aGUgaGFuZGxlIHJldHVybmVkIGJ5IGEgY2FsbCB0byB4UXVldWVDcmVhdGUoKS4gIFNlbWFwaG9yZSBhbmQgbXV0ZXgKKyAqIGhhbmRsZXMgY2FuIGFsc28gYmUgcGFzc2VkIGluIGhlcmUuCisgKgorICogQHBhcmFtIHBjTmFtZSBUaGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZS4gIFRoaXMgaXMgdGhlCisgKiBuYW1lIHRoYXQgdGhlIGtlcm5lbCBhd2FyZSBkZWJ1Z2dlciB3aWxsIGRpc3BsYXkuICBUaGUgcXVldWUgcmVnaXN0cnkgb25seQorICogc3RvcmVzIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIC0gc28gdGhlIHN0cmluZyBtdXN0IGJlIHBlcnNpc3RlbnQgKGdsb2JhbCBvcgorICogcHJlZmVyYWJseSBpbiBST00vRmxhc2gpLCBub3Qgb24gdGhlIHN0YWNrLgorICovCisjaWYoIGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwICkKKwl2b2lkIHZRdWV1ZUFkZFRvUmVnaXN0cnkoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCBjaGFyICpwY05hbWUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOyAvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KKyNlbmRpZgorCisvKgorICogVGhlIHJlZ2lzdHJ5IGlzIHByb3ZpZGVkIGFzIGEgbWVhbnMgZm9yIGtlcm5lbCBhd2FyZSBkZWJ1Z2dlcnMgdG8KKyAqIGxvY2F0ZSBxdWV1ZXMsIHNlbWFwaG9yZXMgYW5kIG11dGV4ZXMuICBDYWxsIHZRdWV1ZUFkZFRvUmVnaXN0cnkoKSBhZGQKKyAqIGEgcXVldWUsIHNlbWFwaG9yZSBvciBtdXRleCBoYW5kbGUgdG8gdGhlIHJlZ2lzdHJ5IGlmIHlvdSB3YW50IHRoZSBoYW5kbGUKKyAqIHRvIGJlIGF2YWlsYWJsZSB0byBhIGtlcm5lbCBhd2FyZSBkZWJ1Z2dlciwgYW5kIHZRdWV1ZVVucmVnaXN0ZXJRdWV1ZSgpIHRvCisgKiByZW1vdmUgdGhlIHF1ZXVlLCBzZW1hcGhvcmUgb3IgbXV0ZXggZnJvbSB0aGUgcmVnaXN0ZXIuICBJZiB5b3UgYXJlIG5vdCB1c2luZworICogYSBrZXJuZWwgYXdhcmUgZGVidWdnZXIgdGhlbiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBpZ25vcmVkLgorICoKKyAqIEBwYXJhbSB4UXVldWUgVGhlIGhhbmRsZSBvZiB0aGUgcXVldWUgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSByZWdpc3RyeS4KKyAqLworI2lmKCBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFID4gMCApCisJdm9pZCB2UXVldWVVbnJlZ2lzdGVyUXVldWUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZgorCisvKgorICogVGhlIHF1ZXVlIHJlZ2lzdHJ5IGlzIHByb3ZpZGVkIGFzIGEgbWVhbnMgZm9yIGtlcm5lbCBhd2FyZSBkZWJ1Z2dlcnMgdG8KKyAqIGxvY2F0ZSBxdWV1ZXMsIHNlbWFwaG9yZXMgYW5kIG11dGV4ZXMuICBDYWxsIHBjUXVldWVHZXROYW1lKCkgdG8gbG9vaworICogdXAgYW5kIHJldHVybiB0aGUgbmFtZSBvZiBhIHF1ZXVlIGluIHRoZSBxdWV1ZSByZWdpc3RyeSBmcm9tIHRoZSBxdWV1ZSdzCisgKiBoYW5kbGUuCisgKgorICogQHBhcmFtIHhRdWV1ZSBUaGUgaGFuZGxlIG9mIHRoZSBxdWV1ZSB0aGUgbmFtZSBvZiB3aGljaCB3aWxsIGJlIHJldHVybmVkLgorICogQHJldHVybiBJZiB0aGUgcXVldWUgaXMgaW4gdGhlIHJlZ2lzdHJ5IHRoZW4gYSBwb2ludGVyIHRvIHRoZSBuYW1lIG9mIHRoZQorICogcXVldWUgaXMgcmV0dXJuZWQuICBJZiB0aGUgcXVldWUgaXMgbm90IGluIHRoZSByZWdpc3RyeSB0aGVuIE5VTEwgaXMKKyAqIHJldHVybmVkLgorICovCisjaWYoIGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwICkKKwljb25zdCBjaGFyICpwY1F1ZXVlR2V0TmFtZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOyAvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KKyNlbmRpZgorCisvKgorICogR2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGNyZWFldCBhIHF1ZXVlIHVzaW5nIGR5bmFtaWMgbWVtb3J5CisgKiBhbGxvY2F0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYnkgb3RoZXIgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdGhhdCBjcmVhdGUgb3RoZXIKKyAqIFJUT1Mgb2JqZWN0cyB0aGF0IHVzZSB0aGUgcXVldWUgc3RydWN0dXJlIGFzIHRoZWlyIGJhc2UuCisgKi8KKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisJUXVldWVIYW5kbGVfdCB4UXVldWVHZW5lcmljQ3JlYXRlKCBjb25zdCBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLCBjb25zdCBVQmFzZVR5cGVfdCB1eEl0ZW1TaXplLCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZgorCisvKgorICogR2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGNyZWFldCBhIHF1ZXVlIHVzaW5nIGR5bmFtaWMgbWVtb3J5CisgKiBhbGxvY2F0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYnkgb3RoZXIgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdGhhdCBjcmVhdGUgb3RoZXIKKyAqIFJUT1Mgb2JqZWN0cyB0aGF0IHVzZSB0aGUgcXVldWUgc3RydWN0dXJlIGFzIHRoZWlyIGJhc2UuCisgKi8KKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKwlRdWV1ZUhhbmRsZV90IHhRdWV1ZUdlbmVyaWNDcmVhdGVTdGF0aWMoIGNvbnN0IFVCYXNlVHlwZV90IHV4UXVldWVMZW5ndGgsIGNvbnN0IFVCYXNlVHlwZV90IHV4SXRlbVNpemUsIHVpbnQ4X3QgKnB1Y1F1ZXVlU3RvcmFnZSwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSwgY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYKKworLyoKKyAqIFF1ZXVlIHNldHMgcHJvdmlkZSBhIG1lY2hhbmlzbSB0byBhbGxvdyBhIHRhc2sgdG8gYmxvY2sgKHBlbmQpIG9uIGEgcmVhZAorICogb3BlcmF0aW9uIGZyb20gbXVsdGlwbGUgcXVldWVzIG9yIHNlbWFwaG9yZXMgc2ltdWx0YW5lb3VzbHkuCisgKgorICogU2VlIEZyZWVSVE9TL1NvdXJjZS9EZW1vL0NvbW1vbi9NaW5pbWFsL1F1ZXVlU2V0LmMgZm9yIGFuIGV4YW1wbGUgdXNpbmcgdGhpcworICogZnVuY3Rpb24uCisgKgorICogQSBxdWV1ZSBzZXQgbXVzdCBiZSBleHBsaWNpdGx5IGNyZWF0ZWQgdXNpbmcgYSBjYWxsIHRvIHhRdWV1ZUNyZWF0ZVNldCgpCisgKiBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuICBPbmNlIGNyZWF0ZWQsIHN0YW5kYXJkIEZyZWVSVE9TIHF1ZXVlcyBhbmQgc2VtYXBob3JlcworICogY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXQgdXNpbmcgY2FsbHMgdG8geFF1ZXVlQWRkVG9TZXQoKS4KKyAqIHhRdWV1ZVNlbGVjdEZyb21TZXQoKSBpcyB0aGVuIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoLCBpZiBhbnksIG9mIHRoZSBxdWV1ZXMKKyAqIG9yIHNlbWFwaG9yZXMgY29udGFpbmVkIGluIHRoZSBzZXQgaXMgaW4gYSBzdGF0ZSB3aGVyZSBhIHF1ZXVlIHJlYWQgb3IKKyAqIHNlbWFwaG9yZSB0YWtlIG9wZXJhdGlvbiB3b3VsZCBiZSBzdWNjZXNzZnVsLgorICoKKyAqIE5vdGUgMTogIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBodHRwOi8vd3d3RnJlZVJUT1Mub3JnL1JUT1MtcXVldWUtc2V0cy5odG1sCisgKiBmb3IgcmVhc29ucyB3aHkgcXVldWUgc2V0cyBhcmUgdmVyeSByYXJlbHkgbmVlZGVkIGluIHByYWN0aWNlIGFzIHRoZXJlIGFyZQorICogc2ltcGxlciBtZXRob2RzIG9mIGJsb2NraW5nIG9uIG11bHRpcGxlIG9iamVjdHMuCisgKgorICogTm90ZSAyOiAgQmxvY2tpbmcgb24gYSBxdWV1ZSBzZXQgdGhhdCBjb250YWlucyBhIG11dGV4IHdpbGwgbm90IGNhdXNlIHRoZQorICogbXV0ZXggaG9sZGVyIHRvIGluaGVyaXQgdGhlIHByaW9yaXR5IG9mIHRoZSBibG9ja2VkIHRhc2suCisgKgorICogTm90ZSAzOiAgQW4gYWRkaXRpb25hbCA0IGJ5dGVzIG9mIFJBTSBpcyByZXF1aXJlZCBmb3IgZWFjaCBzcGFjZSBpbiBhIGV2ZXJ5CisgKiBxdWV1ZSBhZGRlZCB0byBhIHF1ZXVlIHNldC4gIFRoZXJlZm9yZSBjb3VudGluZyBzZW1hcGhvcmVzIHRoYXQgaGF2ZSBhIGhpZ2gKKyAqIG1heGltdW0gY291bnQgdmFsdWUgc2hvdWxkIG5vdCBiZSBhZGRlZCB0byBhIHF1ZXVlIHNldC4KKyAqCisgKiBOb3RlIDQ6ICBBIHJlY2VpdmUgKGluIHRoZSBjYXNlIG9mIGEgcXVldWUpIG9yIHRha2UgKGluIHRoZSBjYXNlIG9mIGEKKyAqIHNlbWFwaG9yZSkgb3BlcmF0aW9uIG11c3Qgbm90IGJlIHBlcmZvcm1lZCBvbiBhIG1lbWJlciBvZiBhIHF1ZXVlIHNldCB1bmxlc3MKKyAqIGEgY2FsbCB0byB4UXVldWVTZWxlY3RGcm9tU2V0KCkgaGFzIGZpcnN0IHJldHVybmVkIGEgaGFuZGxlIHRvIHRoYXQgc2V0IG1lbWJlci4KKyAqCisgKiBAcGFyYW0gdXhFdmVudFF1ZXVlTGVuZ3RoIFF1ZXVlIHNldHMgc3RvcmUgZXZlbnRzIHRoYXQgb2NjdXIgb24KKyAqIHRoZSBxdWV1ZXMgYW5kIHNlbWFwaG9yZXMgY29udGFpbmVkIGluIHRoZSBzZXQuICB1eEV2ZW50UXVldWVMZW5ndGggc3BlY2lmaWVzCisgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXZlbnRzIHRoYXQgY2FuIGJlIHF1ZXVlZCBhdCBvbmNlLiAgVG8gYmUgYWJzb2x1dGVseQorICogY2VydGFpbiB0aGF0IGV2ZW50cyBhcmUgbm90IGxvc3QgdXhFdmVudFF1ZXVlTGVuZ3RoIHNob3VsZCBiZSBzZXQgdG8gdGhlCisgKiB0b3RhbCBzdW0gb2YgdGhlIGxlbmd0aCBvZiB0aGUgcXVldWVzIGFkZGVkIHRvIHRoZSBzZXQsIHdoZXJlIGJpbmFyeQorICogc2VtYXBob3JlcyBhbmQgbXV0ZXhlcyBoYXZlIGEgbGVuZ3RoIG9mIDEsIGFuZCBjb3VudGluZyBzZW1hcGhvcmVzIGhhdmUgYQorICogbGVuZ3RoIHNldCBieSB0aGVpciBtYXhpbXVtIGNvdW50IHZhbHVlLiAgRXhhbXBsZXM6CisgKiAgKyBJZiBhIHF1ZXVlIHNldCBpcyB0byBob2xkIGEgcXVldWUgb2YgbGVuZ3RoIDUsIGFub3RoZXIgcXVldWUgb2YgbGVuZ3RoIDEyLAorICogICAgYW5kIGEgYmluYXJ5IHNlbWFwaG9yZSwgdGhlbiB1eEV2ZW50UXVldWVMZW5ndGggc2hvdWxkIGJlIHNldCB0bworICogICAgKDUgKyAxMiArIDEpLCBvciAxOC4KKyAqICArIElmIGEgcXVldWUgc2V0IGlzIHRvIGhvbGQgdGhyZWUgYmluYXJ5IHNlbWFwaG9yZXMgdGhlbiB1eEV2ZW50UXVldWVMZW5ndGgKKyAqICAgIHNob3VsZCBiZSBzZXQgdG8gKDEgKyAxICsgMSApLCBvciAzLgorICogICsgSWYgYSBxdWV1ZSBzZXQgaXMgdG8gaG9sZCBhIGNvdW50aW5nIHNlbWFwaG9yZSB0aGF0IGhhcyBhIG1heGltdW0gY291bnQgb2YKKyAqICAgIDUsIGFuZCBhIGNvdW50aW5nIHNlbWFwaG9yZSB0aGF0IGhhcyBhIG1heGltdW0gY291bnQgb2YgMywgdGhlbgorICogICAgdXhFdmVudFF1ZXVlTGVuZ3RoIHNob3VsZCBiZSBzZXQgdG8gKDUgKyAzKSwgb3IgOC4KKyAqCisgKiBAcmV0dXJuIElmIHRoZSBxdWV1ZSBzZXQgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkgdGhlbiBhIGhhbmRsZSB0byB0aGUgY3JlYXRlZAorICogcXVldWUgc2V0IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuCisgKi8KK1F1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlQ3JlYXRlU2V0KCBjb25zdCBVQmFzZVR5cGVfdCB1eEV2ZW50UXVldWVMZW5ndGggKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogQWRkcyBhIHF1ZXVlIG9yIHNlbWFwaG9yZSB0byBhIHF1ZXVlIHNldCB0aGF0IHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgYQorICogY2FsbCB0byB4UXVldWVDcmVhdGVTZXQoKS4KKyAqCisgKiBTZWUgRnJlZVJUT1MvU291cmNlL0RlbW8vQ29tbW9uL01pbmltYWwvUXVldWVTZXQuYyBmb3IgYW4gZXhhbXBsZSB1c2luZyB0aGlzCisgKiBmdW5jdGlvbi4KKyAqCisgKiBOb3RlIDE6ICBBIHJlY2VpdmUgKGluIHRoZSBjYXNlIG9mIGEgcXVldWUpIG9yIHRha2UgKGluIHRoZSBjYXNlIG9mIGEKKyAqIHNlbWFwaG9yZSkgb3BlcmF0aW9uIG11c3Qgbm90IGJlIHBlcmZvcm1lZCBvbiBhIG1lbWJlciBvZiBhIHF1ZXVlIHNldCB1bmxlc3MKKyAqIGEgY2FsbCB0byB4UXVldWVTZWxlY3RGcm9tU2V0KCkgaGFzIGZpcnN0IHJldHVybmVkIGEgaGFuZGxlIHRvIHRoYXQgc2V0IG1lbWJlci4KKyAqCisgKiBAcGFyYW0geFF1ZXVlT3JTZW1hcGhvcmUgVGhlIGhhbmRsZSBvZiB0aGUgcXVldWUgb3Igc2VtYXBob3JlIGJlaW5nIGFkZGVkIHRvCisgKiB0aGUgcXVldWUgc2V0IChjYXN0IHRvIGFuIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgdHlwZSkuCisgKgorICogQHBhcmFtIHhRdWV1ZVNldCBUaGUgaGFuZGxlIG9mIHRoZSBxdWV1ZSBzZXQgdG8gd2hpY2ggdGhlIHF1ZXVlIG9yIHNlbWFwaG9yZQorICogaXMgYmVpbmcgYWRkZWQuCisgKgorICogQHJldHVybiBJZiB0aGUgcXVldWUgb3Igc2VtYXBob3JlIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQgdG8gdGhlIHF1ZXVlIHNldAorICogdGhlbiBwZFBBU1MgaXMgcmV0dXJuZWQuICBJZiB0aGUgcXVldWUgY291bGQgbm90IGJlIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGUKKyAqIHF1ZXVlIHNldCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgYSBtZW1iZXIgb2YgYSBkaWZmZXJlbnQgcXVldWUgc2V0IHRoZW4gcGRGQUlMCisgKiBpcyByZXR1cm5lZC4KKyAqLworQmFzZVR5cGVfdCB4UXVldWVBZGRUb1NldCggUXVldWVTZXRNZW1iZXJIYW5kbGVfdCB4UXVldWVPclNlbWFwaG9yZSwgUXVldWVTZXRIYW5kbGVfdCB4UXVldWVTZXQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogUmVtb3ZlcyBhIHF1ZXVlIG9yIHNlbWFwaG9yZSBmcm9tIGEgcXVldWUgc2V0LiAgQSBxdWV1ZSBvciBzZW1hcGhvcmUgY2FuIG9ubHkKKyAqIGJlIHJlbW92ZWQgZnJvbSBhIHNldCBpZiB0aGUgcXVldWUgb3Igc2VtYXBob3JlIGlzIGVtcHR5LgorICoKKyAqIFNlZSBGcmVlUlRPUy9Tb3VyY2UvRGVtby9Db21tb24vTWluaW1hbC9RdWV1ZVNldC5jIGZvciBhbiBleGFtcGxlIHVzaW5nIHRoaXMKKyAqIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB4UXVldWVPclNlbWFwaG9yZSBUaGUgaGFuZGxlIG9mIHRoZSBxdWV1ZSBvciBzZW1hcGhvcmUgYmVpbmcgcmVtb3ZlZAorICogZnJvbSB0aGUgcXVldWUgc2V0IChjYXN0IHRvIGFuIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgdHlwZSkuCisgKgorICogQHBhcmFtIHhRdWV1ZVNldCBUaGUgaGFuZGxlIG9mIHRoZSBxdWV1ZSBzZXQgaW4gd2hpY2ggdGhlIHF1ZXVlIG9yIHNlbWFwaG9yZQorICogaXMgaW5jbHVkZWQuCisgKgorICogQHJldHVybiBJZiB0aGUgcXVldWUgb3Igc2VtYXBob3JlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBzZXQKKyAqIHRoZW4gcGRQQVNTIGlzIHJldHVybmVkLiAgSWYgdGhlIHF1ZXVlIHdhcyBub3QgaW4gdGhlIHF1ZXVlIHNldCwgb3IgdGhlCisgKiBxdWV1ZSAob3Igc2VtYXBob3JlKSB3YXMgbm90IGVtcHR5LCB0aGVuIHBkRkFJTCBpcyByZXR1cm5lZC4KKyAqLworQmFzZVR5cGVfdCB4UXVldWVSZW1vdmVGcm9tU2V0KCBRdWV1ZVNldE1lbWJlckhhbmRsZV90IHhRdWV1ZU9yU2VtYXBob3JlLCBRdWV1ZVNldEhhbmRsZV90IHhRdWV1ZVNldCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiB4UXVldWVTZWxlY3RGcm9tU2V0KCkgc2VsZWN0cyBmcm9tIHRoZSBtZW1iZXJzIG9mIGEgcXVldWUgc2V0IGEgcXVldWUgb3IKKyAqIHNlbWFwaG9yZSB0aGF0IGVpdGhlciBjb250YWlucyBkYXRhIChpbiB0aGUgY2FzZSBvZiBhIHF1ZXVlKSBvciBpcyBhdmFpbGFibGUKKyAqIHRvIHRha2UgKGluIHRoZSBjYXNlIG9mIGEgc2VtYXBob3JlKS4gIHhRdWV1ZVNlbGVjdEZyb21TZXQoKSBlZmZlY3RpdmVseQorICogYWxsb3dzIGEgdGFzayB0byBibG9jayAocGVuZCkgb24gYSByZWFkIG9wZXJhdGlvbiBvbiBhbGwgdGhlIHF1ZXVlcyBhbmQKKyAqIHNlbWFwaG9yZXMgaW4gYSBxdWV1ZSBzZXQgc2ltdWx0YW5lb3VzbHkuCisgKgorICogU2VlIEZyZWVSVE9TL1NvdXJjZS9EZW1vL0NvbW1vbi9NaW5pbWFsL1F1ZXVlU2V0LmMgZm9yIGFuIGV4YW1wbGUgdXNpbmcgdGhpcworICogZnVuY3Rpb24uCisgKgorICogTm90ZSAxOiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGh0dHA6Ly93d3dGcmVlUlRPUy5vcmcvUlRPUy1xdWV1ZS1zZXRzLmh0bWwKKyAqIGZvciByZWFzb25zIHdoeSBxdWV1ZSBzZXRzIGFyZSB2ZXJ5IHJhcmVseSBuZWVkZWQgaW4gcHJhY3RpY2UgYXMgdGhlcmUgYXJlCisgKiBzaW1wbGVyIG1ldGhvZHMgb2YgYmxvY2tpbmcgb24gbXVsdGlwbGUgb2JqZWN0cy4KKyAqCisgKiBOb3RlIDI6ICBCbG9ja2luZyBvbiBhIHF1ZXVlIHNldCB0aGF0IGNvbnRhaW5zIGEgbXV0ZXggd2lsbCBub3QgY2F1c2UgdGhlCisgKiBtdXRleCBob2xkZXIgdG8gaW5oZXJpdCB0aGUgcHJpb3JpdHkgb2YgdGhlIGJsb2NrZWQgdGFzay4KKyAqCisgKiBOb3RlIDM6ICBBIHJlY2VpdmUgKGluIHRoZSBjYXNlIG9mIGEgcXVldWUpIG9yIHRha2UgKGluIHRoZSBjYXNlIG9mIGEKKyAqIHNlbWFwaG9yZSkgb3BlcmF0aW9uIG11c3Qgbm90IGJlIHBlcmZvcm1lZCBvbiBhIG1lbWJlciBvZiBhIHF1ZXVlIHNldCB1bmxlc3MKKyAqIGEgY2FsbCB0byB4UXVldWVTZWxlY3RGcm9tU2V0KCkgaGFzIGZpcnN0IHJldHVybmVkIGEgaGFuZGxlIHRvIHRoYXQgc2V0IG1lbWJlci4KKyAqCisgKiBAcGFyYW0geFF1ZXVlU2V0IFRoZSBxdWV1ZSBzZXQgb24gd2hpY2ggdGhlIHRhc2sgd2lsbCAocG90ZW50aWFsbHkpIGJsb2NrLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gdGltZSwgaW4gdGlja3MsIHRoYXQgdGhlIGNhbGxpbmcgdGFzayB3aWxsCisgKiByZW1haW4gaW4gdGhlIEJsb2NrZWQgc3RhdGUgKHdpdGggb3RoZXIgdGFza3MgZXhlY3V0aW5nKSB0byB3YWl0IGZvciBhIG1lbWJlcgorICogb2YgdGhlIHF1ZXVlIHNldCB0byBiZSByZWFkeSBmb3IgYSBzdWNjZXNzZnVsIHF1ZXVlIHJlYWQgb3Igc2VtYXBob3JlIHRha2UKKyAqIG9wZXJhdGlvbi4KKyAqCisgKiBAcmV0dXJuIHhRdWV1ZVNlbGVjdEZyb21TZXQoKSB3aWxsIHJldHVybiB0aGUgaGFuZGxlIG9mIGEgcXVldWUgKGNhc3QgdG8KKyAqIGEgUXVldWVTZXRNZW1iZXJIYW5kbGVfdCB0eXBlKSBjb250YWluZWQgaW4gdGhlIHF1ZXVlIHNldCB0aGF0IGNvbnRhaW5zIGRhdGEsCisgKiBvciB0aGUgaGFuZGxlIG9mIGEgc2VtYXBob3JlIChjYXN0IHRvIGEgUXVldWVTZXRNZW1iZXJIYW5kbGVfdCB0eXBlKSBjb250YWluZWQKKyAqIGluIHRoZSBxdWV1ZSBzZXQgdGhhdCBpcyBhdmFpbGFibGUsIG9yIE5VTEwgaWYgbm8gc3VjaCBxdWV1ZSBvciBzZW1hcGhvcmUKKyAqIGV4aXN0cyBiZWZvcmUgYmVmb3JlIHRoZSBzcGVjaWZpZWQgYmxvY2sgdGltZSBleHBpcmVzLgorICovCitRdWV1ZVNldE1lbWJlckhhbmRsZV90IHhRdWV1ZVNlbGVjdEZyb21TZXQoIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0LCBjb25zdCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBBIHZlcnNpb24gb2YgeFF1ZXVlU2VsZWN0RnJvbVNldCgpIHRoYXQgY2FuIGJlIHVzZWQgZnJvbSBhbiBJU1IuCisgKi8KK1F1ZXVlU2V0TWVtYmVySGFuZGxlX3QgeFF1ZXVlU2VsZWN0RnJvbVNldEZyb21JU1IoIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyogTm90IHB1YmxpYyBBUEkgZnVuY3Rpb25zLiAqLwordm9pZCB2UXVldWVXYWl0Rm9yTWVzc2FnZVJlc3RyaWN0ZWQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCwgY29uc3QgQmFzZVR5cGVfdCB4V2FpdEluZGVmaW5pdGVseSApIFBSSVZJTEVHRURfRlVOQ1RJT047CitCYXNlVHlwZV90IHhRdWV1ZUdlbmVyaWNSZXNldCggUXVldWVIYW5kbGVfdCB4UXVldWUsIEJhc2VUeXBlX3QgeE5ld1F1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK3ZvaWQgdlF1ZXVlU2V0UXVldWVOdW1iZXIoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBVQmFzZVR5cGVfdCB1eFF1ZXVlTnVtYmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK1VCYXNlVHlwZV90IHV4UXVldWVHZXRRdWV1ZU51bWJlciggUXVldWVIYW5kbGVfdCB4UXVldWUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwordWludDhfdCB1Y1F1ZXVlR2V0UXVldWVUeXBlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFFVRVVFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvU291cmNlL2luY2x1ZGUvc2VtcGhyLmggYi9Tb3VyY2UvaW5jbHVkZS9zZW1waHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjAzYjRhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL2luY2x1ZGUvc2VtcGhyLmgKQEAgLTAsMCArMSwxMTQwIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBTRU1BUEhPUkVfSAorI2RlZmluZSBTRU1BUEhPUkVfSAorCisjaWZuZGVmIElOQ19GUkVFUlRPU19ICisJI2Vycm9yICJpbmNsdWRlIEZyZWVSVE9TLmgiIG11c3QgYXBwZWFyIGluIHNvdXJjZSBmaWxlcyBiZWZvcmUgImluY2x1ZGUgc2VtcGhyLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInF1ZXVlLmgiCisKK3R5cGVkZWYgUXVldWVIYW5kbGVfdCBTZW1hcGhvcmVIYW5kbGVfdDsKKworI2RlZmluZSBzZW1CSU5BUllfU0VNQVBIT1JFX1FVRVVFX0xFTkdUSAkoICggdWludDhfdCApIDFVICkKKyNkZWZpbmUgc2VtU0VNQVBIT1JFX1FVRVVFX0lURU1fTEVOR1RICQkoICggdWludDhfdCApIDBVICkKKyNkZWZpbmUgc2VtR0lWRV9CTE9DS19USU1FCQkJCQkoICggVGlja1R5cGVfdCApIDBVICkKKworCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT52U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCBTZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlICk8L3ByZT4KKyAqCisgKiBJbiBtYW55IHVzYWdlIHNjZW5hcmlvcyBpdCBpcyBmYXN0ZXIgYW5kIG1vcmUgbWVtb3J5IGVmZmljaWVudCB0byB1c2UgYQorICogZGlyZWN0IHRvIHRhc2sgbm90aWZpY2F0aW9uIGluIHBsYWNlIG9mIGEgYmluYXJ5IHNlbWFwaG9yZSEKKyAqIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtdGFzay1ub3RpZmljYXRpb25zLmh0bWwKKyAqCisgKiBUaGlzIG9sZCB2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCkgbWFjcm8gaXMgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZQorICogeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IGJpbmFyeSBzZW1hcGhvcmVzIGNyZWF0ZWQgdXNpbmcKKyAqIHRoZSB2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCkgbWFjcm8gYXJlIGNyZWF0ZWQgaW4gYSBzdGF0ZSBzdWNoIHRoYXQgdGhlCisgKiBmaXJzdCBjYWxsIHRvICd0YWtlJyB0aGUgc2VtYXBob3JlIHdvdWxkIHBhc3MsIHdoZXJlYXMgYmluYXJ5IHNlbWFwaG9yZXMKKyAqIGNyZWF0ZWQgdXNpbmcgeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpIGFyZSBjcmVhdGVkIGluIGEgc3RhdGUgc3VjaCB0aGF0IHRoZQorICogdGhlIHNlbWFwaG9yZSBtdXN0IGZpcnN0IGJlICdnaXZlbicgYmVmb3JlIGl0IGNhbiBiZSAndGFrZW4nLgorICoKKyAqIDxpPk1hY3JvPC9pPiB0aGF0IGltcGxlbWVudHMgYSBzZW1hcGhvcmUgYnkgdXNpbmcgdGhlIGV4aXN0aW5nIHF1ZXVlIG1lY2hhbmlzbS4KKyAqIFRoZSBxdWV1ZSBsZW5ndGggaXMgMSBhcyB0aGlzIGlzIGEgYmluYXJ5IHNlbWFwaG9yZS4gIFRoZSBkYXRhIHNpemUgaXMgMAorICogYXMgd2UgZG9uJ3Qgd2FudCB0byBhY3R1YWxseSBzdG9yZSBhbnkgZGF0YSAtIHdlIGp1c3Qgd2FudCB0byBrbm93IGlmIHRoZQorICogcXVldWUgaXMgZW1wdHkgb3IgZnVsbC4KKyAqCisgKiBUaGlzIHR5cGUgb2Ygc2VtYXBob3JlIGNhbiBiZSB1c2VkIGZvciBwdXJlIHN5bmNocm9uaXNhdGlvbiBiZXR3ZWVuIHRhc2tzIG9yCisgKiBiZXR3ZWVuIGFuIGludGVycnVwdCBhbmQgYSB0YXNrLiAgVGhlIHNlbWFwaG9yZSBuZWVkIG5vdCBiZSBnaXZlbiBiYWNrIG9uY2UKKyAqIG9idGFpbmVkLCBzbyBvbmUgdGFzay9pbnRlcnJ1cHQgY2FuIGNvbnRpbnVvdXNseSAnZ2l2ZScgdGhlIHNlbWFwaG9yZSB3aGlsZQorICogYW5vdGhlciBjb250aW51b3VzbHkgJ3Rha2VzJyB0aGUgc2VtYXBob3JlLiAgRm9yIHRoaXMgcmVhc29uIHRoaXMgdHlwZSBvZgorICogc2VtYXBob3JlIGRvZXMgbm90IHVzZSBhIHByaW9yaXR5IGluaGVyaXRhbmNlIG1lY2hhbmlzbS4gIEZvciBhbiBhbHRlcm5hdGl2ZQorICogdGhhdCBkb2VzIHVzZSBwcmlvcml0eSBpbmhlcml0YW5jZSBzZWUgeFNlbWFwaG9yZUNyZWF0ZU11dGV4KCkuCisgKgorICogQHBhcmFtIHhTZW1hcGhvcmUgSGFuZGxlIHRvIHRoZSBjcmVhdGVkIHNlbWFwaG9yZS4gIFNob3VsZCBiZSBvZiB0eXBlIFNlbWFwaG9yZUhhbmRsZV90LgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgPHByZT4KKyBTZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlID0gTlVMTDsKKworIHZvaWQgdkFUYXNrKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgICAgLy8gU2VtYXBob3JlIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSBhIGNhbGwgdG8gdlNlbWFwaG9yZUNyZWF0ZUJpbmFyeSAoKS4KKyAgICAvLyBUaGlzIGlzIGEgbWFjcm8gc28gcGFzcyB0aGUgdmFyaWFibGUgaW4gZGlyZWN0bHkuCisgICAgdlNlbWFwaG9yZUNyZWF0ZUJpbmFyeSggeFNlbWFwaG9yZSApOworCisgICAgaWYoIHhTZW1hcGhvcmUgIT0gTlVMTCApCisgICAgeworICAgICAgICAvLyBUaGUgc2VtYXBob3JlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgLy8gVGhlIHNlbWFwaG9yZSBjYW4gbm93IGJlIHVzZWQuCisgICAgfQorIH0KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB2U2VtYXBob3JlQ3JlYXRlQmluYXJ5IHZTZW1hcGhvcmVDcmVhdGVCaW5hcnkKKyAqIFxpbmdyb3VwIFNlbWFwaG9yZXMKKyAqLworI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKwkjZGVmaW5lIHZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoIHhTZW1hcGhvcmUgKQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJKCB4U2VtYXBob3JlICkgPSB4UXVldWVHZW5lcmljQ3JlYXRlKCAoIFVCYXNlVHlwZV90ICkgMSwgc2VtU0VNQVBIT1JFX1FVRVVFX0lURU1fTEVOR1RILCBxdWV1ZVFVRVVFX1RZUEVfQklOQVJZX1NFTUFQSE9SRSApOwlcCisJCQlpZiggKCB4U2VtYXBob3JlICkgIT0gTlVMTCApCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkoIHZvaWQgKSB4U2VtYXBob3JlR2l2ZSggKCB4U2VtYXBob3JlICkgKTsJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCX0KKyNlbmRpZgorCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT5TZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCB2b2lkICk8L3ByZT4KKyAqCisgKiBDcmVhdGVzIGEgbmV3IGJpbmFyeSBzZW1hcGhvcmUgaW5zdGFuY2UsIGFuZCByZXR1cm5zIGEgaGFuZGxlIGJ5IHdoaWNoIHRoZQorICogbmV3IHNlbWFwaG9yZSBjYW4gYmUgcmVmZXJlbmNlZC4KKyAqCisgKiBJbiBtYW55IHVzYWdlIHNjZW5hcmlvcyBpdCBpcyBmYXN0ZXIgYW5kIG1vcmUgbWVtb3J5IGVmZmljaWVudCB0byB1c2UgYQorICogZGlyZWN0IHRvIHRhc2sgbm90aWZpY2F0aW9uIGluIHBsYWNlIG9mIGEgYmluYXJ5IHNlbWFwaG9yZSEKKyAqIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtdGFzay1ub3RpZmljYXRpb25zLmh0bWwKKyAqCisgKiBJbnRlcm5hbGx5LCB3aXRoaW4gdGhlIEZyZWVSVE9TIGltcGxlbWVudGF0aW9uLCBiaW5hcnkgc2VtYXBob3JlcyB1c2UgYSBibG9jaworICogb2YgbWVtb3J5LCBpbiB3aGljaCB0aGUgc2VtYXBob3JlIHN0cnVjdHVyZSBpcyBzdG9yZWQuICBJZiBhIGJpbmFyeSBzZW1hcGhvcmUKKyAqIGlzIGNyZWF0ZWQgdXNpbmcgeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpIHRoZW4gdGhlIHJlcXVpcmVkIG1lbW9yeSBpcworICogYXV0b21hdGljYWxseSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgaW5zaWRlIHRoZSB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCkKKyAqIGZ1bmN0aW9uLiAgKHNlZSBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTEuaHRtbCkuICBJZiBhIGJpbmFyeSBzZW1hcGhvcmUKKyAqIGlzIGNyZWF0ZWQgdXNpbmcgeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeVN0YXRpYygpIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlcgorICogbXVzdCBwcm92aWRlIHRoZSBtZW1vcnkuICB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5U3RhdGljKCkgdGhlcmVmb3JlIGFsbG93cyBhCisgKiBiaW5hcnkgc2VtYXBob3JlIHRvIGJlIGNyZWF0ZWQgd2l0aG91dCB1c2luZyBhbnkgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBUaGUgb2xkIHZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKSBtYWNybyBpcyBub3cgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdGhpcworICogeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IGJpbmFyeSBzZW1hcGhvcmVzIGNyZWF0ZWQgdXNpbmcKKyAqIHRoZSB2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCkgbWFjcm8gYXJlIGNyZWF0ZWQgaW4gYSBzdGF0ZSBzdWNoIHRoYXQgdGhlCisgKiBmaXJzdCBjYWxsIHRvICd0YWtlJyB0aGUgc2VtYXBob3JlIHdvdWxkIHBhc3MsIHdoZXJlYXMgYmluYXJ5IHNlbWFwaG9yZXMKKyAqIGNyZWF0ZWQgdXNpbmcgeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpIGFyZSBjcmVhdGVkIGluIGEgc3RhdGUgc3VjaCB0aGF0IHRoZQorICogdGhlIHNlbWFwaG9yZSBtdXN0IGZpcnN0IGJlICdnaXZlbicgYmVmb3JlIGl0IGNhbiBiZSAndGFrZW4nLgorICoKKyAqIFRoaXMgdHlwZSBvZiBzZW1hcGhvcmUgY2FuIGJlIHVzZWQgZm9yIHB1cmUgc3luY2hyb25pc2F0aW9uIGJldHdlZW4gdGFza3Mgb3IKKyAqIGJldHdlZW4gYW4gaW50ZXJydXB0IGFuZCBhIHRhc2suICBUaGUgc2VtYXBob3JlIG5lZWQgbm90IGJlIGdpdmVuIGJhY2sgb25jZQorICogb2J0YWluZWQsIHNvIG9uZSB0YXNrL2ludGVycnVwdCBjYW4gY29udGludW91c2x5ICdnaXZlJyB0aGUgc2VtYXBob3JlIHdoaWxlCisgKiBhbm90aGVyIGNvbnRpbnVvdXNseSAndGFrZXMnIHRoZSBzZW1hcGhvcmUuICBGb3IgdGhpcyByZWFzb24gdGhpcyB0eXBlIG9mCisgKiBzZW1hcGhvcmUgZG9lcyBub3QgdXNlIGEgcHJpb3JpdHkgaW5oZXJpdGFuY2UgbWVjaGFuaXNtLiAgRm9yIGFuIGFsdGVybmF0aXZlCisgKiB0aGF0IGRvZXMgdXNlIHByaW9yaXR5IGluaGVyaXRhbmNlIHNlZSB4U2VtYXBob3JlQ3JlYXRlTXV0ZXgoKS4KKyAqCisgKiBAcmV0dXJuIEhhbmRsZSB0byB0aGUgY3JlYXRlZCBzZW1hcGhvcmUsIG9yIE5VTEwgaWYgdGhlIG1lbW9yeSByZXF1aXJlZCB0bworICogaG9sZCB0aGUgc2VtYXBob3JlJ3MgZGF0YSBzdHJ1Y3R1cmVzIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyA8cHJlPgorIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmUgPSBOVUxMOworCisgdm9pZCB2QVRhc2soIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorIHsKKyAgICAvLyBTZW1hcGhvcmUgY2Fubm90IGJlIHVzZWQgYmVmb3JlIGEgY2FsbCB0byB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCkuCisgICAgLy8gVGhpcyBpcyBhIG1hY3JvIHNvIHBhc3MgdGhlIHZhcmlhYmxlIGluIGRpcmVjdGx5LgorICAgIHhTZW1hcGhvcmUgPSB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCk7CisKKyAgICBpZiggeFNlbWFwaG9yZSAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIC8vIFRoZSBzZW1hcGhvcmUgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAvLyBUaGUgc2VtYXBob3JlIGNhbiBub3cgYmUgdXNlZC4KKyAgICB9CisgfQorIDwvcHJlPgorICogXGRlZmdyb3VwIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkgeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeQorICogXGluZ3JvdXAgU2VtYXBob3JlcworICovCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCSNkZWZpbmUgeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpIHhRdWV1ZUdlbmVyaWNDcmVhdGUoICggVUJhc2VUeXBlX3QgKSAxLCBzZW1TRU1BUEhPUkVfUVVFVUVfSVRFTV9MRU5HVEgsIHF1ZXVlUVVFVUVfVFlQRV9CSU5BUllfU0VNQVBIT1JFICkKKyNlbmRpZgorCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT5TZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5U3RhdGljKCBTdGF0aWNTZW1hcGhvcmVfdCAqcHhTZW1hcGhvcmVCdWZmZXIgKTwvcHJlPgorICoKKyAqIENyZWF0ZXMgYSBuZXcgYmluYXJ5IHNlbWFwaG9yZSBpbnN0YW5jZSwgYW5kIHJldHVybnMgYSBoYW5kbGUgYnkgd2hpY2ggdGhlCisgKiBuZXcgc2VtYXBob3JlIGNhbiBiZSByZWZlcmVuY2VkLgorICoKKyAqIE5PVEU6IEluIG1hbnkgdXNhZ2Ugc2NlbmFyaW9zIGl0IGlzIGZhc3RlciBhbmQgbW9yZSBtZW1vcnkgZWZmaWNpZW50IHRvIHVzZSBhCisgKiBkaXJlY3QgdG8gdGFzayBub3RpZmljYXRpb24gaW4gcGxhY2Ugb2YgYSBiaW5hcnkgc2VtYXBob3JlIQorICogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy10YXNrLW5vdGlmaWNhdGlvbnMuaHRtbAorICoKKyAqIEludGVybmFsbHksIHdpdGhpbiB0aGUgRnJlZVJUT1MgaW1wbGVtZW50YXRpb24sIGJpbmFyeSBzZW1hcGhvcmVzIHVzZSBhIGJsb2NrCisgKiBvZiBtZW1vcnksIGluIHdoaWNoIHRoZSBzZW1hcGhvcmUgc3RydWN0dXJlIGlzIHN0b3JlZC4gIElmIGEgYmluYXJ5IHNlbWFwaG9yZQorICogaXMgY3JlYXRlZCB1c2luZyB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCkgdGhlbiB0aGUgcmVxdWlyZWQgbWVtb3J5IGlzCisgKiBhdXRvbWF0aWNhbGx5IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpbnNpZGUgdGhlIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKQorICogZnVuY3Rpb24uICAoc2VlIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExMS5odG1sKS4gIElmIGEgYmluYXJ5IHNlbWFwaG9yZQorICogaXMgY3JlYXRlZCB1c2luZyB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5U3RhdGljKCkgdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyCisgKiBtdXN0IHByb3ZpZGUgdGhlIG1lbW9yeS4gIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnlTdGF0aWMoKSB0aGVyZWZvcmUgYWxsb3dzIGEKKyAqIGJpbmFyeSBzZW1hcGhvcmUgdG8gYmUgY3JlYXRlZCB3aXRob3V0IHVzaW5nIGFueSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIFRoaXMgdHlwZSBvZiBzZW1hcGhvcmUgY2FuIGJlIHVzZWQgZm9yIHB1cmUgc3luY2hyb25pc2F0aW9uIGJldHdlZW4gdGFza3Mgb3IKKyAqIGJldHdlZW4gYW4gaW50ZXJydXB0IGFuZCBhIHRhc2suICBUaGUgc2VtYXBob3JlIG5lZWQgbm90IGJlIGdpdmVuIGJhY2sgb25jZQorICogb2J0YWluZWQsIHNvIG9uZSB0YXNrL2ludGVycnVwdCBjYW4gY29udGludW91c2x5ICdnaXZlJyB0aGUgc2VtYXBob3JlIHdoaWxlCisgKiBhbm90aGVyIGNvbnRpbnVvdXNseSAndGFrZXMnIHRoZSBzZW1hcGhvcmUuICBGb3IgdGhpcyByZWFzb24gdGhpcyB0eXBlIG9mCisgKiBzZW1hcGhvcmUgZG9lcyBub3QgdXNlIGEgcHJpb3JpdHkgaW5oZXJpdGFuY2UgbWVjaGFuaXNtLiAgRm9yIGFuIGFsdGVybmF0aXZlCisgKiB0aGF0IGRvZXMgdXNlIHByaW9yaXR5IGluaGVyaXRhbmNlIHNlZSB4U2VtYXBob3JlQ3JlYXRlTXV0ZXgoKS4KKyAqCisgKiBAcGFyYW0gcHhTZW1hcGhvcmVCdWZmZXIgTXVzdCBwb2ludCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgU3RhdGljU2VtYXBob3JlX3QsCisgKiB3aGljaCB3aWxsIHRoZW4gYmUgdXNlZCB0byBob2xkIHRoZSBzZW1hcGhvcmUncyBkYXRhIHN0cnVjdHVyZSwgcmVtb3ZpbmcgdGhlCisgKiBuZWVkIGZvciB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseS4KKyAqCisgKiBAcmV0dXJuIElmIHRoZSBzZW1hcGhvcmUgaXMgY3JlYXRlZCB0aGVuIGEgaGFuZGxlIHRvIHRoZSBjcmVhdGVkIHNlbWFwaG9yZSBpcworICogcmV0dXJuZWQuICBJZiBweFNlbWFwaG9yZUJ1ZmZlciBpcyBOVUxMIHRoZW4gTlVMTCBpcyByZXR1cm5lZC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorIDxwcmU+CisgU2VtYXBob3JlSGFuZGxlX3QgeFNlbWFwaG9yZSA9IE5VTEw7CisgU3RhdGljU2VtYXBob3JlX3QgeFNlbWFwaG9yZUJ1ZmZlcjsKKworIHZvaWQgdkFUYXNrKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgICAgLy8gU2VtYXBob3JlIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSBhIGNhbGwgdG8geFNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpLgorICAgIC8vIFRoZSBzZW1hcGhvcmUncyBkYXRhIHN0cnVjdHVyZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIHhTZW1hcGhvcmVCdWZmZXIKKyAgICAvLyB2YXJpYWJsZSwgdGhlIGFkZHJlc3Mgb2Ygd2hpY2ggaXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uLiAgVGhlCisgICAgLy8gZnVuY3Rpb24ncyBwYXJhbWV0ZXIgaXMgbm90IE5VTEwsIHNvIHRoZSBmdW5jdGlvbiB3aWxsIG5vdCBhdHRlbXB0IGFueQorICAgIC8vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24sIGFuZCB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybgorICAgIC8vIHJldHVybiBOVUxMLgorICAgIHhTZW1hcGhvcmUgPSB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCAmeFNlbWFwaG9yZUJ1ZmZlciApOworCisgICAgLy8gUmVzdCBvZiB0YXNrIGNvZGUgZ29lcyBoZXJlLgorIH0KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5U3RhdGljIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnlTdGF0aWMKKyAqIFxpbmdyb3VwIFNlbWFwaG9yZXMKKyAqLworI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCSNkZWZpbmUgeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeVN0YXRpYyggcHhTdGF0aWNTZW1hcGhvcmUgKSB4UXVldWVHZW5lcmljQ3JlYXRlU3RhdGljKCAoIFVCYXNlVHlwZV90ICkgMSwgc2VtU0VNQVBIT1JFX1FVRVVFX0lURU1fTEVOR1RILCBOVUxMLCBweFN0YXRpY1NlbWFwaG9yZSwgcXVldWVRVUVVRV9UWVBFX0JJTkFSWV9TRU1BUEhPUkUgKQorI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKworLyoqCisgKiBzZW1waHIuIGgKKyAqIDxwcmU+eFNlbWFwaG9yZVRha2UoCisgKiAgICAgICAgICAgICAgICAgICBTZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlLAorICogICAgICAgICAgICAgICAgICAgVGlja1R5cGVfdCB4QmxvY2tUaW1lCisgKiAgICAgICAgICAgICAgICk8L3ByZT4KKyAqCisgKiA8aT5NYWNybzwvaT4gdG8gb2J0YWluIGEgc2VtYXBob3JlLiAgVGhlIHNlbWFwaG9yZSBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuCisgKiBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKSwgeFNlbWFwaG9yZUNyZWF0ZU11dGV4KCkgb3IKKyAqIHhTZW1hcGhvcmVDcmVhdGVDb3VudGluZygpLgorICoKKyAqIEBwYXJhbSB4U2VtYXBob3JlIEEgaGFuZGxlIHRvIHRoZSBzZW1hcGhvcmUgYmVpbmcgdGFrZW4gLSBvYnRhaW5lZCB3aGVuCisgKiB0aGUgc2VtYXBob3JlIHdhcyBjcmVhdGVkLgorICoKKyAqIEBwYXJhbSB4QmxvY2tUaW1lIFRoZSB0aW1lIGluIHRpY2tzIHRvIHdhaXQgZm9yIHRoZSBzZW1hcGhvcmUgdG8gYmVjb21lCisgKiBhdmFpbGFibGUuICBUaGUgbWFjcm8gcG9ydFRJQ0tfUEVSSU9EX01TIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgdGhpcyB0byBhCisgKiByZWFsIHRpbWUuICBBIGJsb2NrIHRpbWUgb2YgemVybyBjYW4gYmUgdXNlZCB0byBwb2xsIHRoZSBzZW1hcGhvcmUuICBBIGJsb2NrCisgKiB0aW1lIG9mIHBvcnRNQVhfREVMQVkgY2FuIGJlIHVzZWQgdG8gYmxvY2sgaW5kZWZpbml0ZWx5IChwcm92aWRlZAorICogSU5DTFVERV92VGFza1N1c3BlbmQgaXMgc2V0IHRvIDEgaW4gRnJlZVJUT1NDb25maWcuaCkuCisgKgorICogQHJldHVybiBwZFRSVUUgaWYgdGhlIHNlbWFwaG9yZSB3YXMgb2J0YWluZWQuICBwZEZBTFNFCisgKiBpZiB4QmxvY2tUaW1lIGV4cGlyZWQgd2l0aG91dCB0aGUgc2VtYXBob3JlIGJlY29taW5nIGF2YWlsYWJsZS4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorIDxwcmU+CisgU2VtYXBob3JlSGFuZGxlX3QgeFNlbWFwaG9yZSA9IE5VTEw7CisKKyAvLyBBIHRhc2sgdGhhdCBjcmVhdGVzIGEgc2VtYXBob3JlLgorIHZvaWQgdkFUYXNrKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgICAgLy8gQ3JlYXRlIHRoZSBzZW1hcGhvcmUgdG8gZ3VhcmQgYSBzaGFyZWQgcmVzb3VyY2UuCisgICAgeFNlbWFwaG9yZSA9IHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKTsKKyB9CisKKyAvLyBBIHRhc2sgdGhhdCB1c2VzIHRoZSBzZW1hcGhvcmUuCisgdm9pZCB2QW5vdGhlclRhc2soIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorIHsKKyAgICAvLyAuLi4gRG8gb3RoZXIgdGhpbmdzLgorCisgICAgaWYoIHhTZW1hcGhvcmUgIT0gTlVMTCApCisgICAgeworICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIG9idGFpbiB0aGUgc2VtYXBob3JlLiAgSWYgdGhlIHNlbWFwaG9yZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgIC8vIHdhaXQgMTAgdGlja3MgdG8gc2VlIGlmIGl0IGJlY29tZXMgZnJlZS4KKyAgICAgICAgaWYoIHhTZW1hcGhvcmVUYWtlKCB4U2VtYXBob3JlLCAoIFRpY2tUeXBlX3QgKSAxMCApID09IHBkVFJVRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIHdlcmUgYWJsZSB0byBvYnRhaW4gdGhlIHNlbWFwaG9yZSBhbmQgY2FuIG5vdyBhY2Nlc3MgdGhlCisgICAgICAgICAgICAvLyBzaGFyZWQgcmVzb3VyY2UuCisKKyAgICAgICAgICAgIC8vIC4uLgorCisgICAgICAgICAgICAvLyBXZSBoYXZlIGZpbmlzaGVkIGFjY2Vzc2luZyB0aGUgc2hhcmVkIHJlc291cmNlLiAgUmVsZWFzZSB0aGUKKyAgICAgICAgICAgIC8vIHNlbWFwaG9yZS4KKyAgICAgICAgICAgIHhTZW1hcGhvcmVHaXZlKCB4U2VtYXBob3JlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBjb3VsZCBub3Qgb2J0YWluIHRoZSBzZW1hcGhvcmUgYW5kIGNhbiB0aGVyZWZvcmUgbm90IGFjY2VzcworICAgICAgICAgICAgLy8gdGhlIHNoYXJlZCByZXNvdXJjZSBzYWZlbHkuCisgICAgICAgIH0KKyAgICB9CisgfQorIDwvcHJlPgorICogXGRlZmdyb3VwIHhTZW1hcGhvcmVUYWtlIHhTZW1hcGhvcmVUYWtlCisgKiBcaW5ncm91cCBTZW1hcGhvcmVzCisgKi8KKyNkZWZpbmUgeFNlbWFwaG9yZVRha2UoIHhTZW1hcGhvcmUsIHhCbG9ja1RpbWUgKQkJeFF1ZXVlU2VtYXBob3JlVGFrZSggKCB4U2VtYXBob3JlICksICggeEJsb2NrVGltZSApICkKKworLyoqCisgKiBzZW1waHIuIGgKKyAqIHhTZW1hcGhvcmVUYWtlUmVjdXJzaXZlKAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFwaG9yZUhhbmRsZV90IHhNdXRleCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrVHlwZV90IHhCbG9ja1RpbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKQorICoKKyAqIDxpPk1hY3JvPC9pPiB0byByZWN1cnNpdmVseSBvYnRhaW4sIG9yICd0YWtlJywgYSBtdXRleCB0eXBlIHNlbWFwaG9yZS4KKyAqIFRoZSBtdXRleCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIGNyZWF0ZWQgdXNpbmcgYSBjYWxsIHRvCisgKiB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXgoKTsKKyAqCisgKiBjb25maWdVU0VfUkVDVVJTSVZFX01VVEVYRVMgbXVzdCBiZSBzZXQgdG8gMSBpbiBGcmVlUlRPU0NvbmZpZy5oIGZvciB0aGlzCisgKiBtYWNybyB0byBiZSBhdmFpbGFibGUuCisgKgorICogVGhpcyBtYWNybyBtdXN0IG5vdCBiZSB1c2VkIG9uIG11dGV4ZXMgY3JlYXRlZCB1c2luZyB4U2VtYXBob3JlQ3JlYXRlTXV0ZXgoKS4KKyAqCisgKiBBIG11dGV4IHVzZWQgcmVjdXJzaXZlbHkgY2FuIGJlICd0YWtlbicgcmVwZWF0ZWRseSBieSB0aGUgb3duZXIuIFRoZSBtdXRleAorICogZG9lc24ndCBiZWNvbWUgYXZhaWxhYmxlIGFnYWluIHVudGlsIHRoZSBvd25lciBoYXMgY2FsbGVkCisgKiB4U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSgpIGZvciBlYWNoIHN1Y2Nlc3NmdWwgJ3Rha2UnIHJlcXVlc3QuICBGb3IgZXhhbXBsZSwKKyAqIGlmIGEgdGFzayBzdWNjZXNzZnVsbHkgJ3Rha2VzJyB0aGUgc2FtZSBtdXRleCA1IHRpbWVzIHRoZW4gdGhlIG11dGV4IHdpbGwKKyAqIG5vdCBiZSBhdmFpbGFibGUgdG8gYW55IG90aGVyIHRhc2sgdW50aWwgaXQgaGFzIGFsc28gICdnaXZlbicgdGhlIG11dGV4IGJhY2sKKyAqIGV4YWN0bHkgZml2ZSB0aW1lcy4KKyAqCisgKiBAcGFyYW0geE11dGV4IEEgaGFuZGxlIHRvIHRoZSBtdXRleCBiZWluZyBvYnRhaW5lZC4gIFRoaXMgaXMgdGhlCisgKiBoYW5kbGUgcmV0dXJuZWQgYnkgeFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4KCk7CisgKgorICogQHBhcmFtIHhCbG9ja1RpbWUgVGhlIHRpbWUgaW4gdGlja3MgdG8gd2FpdCBmb3IgdGhlIHNlbWFwaG9yZSB0byBiZWNvbWUKKyAqIGF2YWlsYWJsZS4gIFRoZSBtYWNybyBwb3J0VElDS19QRVJJT0RfTVMgY2FuIGJlIHVzZWQgdG8gY29udmVydCB0aGlzIHRvIGEKKyAqIHJlYWwgdGltZS4gIEEgYmxvY2sgdGltZSBvZiB6ZXJvIGNhbiBiZSB1c2VkIHRvIHBvbGwgdGhlIHNlbWFwaG9yZS4gIElmCisgKiB0aGUgdGFzayBhbHJlYWR5IG93bnMgdGhlIHNlbWFwaG9yZSB0aGVuIHhTZW1hcGhvcmVUYWtlUmVjdXJzaXZlKCkgd2lsbAorICogcmV0dXJuIGltbWVkaWF0ZWx5IG5vIG1hdHRlciB3aGF0IHRoZSB2YWx1ZSBvZiB4QmxvY2tUaW1lLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIHRoZSBzZW1hcGhvcmUgd2FzIG9idGFpbmVkLiAgcGRGQUxTRSBpZiB4QmxvY2tUaW1lCisgKiBleHBpcmVkIHdpdGhvdXQgdGhlIHNlbWFwaG9yZSBiZWNvbWluZyBhdmFpbGFibGUuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyA8cHJlPgorIFNlbWFwaG9yZUhhbmRsZV90IHhNdXRleCA9IE5VTEw7CisKKyAvLyBBIHRhc2sgdGhhdCBjcmVhdGVzIGEgbXV0ZXguCisgdm9pZCB2QVRhc2soIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorIHsKKyAgICAvLyBDcmVhdGUgdGhlIG11dGV4IHRvIGd1YXJkIGEgc2hhcmVkIHJlc291cmNlLgorICAgIHhNdXRleCA9IHhTZW1hcGhvcmVDcmVhdGVSZWN1cnNpdmVNdXRleCgpOworIH0KKworIC8vIEEgdGFzayB0aGF0IHVzZXMgdGhlIG11dGV4LgorIHZvaWQgdkFub3RoZXJUYXNrKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgICAgLy8gLi4uIERvIG90aGVyIHRoaW5ncy4KKworICAgIGlmKCB4TXV0ZXggIT0gTlVMTCApCisgICAgeworICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIG9idGFpbiB0aGUgbXV0ZXguICBJZiB0aGUgbXV0ZXggaXMgbm90IGF2YWlsYWJsZQorICAgICAgICAvLyB3YWl0IDEwIHRpY2tzIHRvIHNlZSBpZiBpdCBiZWNvbWVzIGZyZWUuCisgICAgICAgIGlmKCB4U2VtYXBob3JlVGFrZVJlY3Vyc2l2ZSggeFNlbWFwaG9yZSwgKCBUaWNrVHlwZV90ICkgMTAgKSA9PSBwZFRSVUUgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSB3ZXJlIGFibGUgdG8gb2J0YWluIHRoZSBtdXRleCBhbmQgY2FuIG5vdyBhY2Nlc3MgdGhlCisgICAgICAgICAgICAvLyBzaGFyZWQgcmVzb3VyY2UuCisKKyAgICAgICAgICAgIC8vIC4uLgorICAgICAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIGR1ZSB0byB0aGUgbmF0dXJlIG9mIHRoZSBjb2RlIGZ1cnRoZXIgY2FsbHMgdG8KKyAgICAgICAgICAgIC8vIHhTZW1hcGhvcmVUYWtlUmVjdXJzaXZlKCkgYXJlIG1hZGUgb24gdGhlIHNhbWUgbXV0ZXguICBJbiByZWFsCisgICAgICAgICAgICAvLyBjb2RlIHRoZXNlIHdvdWxkIG5vdCBiZSBqdXN0IHNlcXVlbnRpYWwgY2FsbHMgYXMgdGhpcyB3b3VsZCBtYWtlCisgICAgICAgICAgICAvLyBubyBzZW5zZS4gIEluc3RlYWQgdGhlIGNhbGxzIGFyZSBsaWtlbHkgdG8gYmUgYnVyaWVkIGluc2lkZQorICAgICAgICAgICAgLy8gYSBtb3JlIGNvbXBsZXggY2FsbCBzdHJ1Y3R1cmUuCisgICAgICAgICAgICB4U2VtYXBob3JlVGFrZVJlY3Vyc2l2ZSggeE11dGV4LCAoIFRpY2tUeXBlX3QgKSAxMCApOworICAgICAgICAgICAgeFNlbWFwaG9yZVRha2VSZWN1cnNpdmUoIHhNdXRleCwgKCBUaWNrVHlwZV90ICkgMTAgKTsKKworICAgICAgICAgICAgLy8gVGhlIG11dGV4IGhhcyBub3cgYmVlbiAndGFrZW4nIHRocmVlIHRpbWVzLCBzbyB3aWxsIG5vdCBiZQorICAgICAgICAgICAgLy8gYXZhaWxhYmxlIHRvIGFub3RoZXIgdGFzayB1bnRpbCBpdCBoYXMgYWxzbyBiZWVuIGdpdmVuIGJhY2sKKyAgICAgICAgICAgIC8vIHRocmVlIHRpbWVzLiAgQWdhaW4gaXQgaXMgdW5saWtlbHkgdGhhdCByZWFsIGNvZGUgd291bGQgaGF2ZQorICAgICAgICAgICAgLy8gdGhlc2UgY2FsbHMgc2VxdWVudGlhbGx5LCBidXQgaW5zdGVhZCBidXJpZWQgaW4gYSBtb3JlIGNvbXBsZXgKKyAgICAgICAgICAgIC8vIGNhbGwgc3RydWN0dXJlLiAgVGhpcyBpcyBqdXN0IGZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMuCisgICAgICAgICAgICB4U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSggeE11dGV4ICk7CisgICAgICAgICAgICB4U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSggeE11dGV4ICk7CisgICAgICAgICAgICB4U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSggeE11dGV4ICk7CisKKyAgICAgICAgICAgIC8vIE5vdyB0aGUgbXV0ZXggY2FuIGJlIHRha2VuIGJ5IG90aGVyIHRhc2tzLgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2UgY291bGQgbm90IG9idGFpbiB0aGUgbXV0ZXggYW5kIGNhbiB0aGVyZWZvcmUgbm90IGFjY2VzcworICAgICAgICAgICAgLy8gdGhlIHNoYXJlZCByZXNvdXJjZSBzYWZlbHkuCisgICAgICAgIH0KKyAgICB9CisgfQorIDwvcHJlPgorICogXGRlZmdyb3VwIHhTZW1hcGhvcmVUYWtlUmVjdXJzaXZlIHhTZW1hcGhvcmVUYWtlUmVjdXJzaXZlCisgKiBcaW5ncm91cCBTZW1hcGhvcmVzCisgKi8KKyNpZiggY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTID09IDEgKQorCSNkZWZpbmUgeFNlbWFwaG9yZVRha2VSZWN1cnNpdmUoIHhNdXRleCwgeEJsb2NrVGltZSApCXhRdWV1ZVRha2VNdXRleFJlY3Vyc2l2ZSggKCB4TXV0ZXggKSwgKCB4QmxvY2tUaW1lICkgKQorI2VuZGlmCisKKy8qKgorICogc2VtcGhyLiBoCisgKiA8cHJlPnhTZW1hcGhvcmVHaXZlKCBTZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlICk8L3ByZT4KKyAqCisgKiA8aT5NYWNybzwvaT4gdG8gcmVsZWFzZSBhIHNlbWFwaG9yZS4gIFRoZSBzZW1hcGhvcmUgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbgorICogY3JlYXRlZCB3aXRoIGEgY2FsbCB0byB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCksIHhTZW1hcGhvcmVDcmVhdGVNdXRleCgpIG9yCisgKiB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoKS4gYW5kIG9idGFpbmVkIHVzaW5nIHNTZW1hcGhvcmVUYWtlKCkuCisgKgorICogVGhpcyBtYWNybyBtdXN0IG5vdCBiZSB1c2VkIGZyb20gYW4gSVNSLiAgU2VlIHhTZW1hcGhvcmVHaXZlRnJvbUlTUiAoKSBmb3IKKyAqIGFuIGFsdGVybmF0aXZlIHdoaWNoIGNhbiBiZSB1c2VkIGZyb20gYW4gSVNSLgorICoKKyAqIFRoaXMgbWFjcm8gbXVzdCBhbHNvIG5vdCBiZSB1c2VkIG9uIHNlbWFwaG9yZXMgY3JlYXRlZCB1c2luZworICogeFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4KCkuCisgKgorICogQHBhcmFtIHhTZW1hcGhvcmUgQSBoYW5kbGUgdG8gdGhlIHNlbWFwaG9yZSBiZWluZyByZWxlYXNlZC4gIFRoaXMgaXMgdGhlCisgKiBoYW5kbGUgcmV0dXJuZWQgd2hlbiB0aGUgc2VtYXBob3JlIHdhcyBjcmVhdGVkLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIHRoZSBzZW1hcGhvcmUgd2FzIHJlbGVhc2VkLiAgcGRGQUxTRSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqIFNlbWFwaG9yZXMgYXJlIGltcGxlbWVudGVkIHVzaW5nIHF1ZXVlcy4gIEFuIGVycm9yIGNhbiBvY2N1ciBpZiB0aGVyZSBpcworICogbm8gc3BhY2Ugb24gdGhlIHF1ZXVlIHRvIHBvc3QgYSBtZXNzYWdlIC0gaW5kaWNhdGluZyB0aGF0IHRoZQorICogc2VtYXBob3JlIHdhcyBub3QgZmlyc3Qgb2J0YWluZWQgY29ycmVjdGx5LgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgPHByZT4KKyBTZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlID0gTlVMTDsKKworIHZvaWQgdkFUYXNrKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgICAgLy8gQ3JlYXRlIHRoZSBzZW1hcGhvcmUgdG8gZ3VhcmQgYSBzaGFyZWQgcmVzb3VyY2UuCisgICAgeFNlbWFwaG9yZSA9IHZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKTsKKworICAgIGlmKCB4U2VtYXBob3JlICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgaWYoIHhTZW1hcGhvcmVHaXZlKCB4U2VtYXBob3JlICkgIT0gcGRUUlVFICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2Ugd291bGQgZXhwZWN0IHRoaXMgY2FsbCB0byBmYWlsIGJlY2F1c2Ugd2UgY2Fubm90IGdpdmUKKyAgICAgICAgICAgIC8vIGEgc2VtYXBob3JlIHdpdGhvdXQgZmlyc3QgInRha2luZyIgaXQhCisgICAgICAgIH0KKworICAgICAgICAvLyBPYnRhaW4gdGhlIHNlbWFwaG9yZSAtIGRvbid0IGJsb2NrIGlmIHRoZSBzZW1hcGhvcmUgaXMgbm90CisgICAgICAgIC8vIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKyAgICAgICAgaWYoIHhTZW1hcGhvcmVUYWtlKCB4U2VtYXBob3JlLCAoIFRpY2tUeXBlX3QgKSAwICkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBub3cgaGF2ZSB0aGUgc2VtYXBob3JlIGFuZCBjYW4gYWNjZXNzIHRoZSBzaGFyZWQgcmVzb3VyY2UuCisKKyAgICAgICAgICAgIC8vIC4uLgorCisgICAgICAgICAgICAvLyBXZSBoYXZlIGZpbmlzaGVkIGFjY2Vzc2luZyB0aGUgc2hhcmVkIHJlc291cmNlIHNvIGNhbiBmcmVlIHRoZQorICAgICAgICAgICAgLy8gc2VtYXBob3JlLgorICAgICAgICAgICAgaWYoIHhTZW1hcGhvcmVHaXZlKCB4U2VtYXBob3JlICkgIT0gcGRUUlVFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSB3b3VsZCBub3QgZXhwZWN0IHRoaXMgY2FsbCB0byBmYWlsIGJlY2F1c2Ugd2UgbXVzdCBoYXZlCisgICAgICAgICAgICAgICAgLy8gb2J0YWluZWQgdGhlIHNlbWFwaG9yZSB0byBnZXQgaGVyZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyB9CisgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFNlbWFwaG9yZUdpdmUgeFNlbWFwaG9yZUdpdmUKKyAqIFxpbmdyb3VwIFNlbWFwaG9yZXMKKyAqLworI2RlZmluZSB4U2VtYXBob3JlR2l2ZSggeFNlbWFwaG9yZSApCQl4UXVldWVHZW5lcmljU2VuZCggKCBRdWV1ZUhhbmRsZV90ICkgKCB4U2VtYXBob3JlICksIE5VTEwsIHNlbUdJVkVfQkxPQ0tfVElNRSwgcXVldWVTRU5EX1RPX0JBQ0sgKQorCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT54U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSggU2VtYXBob3JlSGFuZGxlX3QgeE11dGV4ICk8L3ByZT4KKyAqCisgKiA8aT5NYWNybzwvaT4gdG8gcmVjdXJzaXZlbHkgcmVsZWFzZSwgb3IgJ2dpdmUnLCBhIG11dGV4IHR5cGUgc2VtYXBob3JlLgorICogVGhlIG11dGV4IG11c3QgaGF2ZSBwcmV2aW91c2x5IGJlZW4gY3JlYXRlZCB1c2luZyBhIGNhbGwgdG8KKyAqIHhTZW1hcGhvcmVDcmVhdGVSZWN1cnNpdmVNdXRleCgpOworICoKKyAqIGNvbmZpZ1VTRV9SRUNVUlNJVkVfTVVURVhFUyBtdXN0IGJlIHNldCB0byAxIGluIEZyZWVSVE9TQ29uZmlnLmggZm9yIHRoaXMKKyAqIG1hY3JvIHRvIGJlIGF2YWlsYWJsZS4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3Qgbm90IGJlIHVzZWQgb24gbXV0ZXhlcyBjcmVhdGVkIHVzaW5nIHhTZW1hcGhvcmVDcmVhdGVNdXRleCgpLgorICoKKyAqIEEgbXV0ZXggdXNlZCByZWN1cnNpdmVseSBjYW4gYmUgJ3Rha2VuJyByZXBlYXRlZGx5IGJ5IHRoZSBvd25lci4gVGhlIG11dGV4CisgKiBkb2Vzbid0IGJlY29tZSBhdmFpbGFibGUgYWdhaW4gdW50aWwgdGhlIG93bmVyIGhhcyBjYWxsZWQKKyAqIHhTZW1hcGhvcmVHaXZlUmVjdXJzaXZlKCkgZm9yIGVhY2ggc3VjY2Vzc2Z1bCAndGFrZScgcmVxdWVzdC4gIEZvciBleGFtcGxlLAorICogaWYgYSB0YXNrIHN1Y2Nlc3NmdWxseSAndGFrZXMnIHRoZSBzYW1lIG11dGV4IDUgdGltZXMgdGhlbiB0aGUgbXV0ZXggd2lsbAorICogbm90IGJlIGF2YWlsYWJsZSB0byBhbnkgb3RoZXIgdGFzayB1bnRpbCBpdCBoYXMgYWxzbyAgJ2dpdmVuJyB0aGUgbXV0ZXggYmFjaworICogZXhhY3RseSBmaXZlIHRpbWVzLgorICoKKyAqIEBwYXJhbSB4TXV0ZXggQSBoYW5kbGUgdG8gdGhlIG11dGV4IGJlaW5nIHJlbGVhc2VkLCBvciAnZ2l2ZW4nLiAgVGhpcyBpcyB0aGUKKyAqIGhhbmRsZSByZXR1cm5lZCBieSB4U2VtYXBob3JlQ3JlYXRlTXV0ZXgoKTsKKyAqCisgKiBAcmV0dXJuIHBkVFJVRSBpZiB0aGUgc2VtYXBob3JlIHdhcyBnaXZlbi4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorIDxwcmU+CisgU2VtYXBob3JlSGFuZGxlX3QgeE11dGV4ID0gTlVMTDsKKworIC8vIEEgdGFzayB0aGF0IGNyZWF0ZXMgYSBtdXRleC4KKyB2b2lkIHZBVGFzayggdm9pZCAqIHB2UGFyYW1ldGVycyApCisgeworICAgIC8vIENyZWF0ZSB0aGUgbXV0ZXggdG8gZ3VhcmQgYSBzaGFyZWQgcmVzb3VyY2UuCisgICAgeE11dGV4ID0geFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4KCk7CisgfQorCisgLy8gQSB0YXNrIHRoYXQgdXNlcyB0aGUgbXV0ZXguCisgdm9pZCB2QW5vdGhlclRhc2soIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorIHsKKyAgICAvLyAuLi4gRG8gb3RoZXIgdGhpbmdzLgorCisgICAgaWYoIHhNdXRleCAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gb2J0YWluIHRoZSBtdXRleC4gIElmIHRoZSBtdXRleCBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgIC8vIHdhaXQgMTAgdGlja3MgdG8gc2VlIGlmIGl0IGJlY29tZXMgZnJlZS4KKyAgICAgICAgaWYoIHhTZW1hcGhvcmVUYWtlUmVjdXJzaXZlKCB4TXV0ZXgsICggVGlja1R5cGVfdCApIDEwICkgPT0gcGRUUlVFICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2Ugd2VyZSBhYmxlIHRvIG9idGFpbiB0aGUgbXV0ZXggYW5kIGNhbiBub3cgYWNjZXNzIHRoZQorICAgICAgICAgICAgLy8gc2hhcmVkIHJlc291cmNlLgorCisgICAgICAgICAgICAvLyAuLi4KKyAgICAgICAgICAgIC8vIEZvciBzb21lIHJlYXNvbiBkdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUgY29kZSBmdXJ0aGVyIGNhbGxzIHRvCisJCQkvLyB4U2VtYXBob3JlVGFrZVJlY3Vyc2l2ZSgpIGFyZSBtYWRlIG9uIHRoZSBzYW1lIG11dGV4LiAgSW4gcmVhbAorCQkJLy8gY29kZSB0aGVzZSB3b3VsZCBub3QgYmUganVzdCBzZXF1ZW50aWFsIGNhbGxzIGFzIHRoaXMgd291bGQgbWFrZQorCQkJLy8gbm8gc2Vuc2UuICBJbnN0ZWFkIHRoZSBjYWxscyBhcmUgbGlrZWx5IHRvIGJlIGJ1cmllZCBpbnNpZGUKKwkJCS8vIGEgbW9yZSBjb21wbGV4IGNhbGwgc3RydWN0dXJlLgorICAgICAgICAgICAgeFNlbWFwaG9yZVRha2VSZWN1cnNpdmUoIHhNdXRleCwgKCBUaWNrVHlwZV90ICkgMTAgKTsKKyAgICAgICAgICAgIHhTZW1hcGhvcmVUYWtlUmVjdXJzaXZlKCB4TXV0ZXgsICggVGlja1R5cGVfdCApIDEwICk7CisKKyAgICAgICAgICAgIC8vIFRoZSBtdXRleCBoYXMgbm93IGJlZW4gJ3Rha2VuJyB0aHJlZSB0aW1lcywgc28gd2lsbCBub3QgYmUKKwkJCS8vIGF2YWlsYWJsZSB0byBhbm90aGVyIHRhc2sgdW50aWwgaXQgaGFzIGFsc28gYmVlbiBnaXZlbiBiYWNrCisJCQkvLyB0aHJlZSB0aW1lcy4gIEFnYWluIGl0IGlzIHVubGlrZWx5IHRoYXQgcmVhbCBjb2RlIHdvdWxkIGhhdmUKKwkJCS8vIHRoZXNlIGNhbGxzIHNlcXVlbnRpYWxseSwgaXQgd291bGQgYmUgbW9yZSBsaWtlbHkgdGhhdCB0aGUgY2FsbHMKKwkJCS8vIHRvIHhTZW1hcGhvcmVHaXZlUmVjdXJzaXZlKCkgd291bGQgYmUgY2FsbGVkIGFzIGEgY2FsbCBzdGFjaworCQkJLy8gdW53b3VuZC4gIFRoaXMgaXMganVzdCBmb3IgZGVtb25zdHJhdGl2ZSBwdXJwb3Nlcy4KKyAgICAgICAgICAgIHhTZW1hcGhvcmVHaXZlUmVjdXJzaXZlKCB4TXV0ZXggKTsKKwkJCXhTZW1hcGhvcmVHaXZlUmVjdXJzaXZlKCB4TXV0ZXggKTsKKwkJCXhTZW1hcGhvcmVHaXZlUmVjdXJzaXZlKCB4TXV0ZXggKTsKKworCQkJLy8gTm93IHRoZSBtdXRleCBjYW4gYmUgdGFrZW4gYnkgb3RoZXIgdGFza3MuCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBjb3VsZCBub3Qgb2J0YWluIHRoZSBtdXRleCBhbmQgY2FuIHRoZXJlZm9yZSBub3QgYWNjZXNzCisgICAgICAgICAgICAvLyB0aGUgc2hhcmVkIHJlc291cmNlIHNhZmVseS4KKyAgICAgICAgfQorICAgIH0KKyB9CisgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFNlbWFwaG9yZUdpdmVSZWN1cnNpdmUgeFNlbWFwaG9yZUdpdmVSZWN1cnNpdmUKKyAqIFxpbmdyb3VwIFNlbWFwaG9yZXMKKyAqLworI2lmKCBjb25maWdVU0VfUkVDVVJTSVZFX01VVEVYRVMgPT0gMSApCisJI2RlZmluZSB4U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSggeE11dGV4ICkJeFF1ZXVlR2l2ZU11dGV4UmVjdXJzaXZlKCAoIHhNdXRleCApICkKKyNlbmRpZgorCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT4KKyB4U2VtYXBob3JlR2l2ZUZyb21JU1IoCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4KKyAgICAgICAgICAgICAgICAgICAgICApPC9wcmU+CisgKgorICogPGk+TWFjcm88L2k+IHRvICByZWxlYXNlIGEgc2VtYXBob3JlLiAgVGhlIHNlbWFwaG9yZSBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuCisgKiBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKSBvciB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoKS4KKyAqCisgKiBNdXRleCB0eXBlIHNlbWFwaG9yZXMgKHRob3NlIGNyZWF0ZWQgdXNpbmcgYSBjYWxsIHRvIHhTZW1hcGhvcmVDcmVhdGVNdXRleCgpKQorICogbXVzdCBub3QgYmUgdXNlZCB3aXRoIHRoaXMgbWFjcm8uCisgKgorICogVGhpcyBtYWNybyBjYW4gYmUgdXNlZCBmcm9tIGFuIElTUi4KKyAqCisgKiBAcGFyYW0geFNlbWFwaG9yZSBBIGhhbmRsZSB0byB0aGUgc2VtYXBob3JlIGJlaW5nIHJlbGVhc2VkLiAgVGhpcyBpcyB0aGUKKyAqIGhhbmRsZSByZXR1cm5lZCB3aGVuIHRoZSBzZW1hcGhvcmUgd2FzIGNyZWF0ZWQuCisgKgorICogQHBhcmFtIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4geFNlbWFwaG9yZUdpdmVGcm9tSVNSKCkgd2lsbCBzZXQKKyAqICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHRvIHBkVFJVRSBpZiBnaXZpbmcgdGhlIHNlbWFwaG9yZSBjYXVzZWQgYSB0YXNrCisgKiB0byB1bmJsb2NrLCBhbmQgdGhlIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50bHkKKyAqIHJ1bm5pbmcgdGFzay4gIElmIHhTZW1hcGhvcmVHaXZlRnJvbUlTUigpIHNldHMgdGhpcyB2YWx1ZSB0byBwZFRSVUUgdGhlbgorICogYSBjb250ZXh0IHN3aXRjaCBzaG91bGQgYmUgcmVxdWVzdGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIGV4aXRlZC4KKyAqCisgKiBAcmV0dXJuIHBkVFJVRSBpZiB0aGUgc2VtYXBob3JlIHdhcyBzdWNjZXNzZnVsbHkgZ2l2ZW4sIG90aGVyd2lzZSBlcnJRVUVVRV9GVUxMLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgPHByZT4KKyBcI2RlZmluZSBMT05HX1RJTUUgMHhmZmZmCisgXCNkZWZpbmUgVElDS1NfVE9fV0FJVAkxMAorIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmUgPSBOVUxMOworCisgLy8gUmVwZXRpdGl2ZSB0YXNrLgorIHZvaWQgdkFUYXNrKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgICAgZm9yKCA7OyApCisgICAgeworICAgICAgICAvLyBXZSB3YW50IHRoaXMgdGFzayB0byBydW4gZXZlcnkgMTAgdGlja3Mgb2YgYSB0aW1lci4gIFRoZSBzZW1hcGhvcmUKKyAgICAgICAgLy8gd2FzIGNyZWF0ZWQgYmVmb3JlIHRoaXMgdGFzayB3YXMgc3RhcnRlZC4KKworICAgICAgICAvLyBCbG9jayB3YWl0aW5nIGZvciB0aGUgc2VtYXBob3JlIHRvIGJlY29tZSBhdmFpbGFibGUuCisgICAgICAgIGlmKCB4U2VtYXBob3JlVGFrZSggeFNlbWFwaG9yZSwgTE9OR19USU1FICkgPT0gcGRUUlVFICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSXQgaXMgdGltZSB0byBleGVjdXRlLgorCisgICAgICAgICAgICAvLyAuLi4KKworICAgICAgICAgICAgLy8gV2UgaGF2ZSBmaW5pc2hlZCBvdXIgdGFzay4gIFJldHVybiB0byB0aGUgdG9wIG9mIHRoZSBsb29wIHdoZXJlCisgICAgICAgICAgICAvLyB3ZSB3aWxsIGJsb2NrIG9uIHRoZSBzZW1hcGhvcmUgdW50aWwgaXQgaXMgdGltZSB0byBleGVjdXRlCisgICAgICAgICAgICAvLyBhZ2Fpbi4gIE5vdGUgd2hlbiB1c2luZyB0aGUgc2VtYXBob3JlIGZvciBzeW5jaHJvbmlzYXRpb24gd2l0aCBhbgorCQkJLy8gSVNSIGluIHRoaXMgbWFubmVyIHRoZXJlIGlzIG5vIG5lZWQgdG8gJ2dpdmUnIHRoZSBzZW1hcGhvcmUgYmFjay4KKyAgICAgICAgfQorICAgIH0KKyB9CisKKyAvLyBUaW1lciBJU1IKKyB2b2lkIHZUaW1lcklTUiggdm9pZCAqIHB2UGFyYW1ldGVycyApCisgeworIHN0YXRpYyB1aW50OF90IHVjTG9jYWxUaWNrQ291bnQgPSAwOworIHN0YXRpYyBCYXNlVHlwZV90IHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbjsKKworICAgIC8vIEEgdGltZXIgdGljayBoYXMgb2NjdXJyZWQuCisKKyAgICAvLyAuLi4gRG8gb3RoZXIgdGltZSBmdW5jdGlvbnMuCisKKyAgICAvLyBJcyBpdCB0aW1lIGZvciB2QVRhc2sgKCkgdG8gcnVuPworCXhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkRkFMU0U7CisgICAgdWNMb2NhbFRpY2tDb3VudCsrOworICAgIGlmKCB1Y0xvY2FsVGlja0NvdW50ID49IFRJQ0tTX1RPX1dBSVQgKQorICAgIHsKKyAgICAgICAgLy8gVW5ibG9jayB0aGUgdGFzayBieSByZWxlYXNpbmcgdGhlIHNlbWFwaG9yZS4KKyAgICAgICAgeFNlbWFwaG9yZUdpdmVGcm9tSVNSKCB4U2VtYXBob3JlLCAmeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIGNvdW50IHNvIHdlIHJlbGVhc2UgdGhlIHNlbWFwaG9yZSBhZ2FpbiBpbiAxMCB0aWNrcyB0aW1lLgorICAgICAgICB1Y0xvY2FsVGlja0NvdW50ID0gMDsKKyAgICB9CisKKyAgICBpZiggeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICE9IHBkRkFMU0UgKQorICAgIHsKKyAgICAgICAgLy8gV2UgY2FuIGZvcmNlIGEgY29udGV4dCBzd2l0Y2ggaGVyZS4gIENvbnRleHQgc3dpdGNoaW5nIGZyb20gYW4KKyAgICAgICAgLy8gSVNSIHVzZXMgcG9ydCBzcGVjaWZpYyBzeW50YXguICBDaGVjayB0aGUgZGVtbyB0YXNrIGZvciB5b3VyIHBvcnQKKyAgICAgICAgLy8gdG8gZmluZCB0aGUgc3ludGF4IHJlcXVpcmVkLgorICAgIH0KKyB9CisgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFNlbWFwaG9yZUdpdmVGcm9tSVNSIHhTZW1hcGhvcmVHaXZlRnJvbUlTUgorICogXGluZ3JvdXAgU2VtYXBob3JlcworICovCisjZGVmaW5lIHhTZW1hcGhvcmVHaXZlRnJvbUlTUiggeFNlbWFwaG9yZSwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApCXhRdWV1ZUdpdmVGcm9tSVNSKCAoIFF1ZXVlSGFuZGxlX3QgKSAoIHhTZW1hcGhvcmUgKSwgKCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgKQorCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT4KKyB4U2VtYXBob3JlVGFrZUZyb21JU1IoCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4KKyAgICAgICAgICAgICAgICAgICAgICApPC9wcmU+CisgKgorICogPGk+TWFjcm88L2k+IHRvICB0YWtlIGEgc2VtYXBob3JlIGZyb20gYW4gSVNSLiAgVGhlIHNlbWFwaG9yZSBtdXN0IGhhdmUKKyAqIHByZXZpb3VzbHkgYmVlbiBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKSBvcgorICogeFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nKCkuCisgKgorICogTXV0ZXggdHlwZSBzZW1hcGhvcmVzICh0aG9zZSBjcmVhdGVkIHVzaW5nIGEgY2FsbCB0byB4U2VtYXBob3JlQ3JlYXRlTXV0ZXgoKSkKKyAqIG11c3Qgbm90IGJlIHVzZWQgd2l0aCB0aGlzIG1hY3JvLgorICoKKyAqIFRoaXMgbWFjcm8gY2FuIGJlIHVzZWQgZnJvbSBhbiBJU1IsIGhvd2V2ZXIgdGFraW5nIGEgc2VtYXBob3JlIGZyb20gYW4gSVNSCisgKiBpcyBub3QgYSBjb21tb24gb3BlcmF0aW9uLiAgSXQgaXMgbGlrZWx5IHRvIG9ubHkgYmUgdXNlZnVsIHdoZW4gdGFraW5nIGEKKyAqIGNvdW50aW5nIHNlbWFwaG9yZSB3aGVuIGFuIGludGVycnVwdCBpcyBvYnRhaW5pbmcgYW4gb2JqZWN0IGZyb20gYSByZXNvdXJjZQorICogcG9vbCAod2hlbiB0aGUgc2VtYXBob3JlIGNvdW50IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUpLgorICoKKyAqIEBwYXJhbSB4U2VtYXBob3JlIEEgaGFuZGxlIHRvIHRoZSBzZW1hcGhvcmUgYmVpbmcgdGFrZW4uICBUaGlzIGlzIHRoZQorICogaGFuZGxlIHJldHVybmVkIHdoZW4gdGhlIHNlbWFwaG9yZSB3YXMgY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0gcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB4U2VtYXBob3JlVGFrZUZyb21JU1IoKSB3aWxsIHNldAorICogKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gdG8gcGRUUlVFIGlmIHRha2luZyB0aGUgc2VtYXBob3JlIGNhdXNlZCBhIHRhc2sKKyAqIHRvIHVuYmxvY2ssIGFuZCB0aGUgdW5ibG9ja2VkIHRhc2sgaGFzIGEgcHJpb3JpdHkgaGlnaGVyIHRoYW4gdGhlIGN1cnJlbnRseQorICogcnVubmluZyB0YXNrLiAgSWYgeFNlbWFwaG9yZVRha2VGcm9tSVNSKCkgc2V0cyB0aGlzIHZhbHVlIHRvIHBkVFJVRSB0aGVuCisgKiBhIGNvbnRleHQgc3dpdGNoIHNob3VsZCBiZSByZXF1ZXN0ZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgaXMgZXhpdGVkLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIHRoZSBzZW1hcGhvcmUgd2FzIHN1Y2Nlc3NmdWxseSB0YWtlbiwgb3RoZXJ3aXNlCisgKiBwZEZBTFNFCisgKi8KKyNkZWZpbmUgeFNlbWFwaG9yZVRha2VGcm9tSVNSKCB4U2VtYXBob3JlLCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkJeFF1ZXVlUmVjZWl2ZUZyb21JU1IoICggUXVldWVIYW5kbGVfdCApICggeFNlbWFwaG9yZSApLCBOVUxMLCAoIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSApCisKKy8qKgorICogc2VtcGhyLiBoCisgKiA8cHJlPlNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmVDcmVhdGVNdXRleCggdm9pZCApPC9wcmU+CisgKgorICogQ3JlYXRlcyBhIG5ldyBtdXRleCB0eXBlIHNlbWFwaG9yZSBpbnN0YW5jZSwgYW5kIHJldHVybnMgYSBoYW5kbGUgYnkgd2hpY2gKKyAqIHRoZSBuZXcgbXV0ZXggY2FuIGJlIHJlZmVyZW5jZWQuCisgKgorICogSW50ZXJuYWxseSwgd2l0aGluIHRoZSBGcmVlUlRPUyBpbXBsZW1lbnRhdGlvbiwgbXV0ZXggc2VtYXBob3JlcyB1c2UgYSBibG9jaworICogb2YgbWVtb3J5LCBpbiB3aGljaCB0aGUgbXV0ZXggc3RydWN0dXJlIGlzIHN0b3JlZC4gIElmIGEgbXV0ZXggaXMgY3JlYXRlZAorICogdXNpbmcgeFNlbWFwaG9yZUNyZWF0ZU11dGV4KCkgdGhlbiB0aGUgcmVxdWlyZWQgbWVtb3J5IGlzIGF1dG9tYXRpY2FsbHkKKyAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpbnNpZGUgdGhlIHhTZW1hcGhvcmVDcmVhdGVNdXRleCgpIGZ1bmN0aW9uLiAgKHNlZQorICogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTExLmh0bWwpLiAgSWYgYSBtdXRleCBpcyBjcmVhdGVkIHVzaW5nCisgKiB4U2VtYXBob3JlQ3JlYXRlTXV0ZXhTdGF0aWMoKSB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwcm92aWRlZCB0aGUKKyAqIG1lbW9yeS4gIHhTZW1hcGhvcmVDcmVhdGVNdXRleFN0YXRpYygpIHRoZXJlZm9yZSBhbGxvd3MgYSBtdXRleCB0byBiZSBjcmVhdGVkCisgKiB3aXRob3V0IHVzaW5nIGFueSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIE11dGV4ZXMgY3JlYXRlZCB1c2luZyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgeFNlbWFwaG9yZVRha2UoKQorICogYW5kIHhTZW1hcGhvcmVHaXZlKCkgbWFjcm9zLiAgVGhlIHhTZW1hcGhvcmVUYWtlUmVjdXJzaXZlKCkgYW5kCisgKiB4U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSgpIG1hY3JvcyBtdXN0IG5vdCBiZSB1c2VkLgorICoKKyAqIFRoaXMgdHlwZSBvZiBzZW1hcGhvcmUgdXNlcyBhIHByaW9yaXR5IGluaGVyaXRhbmNlIG1lY2hhbmlzbSBzbyBhIHRhc2sKKyAqICd0YWtpbmcnIGEgc2VtYXBob3JlIE1VU1QgQUxXQVlTICdnaXZlJyB0aGUgc2VtYXBob3JlIGJhY2sgb25jZSB0aGUKKyAqIHNlbWFwaG9yZSBpdCBpcyBubyBsb25nZXIgcmVxdWlyZWQuCisgKgorICogTXV0ZXggdHlwZSBzZW1hcGhvcmVzIGNhbm5vdCBiZSB1c2VkIGZyb20gd2l0aGluIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzLgorICoKKyAqIFNlZSB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCkgZm9yIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIGJlCisgKiB1c2VkIGZvciBwdXJlIHN5bmNocm9uaXNhdGlvbiAod2hlcmUgb25lIHRhc2sgb3IgaW50ZXJydXB0IGFsd2F5cyAnZ2l2ZXMnIHRoZQorICogc2VtYXBob3JlIGFuZCBhbm90aGVyIGFsd2F5cyAndGFrZXMnIHRoZSBzZW1hcGhvcmUpIGFuZCBmcm9tIHdpdGhpbiBpbnRlcnJ1cHQKKyAqIHNlcnZpY2Ugcm91dGluZXMuCisgKgorICogQHJldHVybiBJZiB0aGUgbXV0ZXggd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHRoZW4gYSBoYW5kbGUgdG8gdGhlIGNyZWF0ZWQKKyAqIHNlbWFwaG9yZSBpcyByZXR1cm5lZC4gIElmIHRoZXJlIHdhcyBub3QgZW5vdWdoIGhlYXAgdG8gYWxsb2NhdGUgdGhlIG11dGV4CisgKiBkYXRhIHN0cnVjdHVyZXMgdGhlbiBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgPHByZT4KKyBTZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlOworCisgdm9pZCB2QVRhc2soIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorIHsKKyAgICAvLyBTZW1hcGhvcmUgY2Fubm90IGJlIHVzZWQgYmVmb3JlIGEgY2FsbCB0byB4U2VtYXBob3JlQ3JlYXRlTXV0ZXgoKS4KKyAgICAvLyBUaGlzIGlzIGEgbWFjcm8gc28gcGFzcyB0aGUgdmFyaWFibGUgaW4gZGlyZWN0bHkuCisgICAgeFNlbWFwaG9yZSA9IHhTZW1hcGhvcmVDcmVhdGVNdXRleCgpOworCisgICAgaWYoIHhTZW1hcGhvcmUgIT0gTlVMTCApCisgICAgeworICAgICAgICAvLyBUaGUgc2VtYXBob3JlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgLy8gVGhlIHNlbWFwaG9yZSBjYW4gbm93IGJlIHVzZWQuCisgICAgfQorIH0KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4U2VtYXBob3JlQ3JlYXRlTXV0ZXggeFNlbWFwaG9yZUNyZWF0ZU11dGV4CisgKiBcaW5ncm91cCBTZW1hcGhvcmVzCisgKi8KKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisJI2RlZmluZSB4U2VtYXBob3JlQ3JlYXRlTXV0ZXgoKSB4UXVldWVDcmVhdGVNdXRleCggcXVldWVRVUVVRV9UWVBFX01VVEVYICkKKyNlbmRpZgorCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT5TZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlQ3JlYXRlTXV0ZXhTdGF0aWMoIFN0YXRpY1NlbWFwaG9yZV90ICpweE11dGV4QnVmZmVyICk8L3ByZT4KKyAqCisgKiBDcmVhdGVzIGEgbmV3IG11dGV4IHR5cGUgc2VtYXBob3JlIGluc3RhbmNlLCBhbmQgcmV0dXJucyBhIGhhbmRsZSBieSB3aGljaAorICogdGhlIG5ldyBtdXRleCBjYW4gYmUgcmVmZXJlbmNlZC4KKyAqCisgKiBJbnRlcm5hbGx5LCB3aXRoaW4gdGhlIEZyZWVSVE9TIGltcGxlbWVudGF0aW9uLCBtdXRleCBzZW1hcGhvcmVzIHVzZSBhIGJsb2NrCisgKiBvZiBtZW1vcnksIGluIHdoaWNoIHRoZSBtdXRleCBzdHJ1Y3R1cmUgaXMgc3RvcmVkLiAgSWYgYSBtdXRleCBpcyBjcmVhdGVkCisgKiB1c2luZyB4U2VtYXBob3JlQ3JlYXRlTXV0ZXgoKSB0aGVuIHRoZSByZXF1aXJlZCBtZW1vcnkgaXMgYXV0b21hdGljYWxseQorICogZHluYW1pY2FsbHkgYWxsb2NhdGVkIGluc2lkZSB0aGUgeFNlbWFwaG9yZUNyZWF0ZU11dGV4KCkgZnVuY3Rpb24uICAoc2VlCisgKiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTEuaHRtbCkuICBJZiBhIG11dGV4IGlzIGNyZWF0ZWQgdXNpbmcKKyAqIHhTZW1hcGhvcmVDcmVhdGVNdXRleFN0YXRpYygpIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0IHByb3ZpZGVkIHRoZQorICogbWVtb3J5LiAgeFNlbWFwaG9yZUNyZWF0ZU11dGV4U3RhdGljKCkgdGhlcmVmb3JlIGFsbG93cyBhIG11dGV4IHRvIGJlIGNyZWF0ZWQKKyAqIHdpdGhvdXQgdXNpbmcgYW55IGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogTXV0ZXhlcyBjcmVhdGVkIHVzaW5nIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIHRoZSB4U2VtYXBob3JlVGFrZSgpCisgKiBhbmQgeFNlbWFwaG9yZUdpdmUoKSBtYWNyb3MuICBUaGUgeFNlbWFwaG9yZVRha2VSZWN1cnNpdmUoKSBhbmQKKyAqIHhTZW1hcGhvcmVHaXZlUmVjdXJzaXZlKCkgbWFjcm9zIG11c3Qgbm90IGJlIHVzZWQuCisgKgorICogVGhpcyB0eXBlIG9mIHNlbWFwaG9yZSB1c2VzIGEgcHJpb3JpdHkgaW5oZXJpdGFuY2UgbWVjaGFuaXNtIHNvIGEgdGFzaworICogJ3Rha2luZycgYSBzZW1hcGhvcmUgTVVTVCBBTFdBWVMgJ2dpdmUnIHRoZSBzZW1hcGhvcmUgYmFjayBvbmNlIHRoZQorICogc2VtYXBob3JlIGl0IGlzIG5vIGxvbmdlciByZXF1aXJlZC4KKyAqCisgKiBNdXRleCB0eXBlIHNlbWFwaG9yZXMgY2Fubm90IGJlIHVzZWQgZnJvbSB3aXRoaW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMuCisgKgorICogU2VlIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKSBmb3IgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gdGhhdCBjYW4gYmUKKyAqIHVzZWQgZm9yIHB1cmUgc3luY2hyb25pc2F0aW9uICh3aGVyZSBvbmUgdGFzayBvciBpbnRlcnJ1cHQgYWx3YXlzICdnaXZlcycgdGhlCisgKiBzZW1hcGhvcmUgYW5kIGFub3RoZXIgYWx3YXlzICd0YWtlcycgdGhlIHNlbWFwaG9yZSkgYW5kIGZyb20gd2l0aGluIGludGVycnVwdAorICogc2VydmljZSByb3V0aW5lcy4KKyAqCisgKiBAcGFyYW0gcHhNdXRleEJ1ZmZlciBNdXN0IHBvaW50IHRvIGEgdmFyaWFibGUgb2YgdHlwZSBTdGF0aWNTZW1hcGhvcmVfdCwKKyAqIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBob2xkIHRoZSBtdXRleCdzIGRhdGEgc3RydWN0dXJlLCByZW1vdmluZyB0aGUgbmVlZCBmb3IKKyAqIHRoZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgorICoKKyAqIEByZXR1cm4gSWYgdGhlIG11dGV4IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCB0aGVuIGEgaGFuZGxlIHRvIHRoZSBjcmVhdGVkCisgKiBtdXRleCBpcyByZXR1cm5lZC4gIElmIHB4TXV0ZXhCdWZmZXIgd2FzIE5VTEwgdGhlbiBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgPHByZT4KKyBTZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlOworIFN0YXRpY1NlbWFwaG9yZV90IHhNdXRleEJ1ZmZlcjsKKworIHZvaWQgdkFUYXNrKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgICAgLy8gQSBtdXRleCBjYW5ub3QgYmUgdXNlZCBiZWZvcmUgaXQgaGFzIGJlZW4gY3JlYXRlZC4gIHhNdXRleEJ1ZmZlciBpcworICAgIC8vIGludG8geFNlbWFwaG9yZUNyZWF0ZU11dGV4U3RhdGljKCkgc28gbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBpcworICAgIC8vIGF0dGVtcHRlZC4KKyAgICB4U2VtYXBob3JlID0geFNlbWFwaG9yZUNyZWF0ZU11dGV4U3RhdGljKCAmeE11dGV4QnVmZmVyICk7CisKKyAgICAvLyBBcyBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHdhcyBwZXJmb3JtZWQsIHhTZW1hcGhvcmUgY2Fubm90IGJlIE5VTEwsCisgICAgLy8gc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpdC4KKyB9CisgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFNlbWFwaG9yZUNyZWF0ZU11dGV4U3RhdGljIHhTZW1hcGhvcmVDcmVhdGVNdXRleFN0YXRpYworICogXGluZ3JvdXAgU2VtYXBob3JlcworICovCisgI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCSNkZWZpbmUgeFNlbWFwaG9yZUNyZWF0ZU11dGV4U3RhdGljKCBweE11dGV4QnVmZmVyICkgeFF1ZXVlQ3JlYXRlTXV0ZXhTdGF0aWMoIHF1ZXVlUVVFVUVfVFlQRV9NVVRFWCwgKCBweE11dGV4QnVmZmVyICkgKQorI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKworCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT5TZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXgoIHZvaWQgKTwvcHJlPgorICoKKyAqIENyZWF0ZXMgYSBuZXcgcmVjdXJzaXZlIG11dGV4IHR5cGUgc2VtYXBob3JlIGluc3RhbmNlLCBhbmQgcmV0dXJucyBhIGhhbmRsZQorICogYnkgd2hpY2ggdGhlIG5ldyByZWN1cnNpdmUgbXV0ZXggY2FuIGJlIHJlZmVyZW5jZWQuCisgKgorICogSW50ZXJuYWxseSwgd2l0aGluIHRoZSBGcmVlUlRPUyBpbXBsZW1lbnRhdGlvbiwgcmVjdXJzaXZlIG11dGV4cyB1c2UgYSBibG9jaworICogb2YgbWVtb3J5LCBpbiB3aGljaCB0aGUgbXV0ZXggc3RydWN0dXJlIGlzIHN0b3JlZC4gIElmIGEgcmVjdXJzaXZlIG11dGV4IGlzCisgKiBjcmVhdGVkIHVzaW5nIHhTZW1hcGhvcmVDcmVhdGVSZWN1cnNpdmVNdXRleCgpIHRoZW4gdGhlIHJlcXVpcmVkIG1lbW9yeSBpcworICogYXV0b21hdGljYWxseSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgaW5zaWRlIHRoZQorICogeFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4KCkgZnVuY3Rpb24uICAoc2VlCisgKiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTEuaHRtbCkuICBJZiBhIHJlY3Vyc2l2ZSBtdXRleCBpcyBjcmVhdGVkIHVzaW5nCisgKiB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXhTdGF0aWMoKSB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdAorICogcHJvdmlkZSB0aGUgbWVtb3J5IHRoYXQgd2lsbCBnZXQgdXNlZCBieSB0aGUgbXV0ZXguCisgKiB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXhTdGF0aWMoKSB0aGVyZWZvcmUgYWxsb3dzIGEgcmVjdXJzaXZlIG11dGV4IHRvCisgKiBiZSBjcmVhdGVkIHdpdGhvdXQgdXNpbmcgYW55IGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogTXV0ZXhlcyBjcmVhdGVkIHVzaW5nIHRoaXMgbWFjcm8gY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIHRoZQorICogeFNlbWFwaG9yZVRha2VSZWN1cnNpdmUoKSBhbmQgeFNlbWFwaG9yZUdpdmVSZWN1cnNpdmUoKSBtYWNyb3MuICBUaGUKKyAqIHhTZW1hcGhvcmVUYWtlKCkgYW5kIHhTZW1hcGhvcmVHaXZlKCkgbWFjcm9zIG11c3Qgbm90IGJlIHVzZWQuCisgKgorICogQSBtdXRleCB1c2VkIHJlY3Vyc2l2ZWx5IGNhbiBiZSAndGFrZW4nIHJlcGVhdGVkbHkgYnkgdGhlIG93bmVyLiBUaGUgbXV0ZXgKKyAqIGRvZXNuJ3QgYmVjb21lIGF2YWlsYWJsZSBhZ2FpbiB1bnRpbCB0aGUgb3duZXIgaGFzIGNhbGxlZAorICogeFNlbWFwaG9yZUdpdmVSZWN1cnNpdmUoKSBmb3IgZWFjaCBzdWNjZXNzZnVsICd0YWtlJyByZXF1ZXN0LiAgRm9yIGV4YW1wbGUsCisgKiBpZiBhIHRhc2sgc3VjY2Vzc2Z1bGx5ICd0YWtlcycgdGhlIHNhbWUgbXV0ZXggNSB0aW1lcyB0aGVuIHRoZSBtdXRleCB3aWxsCisgKiBub3QgYmUgYXZhaWxhYmxlIHRvIGFueSBvdGhlciB0YXNrIHVudGlsIGl0IGhhcyBhbHNvICAnZ2l2ZW4nIHRoZSBtdXRleCBiYWNrCisgKiBleGFjdGx5IGZpdmUgdGltZXMuCisgKgorICogVGhpcyB0eXBlIG9mIHNlbWFwaG9yZSB1c2VzIGEgcHJpb3JpdHkgaW5oZXJpdGFuY2UgbWVjaGFuaXNtIHNvIGEgdGFzaworICogJ3Rha2luZycgYSBzZW1hcGhvcmUgTVVTVCBBTFdBWVMgJ2dpdmUnIHRoZSBzZW1hcGhvcmUgYmFjayBvbmNlIHRoZQorICogc2VtYXBob3JlIGl0IGlzIG5vIGxvbmdlciByZXF1aXJlZC4KKyAqCisgKiBNdXRleCB0eXBlIHNlbWFwaG9yZXMgY2Fubm90IGJlIHVzZWQgZnJvbSB3aXRoaW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMuCisgKgorICogU2VlIHhTZW1hcGhvcmVDcmVhdGVCaW5hcnkoKSBmb3IgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gdGhhdCBjYW4gYmUKKyAqIHVzZWQgZm9yIHB1cmUgc3luY2hyb25pc2F0aW9uICh3aGVyZSBvbmUgdGFzayBvciBpbnRlcnJ1cHQgYWx3YXlzICdnaXZlcycgdGhlCisgKiBzZW1hcGhvcmUgYW5kIGFub3RoZXIgYWx3YXlzICd0YWtlcycgdGhlIHNlbWFwaG9yZSkgYW5kIGZyb20gd2l0aGluIGludGVycnVwdAorICogc2VydmljZSByb3V0aW5lcy4KKyAqCisgKiBAcmV0dXJuIHhTZW1hcGhvcmUgSGFuZGxlIHRvIHRoZSBjcmVhdGVkIG11dGV4IHNlbWFwaG9yZS4gIFNob3VsZCBiZSBvZiB0eXBlCisgKiBTZW1hcGhvcmVIYW5kbGVfdC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorIDxwcmU+CisgU2VtYXBob3JlSGFuZGxlX3QgeFNlbWFwaG9yZTsKKworIHZvaWQgdkFUYXNrKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgICAgLy8gU2VtYXBob3JlIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSBhIGNhbGwgdG8geFNlbWFwaG9yZUNyZWF0ZU11dGV4KCkuCisgICAgLy8gVGhpcyBpcyBhIG1hY3JvIHNvIHBhc3MgdGhlIHZhcmlhYmxlIGluIGRpcmVjdGx5LgorICAgIHhTZW1hcGhvcmUgPSB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXgoKTsKKworICAgIGlmKCB4U2VtYXBob3JlICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgLy8gVGhlIHNlbWFwaG9yZSB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICAgIC8vIFRoZSBzZW1hcGhvcmUgY2FuIG5vdyBiZSB1c2VkLgorICAgIH0KKyB9CisgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4IHhTZW1hcGhvcmVDcmVhdGVSZWN1cnNpdmVNdXRleAorICogXGluZ3JvdXAgU2VtYXBob3JlcworICovCisjaWYoICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTID09IDEgKSApCisJI2RlZmluZSB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXgoKSB4UXVldWVDcmVhdGVNdXRleCggcXVldWVRVUVVRV9UWVBFX1JFQ1VSU0lWRV9NVVRFWCApCisjZW5kaWYKKworLyoqCisgKiBzZW1waHIuIGgKKyAqIDxwcmU+U2VtYXBob3JlSGFuZGxlX3QgeFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4U3RhdGljKCBTdGF0aWNTZW1hcGhvcmVfdCAqcHhNdXRleEJ1ZmZlciApPC9wcmU+CisgKgorICogQ3JlYXRlcyBhIG5ldyByZWN1cnNpdmUgbXV0ZXggdHlwZSBzZW1hcGhvcmUgaW5zdGFuY2UsIGFuZCByZXR1cm5zIGEgaGFuZGxlCisgKiBieSB3aGljaCB0aGUgbmV3IHJlY3Vyc2l2ZSBtdXRleCBjYW4gYmUgcmVmZXJlbmNlZC4KKyAqCisgKiBJbnRlcm5hbGx5LCB3aXRoaW4gdGhlIEZyZWVSVE9TIGltcGxlbWVudGF0aW9uLCByZWN1cnNpdmUgbXV0ZXhzIHVzZSBhIGJsb2NrCisgKiBvZiBtZW1vcnksIGluIHdoaWNoIHRoZSBtdXRleCBzdHJ1Y3R1cmUgaXMgc3RvcmVkLiAgSWYgYSByZWN1cnNpdmUgbXV0ZXggaXMKKyAqIGNyZWF0ZWQgdXNpbmcgeFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4KCkgdGhlbiB0aGUgcmVxdWlyZWQgbWVtb3J5IGlzCisgKiBhdXRvbWF0aWNhbGx5IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpbnNpZGUgdGhlCisgKiB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXgoKSBmdW5jdGlvbi4gIChzZWUKKyAqIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExMS5odG1sKS4gIElmIGEgcmVjdXJzaXZlIG11dGV4IGlzIGNyZWF0ZWQgdXNpbmcKKyAqIHhTZW1hcGhvcmVDcmVhdGVSZWN1cnNpdmVNdXRleFN0YXRpYygpIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0CisgKiBwcm92aWRlIHRoZSBtZW1vcnkgdGhhdCB3aWxsIGdldCB1c2VkIGJ5IHRoZSBtdXRleC4KKyAqIHhTZW1hcGhvcmVDcmVhdGVSZWN1cnNpdmVNdXRleFN0YXRpYygpIHRoZXJlZm9yZSBhbGxvd3MgYSByZWN1cnNpdmUgbXV0ZXggdG8KKyAqIGJlIGNyZWF0ZWQgd2l0aG91dCB1c2luZyBhbnkgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBNdXRleGVzIGNyZWF0ZWQgdXNpbmcgdGhpcyBtYWNybyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgdGhlCisgKiB4U2VtYXBob3JlVGFrZVJlY3Vyc2l2ZSgpIGFuZCB4U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSgpIG1hY3Jvcy4gIFRoZQorICogeFNlbWFwaG9yZVRha2UoKSBhbmQgeFNlbWFwaG9yZUdpdmUoKSBtYWNyb3MgbXVzdCBub3QgYmUgdXNlZC4KKyAqCisgKiBBIG11dGV4IHVzZWQgcmVjdXJzaXZlbHkgY2FuIGJlICd0YWtlbicgcmVwZWF0ZWRseSBieSB0aGUgb3duZXIuIFRoZSBtdXRleAorICogZG9lc24ndCBiZWNvbWUgYXZhaWxhYmxlIGFnYWluIHVudGlsIHRoZSBvd25lciBoYXMgY2FsbGVkCisgKiB4U2VtYXBob3JlR2l2ZVJlY3Vyc2l2ZSgpIGZvciBlYWNoIHN1Y2Nlc3NmdWwgJ3Rha2UnIHJlcXVlc3QuICBGb3IgZXhhbXBsZSwKKyAqIGlmIGEgdGFzayBzdWNjZXNzZnVsbHkgJ3Rha2VzJyB0aGUgc2FtZSBtdXRleCA1IHRpbWVzIHRoZW4gdGhlIG11dGV4IHdpbGwKKyAqIG5vdCBiZSBhdmFpbGFibGUgdG8gYW55IG90aGVyIHRhc2sgdW50aWwgaXQgaGFzIGFsc28gICdnaXZlbicgdGhlIG11dGV4IGJhY2sKKyAqIGV4YWN0bHkgZml2ZSB0aW1lcy4KKyAqCisgKiBUaGlzIHR5cGUgb2Ygc2VtYXBob3JlIHVzZXMgYSBwcmlvcml0eSBpbmhlcml0YW5jZSBtZWNoYW5pc20gc28gYSB0YXNrCisgKiAndGFraW5nJyBhIHNlbWFwaG9yZSBNVVNUIEFMV0FZUyAnZ2l2ZScgdGhlIHNlbWFwaG9yZSBiYWNrIG9uY2UgdGhlCisgKiBzZW1hcGhvcmUgaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgorICoKKyAqIE11dGV4IHR5cGUgc2VtYXBob3JlcyBjYW5ub3QgYmUgdXNlZCBmcm9tIHdpdGhpbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcy4KKyAqCisgKiBTZWUgeFNlbWFwaG9yZUNyZWF0ZUJpbmFyeSgpIGZvciBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBiZQorICogdXNlZCBmb3IgcHVyZSBzeW5jaHJvbmlzYXRpb24gKHdoZXJlIG9uZSB0YXNrIG9yIGludGVycnVwdCBhbHdheXMgJ2dpdmVzJyB0aGUKKyAqIHNlbWFwaG9yZSBhbmQgYW5vdGhlciBhbHdheXMgJ3Rha2VzJyB0aGUgc2VtYXBob3JlKSBhbmQgZnJvbSB3aXRoaW4gaW50ZXJydXB0CisgKiBzZXJ2aWNlIHJvdXRpbmVzLgorICoKKyAqIEBwYXJhbSBweE11dGV4QnVmZmVyIE11c3QgcG9pbnQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlIFN0YXRpY1NlbWFwaG9yZV90LAorICogd2hpY2ggd2lsbCB0aGVuIGJlIHVzZWQgdG8gaG9sZCB0aGUgcmVjdXJzaXZlIG11dGV4J3MgZGF0YSBzdHJ1Y3R1cmUsCisgKiByZW1vdmluZyB0aGUgbmVlZCBmb3IgdGhlIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisgKgorICogQHJldHVybiBJZiB0aGUgcmVjdXJzaXZlIG11dGV4IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCB0aGVuIGEgaGFuZGxlIHRvIHRoZQorICogY3JlYXRlZCByZWN1cnNpdmUgbXV0ZXggaXMgcmV0dXJuZWQuICBJZiBweE11dGV4QnVmZmVyIHdhcyBOVUxMIHRoZW4gTlVMTCBpcworICogcmV0dXJuZWQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyA8cHJlPgorIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmU7CisgU3RhdGljU2VtYXBob3JlX3QgeE11dGV4QnVmZmVyOworCisgdm9pZCB2QVRhc2soIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorIHsKKyAgICAvLyBBIHJlY3Vyc2l2ZSBzZW1hcGhvcmUgY2Fubm90IGJlIHVzZWQgYmVmb3JlIGl0IGlzIGNyZWF0ZWQuICBIZXJlIGEKKyAgICAvLyByZWN1cnNpdmUgbXV0ZXggaXMgY3JlYXRlZCB1c2luZyB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXhTdGF0aWMoKS4KKyAgICAvLyBUaGUgYWRkcmVzcyBvZiB4TXV0ZXhCdWZmZXIgaXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uLCBhbmQgd2lsbCBob2xkCisgICAgLy8gdGhlIG11dGV4ZXMgZGF0YSBzdHJ1Y3R1cmVzIC0gc28gbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiB3aWxsIGJlCisgICAgLy8gYXR0ZW1wdGVkLgorICAgIHhTZW1hcGhvcmUgPSB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXhTdGF0aWMoICZ4TXV0ZXhCdWZmZXIgKTsKKworICAgIC8vIEFzIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgeFNlbWFwaG9yZSBjYW5ub3QgYmUgTlVMTCwKKyAgICAvLyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGl0LgorIH0KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4U2VtYXBob3JlQ3JlYXRlUmVjdXJzaXZlTXV0ZXhTdGF0aWMgeFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4U3RhdGljCisgKiBcaW5ncm91cCBTZW1hcGhvcmVzCisgKi8KKyNpZiggKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSAmJiAoIGNvbmZpZ1VTRV9SRUNVUlNJVkVfTVVURVhFUyA9PSAxICkgKQorCSNkZWZpbmUgeFNlbWFwaG9yZUNyZWF0ZVJlY3Vyc2l2ZU11dGV4U3RhdGljKCBweFN0YXRpY1NlbWFwaG9yZSApIHhRdWV1ZUNyZWF0ZU11dGV4U3RhdGljKCBxdWV1ZVFVRVVFX1RZUEVfUkVDVVJTSVZFX01VVEVYLCBweFN0YXRpY1NlbWFwaG9yZSApCisjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAqLworCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT5TZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoIFVCYXNlVHlwZV90IHV4TWF4Q291bnQsIFVCYXNlVHlwZV90IHV4SW5pdGlhbENvdW50ICk8L3ByZT4KKyAqCisgKiBDcmVhdGVzIGEgbmV3IGNvdW50aW5nIHNlbWFwaG9yZSBpbnN0YW5jZSwgYW5kIHJldHVybnMgYSBoYW5kbGUgYnkgd2hpY2ggdGhlCisgKiBuZXcgY291bnRpbmcgc2VtYXBob3JlIGNhbiBiZSByZWZlcmVuY2VkLgorICoKKyAqIEluIG1hbnkgdXNhZ2Ugc2NlbmFyaW9zIGl0IGlzIGZhc3RlciBhbmQgbW9yZSBtZW1vcnkgZWZmaWNpZW50IHRvIHVzZSBhCisgKiBkaXJlY3QgdG8gdGFzayBub3RpZmljYXRpb24gaW4gcGxhY2Ugb2YgYSBjb3VudGluZyBzZW1hcGhvcmUhCisgKiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLXRhc2stbm90aWZpY2F0aW9ucy5odG1sCisgKgorICogSW50ZXJuYWxseSwgd2l0aGluIHRoZSBGcmVlUlRPUyBpbXBsZW1lbnRhdGlvbiwgY291bnRpbmcgc2VtYXBob3JlcyB1c2UgYQorICogYmxvY2sgb2YgbWVtb3J5LCBpbiB3aGljaCB0aGUgY291bnRpbmcgc2VtYXBob3JlIHN0cnVjdHVyZSBpcyBzdG9yZWQuICBJZiBhCisgKiBjb3VudGluZyBzZW1hcGhvcmUgaXMgY3JlYXRlZCB1c2luZyB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoKSB0aGVuIHRoZQorICogcmVxdWlyZWQgbWVtb3J5IGlzIGF1dG9tYXRpY2FsbHkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGluc2lkZSB0aGUKKyAqIHhTZW1hcGhvcmVDcmVhdGVDb3VudGluZygpIGZ1bmN0aW9uLiAgKHNlZQorICogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTExLmh0bWwpLiAgSWYgYSBjb3VudGluZyBzZW1hcGhvcmUgaXMgY3JlYXRlZAorICogdXNpbmcgeFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nU3RhdGljKCkgdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIGNhbgorICogaW5zdGVhZCBvcHRpb25hbGx5IHByb3ZpZGUgdGhlIG1lbW9yeSB0aGF0IHdpbGwgZ2V0IHVzZWQgYnkgdGhlIGNvdW50aW5nCisgKiBzZW1hcGhvcmUuICB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmdTdGF0aWMoKSB0aGVyZWZvcmUgYWxsb3dzIGEgY291bnRpbmcKKyAqIHNlbWFwaG9yZSB0byBiZSBjcmVhdGVkIHdpdGhvdXQgdXNpbmcgYW55IGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogQ291bnRpbmcgc2VtYXBob3JlcyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIHR3byB0aGluZ3M6CisgKgorICogMSkgQ291bnRpbmcgZXZlbnRzLgorICoKKyAqICAgIEluIHRoaXMgdXNhZ2Ugc2NlbmFyaW8gYW4gZXZlbnQgaGFuZGxlciB3aWxsICdnaXZlJyBhIHNlbWFwaG9yZSBlYWNoIHRpbWUKKyAqICAgIGFuIGV2ZW50IG9jY3VycyAoaW5jcmVtZW50aW5nIHRoZSBzZW1hcGhvcmUgY291bnQgdmFsdWUpLCBhbmQgYSBoYW5kbGVyCisgKiAgICB0YXNrIHdpbGwgJ3Rha2UnIGEgc2VtYXBob3JlIGVhY2ggdGltZSBpdCBwcm9jZXNzZXMgYW4gZXZlbnQKKyAqICAgIChkZWNyZW1lbnRpbmcgdGhlIHNlbWFwaG9yZSBjb3VudCB2YWx1ZSkuICBUaGUgY291bnQgdmFsdWUgaXMgdGhlcmVmb3JlCisgKiAgICB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgZXZlbnRzIHRoYXQgaGF2ZSBvY2N1cnJlZCBhbmQgdGhlCisgKiAgICBudW1iZXIgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgSW4gdGhpcyBjYXNlIGl0IGlzIGRlc2lyYWJsZSBmb3IgdGhlCisgKiAgICBpbml0aWFsIGNvdW50IHZhbHVlIHRvIGJlIHplcm8uCisgKgorICogMikgUmVzb3VyY2UgbWFuYWdlbWVudC4KKyAqCisgKiAgICBJbiB0aGlzIHVzYWdlIHNjZW5hcmlvIHRoZSBjb3VudCB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiByZXNvdXJjZXMKKyAqICAgIGF2YWlsYWJsZS4gIFRvIG9idGFpbiBjb250cm9sIG9mIGEgcmVzb3VyY2UgYSB0YXNrIG11c3QgZmlyc3Qgb2J0YWluIGEKKyAqICAgIHNlbWFwaG9yZSAtIGRlY3JlbWVudGluZyB0aGUgc2VtYXBob3JlIGNvdW50IHZhbHVlLiAgV2hlbiB0aGUgY291bnQgdmFsdWUKKyAqICAgIHJlYWNoZXMgemVybyB0aGVyZSBhcmUgbm8gZnJlZSByZXNvdXJjZXMuICBXaGVuIGEgdGFzayBmaW5pc2hlcyB3aXRoIHRoZQorICogICAgcmVzb3VyY2UgaXQgJ2dpdmVzJyB0aGUgc2VtYXBob3JlIGJhY2sgLSBpbmNyZW1lbnRpbmcgdGhlIHNlbWFwaG9yZSBjb3VudAorICogICAgdmFsdWUuICBJbiB0aGlzIGNhc2UgaXQgaXMgZGVzaXJhYmxlIGZvciB0aGUgaW5pdGlhbCBjb3VudCB2YWx1ZSB0byBiZQorICogICAgZXF1YWwgdG8gdGhlIG1heGltdW0gY291bnQgdmFsdWUsIGluZGljYXRpbmcgdGhhdCBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlLgorICoKKyAqIEBwYXJhbSB1eE1heENvdW50IFRoZSBtYXhpbXVtIGNvdW50IHZhbHVlIHRoYXQgY2FuIGJlIHJlYWNoZWQuICBXaGVuIHRoZQorICogICAgICAgIHNlbWFwaG9yZSByZWFjaGVzIHRoaXMgdmFsdWUgaXQgY2FuIG5vIGxvbmdlciBiZSAnZ2l2ZW4nLgorICoKKyAqIEBwYXJhbSB1eEluaXRpYWxDb3VudCBUaGUgY291bnQgdmFsdWUgYXNzaWduZWQgdG8gdGhlIHNlbWFwaG9yZSB3aGVuIGl0IGlzCisgKiAgICAgICAgY3JlYXRlZC4KKyAqCisgKiBAcmV0dXJuIEhhbmRsZSB0byB0aGUgY3JlYXRlZCBzZW1hcGhvcmUuICBOdWxsIGlmIHRoZSBzZW1hcGhvcmUgY291bGQgbm90IGJlCisgKiAgICAgICAgIGNyZWF0ZWQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyA8cHJlPgorIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmU7CisKKyB2b2lkIHZBVGFzayggdm9pZCAqIHB2UGFyYW1ldGVycyApCisgeworIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmUgPSBOVUxMOworCisgICAgLy8gU2VtYXBob3JlIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSBhIGNhbGwgdG8geFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nKCkuCisgICAgLy8gVGhlIG1heCB2YWx1ZSB0byB3aGljaCB0aGUgc2VtYXBob3JlIGNhbiBjb3VudCBzaG91bGQgYmUgMTAsIGFuZCB0aGUKKyAgICAvLyBpbml0aWFsIHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBjb3VudCBzaG91bGQgYmUgMC4KKyAgICB4U2VtYXBob3JlID0geFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nKCAxMCwgMCApOworCisgICAgaWYoIHhTZW1hcGhvcmUgIT0gTlVMTCApCisgICAgeworICAgICAgICAvLyBUaGUgc2VtYXBob3JlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgLy8gVGhlIHNlbWFwaG9yZSBjYW4gbm93IGJlIHVzZWQuCisgICAgfQorIH0KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcgeFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nCisgKiBcaW5ncm91cCBTZW1hcGhvcmVzCisgKi8KKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisJI2RlZmluZSB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoIHV4TWF4Q291bnQsIHV4SW5pdGlhbENvdW50ICkgeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmUoICggdXhNYXhDb3VudCApLCAoIHV4SW5pdGlhbENvdW50ICkgKQorI2VuZGlmCisKKy8qKgorICogc2VtcGhyLiBoCisgKiA8cHJlPlNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmVDcmVhdGVDb3VudGluZ1N0YXRpYyggVUJhc2VUeXBlX3QgdXhNYXhDb3VudCwgVUJhc2VUeXBlX3QgdXhJbml0aWFsQ291bnQsIFN0YXRpY1NlbWFwaG9yZV90ICpweFNlbWFwaG9yZUJ1ZmZlciApPC9wcmU+CisgKgorICogQ3JlYXRlcyBhIG5ldyBjb3VudGluZyBzZW1hcGhvcmUgaW5zdGFuY2UsIGFuZCByZXR1cm5zIGEgaGFuZGxlIGJ5IHdoaWNoIHRoZQorICogbmV3IGNvdW50aW5nIHNlbWFwaG9yZSBjYW4gYmUgcmVmZXJlbmNlZC4KKyAqCisgKiBJbiBtYW55IHVzYWdlIHNjZW5hcmlvcyBpdCBpcyBmYXN0ZXIgYW5kIG1vcmUgbWVtb3J5IGVmZmljaWVudCB0byB1c2UgYQorICogZGlyZWN0IHRvIHRhc2sgbm90aWZpY2F0aW9uIGluIHBsYWNlIG9mIGEgY291bnRpbmcgc2VtYXBob3JlIQorICogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy10YXNrLW5vdGlmaWNhdGlvbnMuaHRtbAorICoKKyAqIEludGVybmFsbHksIHdpdGhpbiB0aGUgRnJlZVJUT1MgaW1wbGVtZW50YXRpb24sIGNvdW50aW5nIHNlbWFwaG9yZXMgdXNlIGEKKyAqIGJsb2NrIG9mIG1lbW9yeSwgaW4gd2hpY2ggdGhlIGNvdW50aW5nIHNlbWFwaG9yZSBzdHJ1Y3R1cmUgaXMgc3RvcmVkLiAgSWYgYQorICogY291bnRpbmcgc2VtYXBob3JlIGlzIGNyZWF0ZWQgdXNpbmcgeFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nKCkgdGhlbiB0aGUKKyAqIHJlcXVpcmVkIG1lbW9yeSBpcyBhdXRvbWF0aWNhbGx5IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpbnNpZGUgdGhlCisgKiB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoKSBmdW5jdGlvbi4gIChzZWUKKyAqIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExMS5odG1sKS4gIElmIGEgY291bnRpbmcgc2VtYXBob3JlIGlzIGNyZWF0ZWQKKyAqIHVzaW5nIHhTZW1hcGhvcmVDcmVhdGVDb3VudGluZ1N0YXRpYygpIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0CisgKiBwcm92aWRlIHRoZSBtZW1vcnkuICB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmdTdGF0aWMoKSB0aGVyZWZvcmUgYWxsb3dzIGEKKyAqIGNvdW50aW5nIHNlbWFwaG9yZSB0byBiZSBjcmVhdGVkIHdpdGhvdXQgdXNpbmcgYW55IGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogQ291bnRpbmcgc2VtYXBob3JlcyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIHR3byB0aGluZ3M6CisgKgorICogMSkgQ291bnRpbmcgZXZlbnRzLgorICoKKyAqICAgIEluIHRoaXMgdXNhZ2Ugc2NlbmFyaW8gYW4gZXZlbnQgaGFuZGxlciB3aWxsICdnaXZlJyBhIHNlbWFwaG9yZSBlYWNoIHRpbWUKKyAqICAgIGFuIGV2ZW50IG9jY3VycyAoaW5jcmVtZW50aW5nIHRoZSBzZW1hcGhvcmUgY291bnQgdmFsdWUpLCBhbmQgYSBoYW5kbGVyCisgKiAgICB0YXNrIHdpbGwgJ3Rha2UnIGEgc2VtYXBob3JlIGVhY2ggdGltZSBpdCBwcm9jZXNzZXMgYW4gZXZlbnQKKyAqICAgIChkZWNyZW1lbnRpbmcgdGhlIHNlbWFwaG9yZSBjb3VudCB2YWx1ZSkuICBUaGUgY291bnQgdmFsdWUgaXMgdGhlcmVmb3JlCisgKiAgICB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgZXZlbnRzIHRoYXQgaGF2ZSBvY2N1cnJlZCBhbmQgdGhlCisgKiAgICBudW1iZXIgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgSW4gdGhpcyBjYXNlIGl0IGlzIGRlc2lyYWJsZSBmb3IgdGhlCisgKiAgICBpbml0aWFsIGNvdW50IHZhbHVlIHRvIGJlIHplcm8uCisgKgorICogMikgUmVzb3VyY2UgbWFuYWdlbWVudC4KKyAqCisgKiAgICBJbiB0aGlzIHVzYWdlIHNjZW5hcmlvIHRoZSBjb3VudCB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiByZXNvdXJjZXMKKyAqICAgIGF2YWlsYWJsZS4gIFRvIG9idGFpbiBjb250cm9sIG9mIGEgcmVzb3VyY2UgYSB0YXNrIG11c3QgZmlyc3Qgb2J0YWluIGEKKyAqICAgIHNlbWFwaG9yZSAtIGRlY3JlbWVudGluZyB0aGUgc2VtYXBob3JlIGNvdW50IHZhbHVlLiAgV2hlbiB0aGUgY291bnQgdmFsdWUKKyAqICAgIHJlYWNoZXMgemVybyB0aGVyZSBhcmUgbm8gZnJlZSByZXNvdXJjZXMuICBXaGVuIGEgdGFzayBmaW5pc2hlcyB3aXRoIHRoZQorICogICAgcmVzb3VyY2UgaXQgJ2dpdmVzJyB0aGUgc2VtYXBob3JlIGJhY2sgLSBpbmNyZW1lbnRpbmcgdGhlIHNlbWFwaG9yZSBjb3VudAorICogICAgdmFsdWUuICBJbiB0aGlzIGNhc2UgaXQgaXMgZGVzaXJhYmxlIGZvciB0aGUgaW5pdGlhbCBjb3VudCB2YWx1ZSB0byBiZQorICogICAgZXF1YWwgdG8gdGhlIG1heGltdW0gY291bnQgdmFsdWUsIGluZGljYXRpbmcgdGhhdCBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlLgorICoKKyAqIEBwYXJhbSB1eE1heENvdW50IFRoZSBtYXhpbXVtIGNvdW50IHZhbHVlIHRoYXQgY2FuIGJlIHJlYWNoZWQuICBXaGVuIHRoZQorICogICAgICAgIHNlbWFwaG9yZSByZWFjaGVzIHRoaXMgdmFsdWUgaXQgY2FuIG5vIGxvbmdlciBiZSAnZ2l2ZW4nLgorICoKKyAqIEBwYXJhbSB1eEluaXRpYWxDb3VudCBUaGUgY291bnQgdmFsdWUgYXNzaWduZWQgdG8gdGhlIHNlbWFwaG9yZSB3aGVuIGl0IGlzCisgKiAgICAgICAgY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0gcHhTZW1hcGhvcmVCdWZmZXIgTXVzdCBwb2ludCB0byBhIHZhcmlhYmxlIG9mIHR5cGUgU3RhdGljU2VtYXBob3JlX3QsCisgKiB3aGljaCB3aWxsIHRoZW4gYmUgdXNlZCB0byBob2xkIHRoZSBzZW1hcGhvcmUncyBkYXRhIHN0cnVjdHVyZSwgcmVtb3ZpbmcgdGhlCisgKiBuZWVkIGZvciB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseS4KKyAqCisgKiBAcmV0dXJuIElmIHRoZSBjb3VudGluZyBzZW1hcGhvcmUgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHRoZW4gYSBoYW5kbGUgdG8KKyAqIHRoZSBjcmVhdGVkIGNvdW50aW5nIHNlbWFwaG9yZSBpcyByZXR1cm5lZC4gIElmIHB4U2VtYXBob3JlQnVmZmVyIHdhcyBOVUxMCisgKiB0aGVuIE5VTEwgaXMgcmV0dXJuZWQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyA8cHJlPgorIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmU7CisgU3RhdGljU2VtYXBob3JlX3QgeFNlbWFwaG9yZUJ1ZmZlcjsKKworIHZvaWQgdkFUYXNrKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgU2VtYXBob3JlSGFuZGxlX3QgeFNlbWFwaG9yZSA9IE5VTEw7CisKKyAgICAvLyBDb3VudGluZyBzZW1hcGhvcmUgY2Fubm90IGJlIHVzZWQgYmVmb3JlIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQuICBDcmVhdGUKKyAgICAvLyBhIGNvdW50aW5nIHNlbWFwaG9yZSB1c2luZyB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmdTdGF0aWMoKS4gIFRoZSBtYXgKKyAgICAvLyB2YWx1ZSB0byB3aGljaCB0aGUgc2VtYXBob3JlIGNhbiBjb3VudCBpcyAxMCwgYW5kIHRoZSBpbml0aWFsIHZhbHVlCisgICAgLy8gYXNzaWduZWQgdG8gdGhlIGNvdW50IHdpbGwgYmUgMC4gIFRoZSBhZGRyZXNzIG9mIHhTZW1hcGhvcmVCdWZmZXIgaXMKKyAgICAvLyBwYXNzZWQgaW4gYW5kIHdpbGwgYmUgdXNlZCB0byBob2xkIHRoZSBzZW1hcGhvcmUgc3RydWN0dXJlLCBzbyBubyBkeW5hbWljCisgICAgLy8gbWVtb3J5IGFsbG9jYXRpb24gd2lsbCBiZSB1c2VkLgorICAgIHhTZW1hcGhvcmUgPSB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmcoIDEwLCAwLCAmeFNlbWFwaG9yZUJ1ZmZlciApOworCisgICAgLy8gTm8gbWVtb3J5IGFsbG9jYXRpb24gd2FzIGF0dGVtcHRlZCBzbyB4U2VtYXBob3JlIGNhbm5vdCBiZSBOVUxMLCBzbyB0aGVyZQorICAgIC8vIGlzIG5vIG5lZWQgdG8gY2hlY2sgaXRzIHZhbHVlLgorIH0KKyA8L3ByZT4KKyAqIFxkZWZncm91cCB4U2VtYXBob3JlQ3JlYXRlQ291bnRpbmdTdGF0aWMgeFNlbWFwaG9yZUNyZWF0ZUNvdW50aW5nU3RhdGljCisgKiBcaW5ncm91cCBTZW1hcGhvcmVzCisgKi8KKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKwkjZGVmaW5lIHhTZW1hcGhvcmVDcmVhdGVDb3VudGluZ1N0YXRpYyggdXhNYXhDb3VudCwgdXhJbml0aWFsQ291bnQsIHB4U2VtYXBob3JlQnVmZmVyICkgeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmVTdGF0aWMoICggdXhNYXhDb3VudCApLCAoIHV4SW5pdGlhbENvdW50ICksICggcHhTZW1hcGhvcmVCdWZmZXIgKSApCisjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAqLworCisvKioKKyAqIHNlbXBoci4gaAorICogPHByZT52b2lkIHZTZW1hcGhvcmVEZWxldGUoIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmUgKTs8L3ByZT4KKyAqCisgKiBEZWxldGUgYSBzZW1hcGhvcmUuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB3aXRoIGNhcmUuICBGb3IgZXhhbXBsZSwKKyAqIGRvIG5vdCBkZWxldGUgYSBtdXRleCB0eXBlIHNlbWFwaG9yZSBpZiB0aGUgbXV0ZXggaXMgaGVsZCBieSBhIHRhc2suCisgKgorICogQHBhcmFtIHhTZW1hcGhvcmUgQSBoYW5kbGUgdG8gdGhlIHNlbWFwaG9yZSB0byBiZSBkZWxldGVkLgorICoKKyAqIFxkZWZncm91cCB2U2VtYXBob3JlRGVsZXRlIHZTZW1hcGhvcmVEZWxldGUKKyAqIFxpbmdyb3VwIFNlbWFwaG9yZXMKKyAqLworI2RlZmluZSB2U2VtYXBob3JlRGVsZXRlKCB4U2VtYXBob3JlICkgdlF1ZXVlRGVsZXRlKCAoIFF1ZXVlSGFuZGxlX3QgKSAoIHhTZW1hcGhvcmUgKSApCisKKy8qKgorICogc2VtcGhyLmgKKyAqIDxwcmU+VGFza0hhbmRsZV90IHhTZW1hcGhvcmVHZXRNdXRleEhvbGRlciggU2VtYXBob3JlSGFuZGxlX3QgeE11dGV4ICk7PC9wcmU+CisgKgorICogSWYgeE11dGV4IGlzIGluZGVlZCBhIG11dGV4IHR5cGUgc2VtYXBob3JlLCByZXR1cm4gdGhlIGN1cnJlbnQgbXV0ZXggaG9sZGVyLgorICogSWYgeE11dGV4IGlzIG5vdCBhIG11dGV4IHR5cGUgc2VtYXBob3JlLCBvciB0aGUgbXV0ZXggaXMgYXZhaWxhYmxlIChub3QgaGVsZAorICogYnkgYSB0YXNrKSwgcmV0dXJuIE5VTEwuCisgKgorICogTm90ZTogVGhpcyBpcyBhIGdvb2Qgd2F5IG9mIGRldGVybWluaW5nIGlmIHRoZSBjYWxsaW5nIHRhc2sgaXMgdGhlIG11dGV4CisgKiBob2xkZXIsIGJ1dCBub3QgYSBnb29kIHdheSBvZiBkZXRlcm1pbmluZyB0aGUgaWRlbnRpdHkgb2YgdGhlIG11dGV4IGhvbGRlciBhcworICogdGhlIGhvbGRlciBtYXkgY2hhbmdlIGJldHdlZW4gdGhlIGZ1bmN0aW9uIGV4aXRpbmcgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZQorICogYmVpbmcgdGVzdGVkLgorICovCisjZGVmaW5lIHhTZW1hcGhvcmVHZXRNdXRleEhvbGRlciggeFNlbWFwaG9yZSApIHhRdWV1ZUdldE11dGV4SG9sZGVyKCAoIHhTZW1hcGhvcmUgKSApCisKKy8qKgorICogc2VtcGhyLmgKKyAqIDxwcmU+VGFza0hhbmRsZV90IHhTZW1hcGhvcmVHZXRNdXRleEhvbGRlckZyb21JU1IoIFNlbWFwaG9yZUhhbmRsZV90IHhNdXRleCApOzwvcHJlPgorICoKKyAqIElmIHhNdXRleCBpcyBpbmRlZWQgYSBtdXRleCB0eXBlIHNlbWFwaG9yZSwgcmV0dXJuIHRoZSBjdXJyZW50IG11dGV4IGhvbGRlci4KKyAqIElmIHhNdXRleCBpcyBub3QgYSBtdXRleCB0eXBlIHNlbWFwaG9yZSwgb3IgdGhlIG11dGV4IGlzIGF2YWlsYWJsZSAobm90IGhlbGQKKyAqIGJ5IGEgdGFzayksIHJldHVybiBOVUxMLgorICoKKyAqLworI2RlZmluZSB4U2VtYXBob3JlR2V0TXV0ZXhIb2xkZXJGcm9tSVNSKCB4U2VtYXBob3JlICkgeFF1ZXVlR2V0TXV0ZXhIb2xkZXJGcm9tSVNSKCAoIHhTZW1hcGhvcmUgKSApCisKKy8qKgorICogc2VtcGhyLmgKKyAqIDxwcmU+VUJhc2VUeXBlX3QgdXhTZW1hcGhvcmVHZXRDb3VudCggU2VtYXBob3JlSGFuZGxlX3QgeFNlbWFwaG9yZSApOzwvcHJlPgorICoKKyAqIElmIHRoZSBzZW1hcGhvcmUgaXMgYSBjb3VudGluZyBzZW1hcGhvcmUgdGhlbiB1eFNlbWFwaG9yZUdldENvdW50KCkgcmV0dXJucworICogaXRzIGN1cnJlbnQgY291bnQgdmFsdWUuICBJZiB0aGUgc2VtYXBob3JlIGlzIGEgYmluYXJ5IHNlbWFwaG9yZSB0aGVuCisgKiB1eFNlbWFwaG9yZUdldENvdW50KCkgcmV0dXJucyAxIGlmIHRoZSBzZW1hcGhvcmUgaXMgYXZhaWxhYmxlLCBhbmQgMCBpZiB0aGUKKyAqIHNlbWFwaG9yZSBpcyBub3QgYXZhaWxhYmxlLgorICoKKyAqLworI2RlZmluZSB1eFNlbWFwaG9yZUdldENvdW50KCB4U2VtYXBob3JlICkgdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZyggKCBRdWV1ZUhhbmRsZV90ICkgKCB4U2VtYXBob3JlICkgKQorCisjZW5kaWYgLyogU0VNQVBIT1JFX0ggKi8KKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9zdGFja19tYWNyb3MuaCBiL1NvdXJjZS9pbmNsdWRlL3N0YWNrX21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YTgzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvaW5jbHVkZS9zdGFja19tYWNyb3MuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgU1RBQ0tfTUFDUk9TX0gKKyNkZWZpbmUgU1RBQ0tfTUFDUk9TX0gKKworLyoKKyAqIENhbGwgdGhlIHN0YWNrIG92ZXJmbG93IGhvb2sgZnVuY3Rpb24gaWYgdGhlIHN0YWNrIG9mIHRoZSB0YXNrIGJlaW5nIHN3YXBwZWQKKyAqIG91dCBpcyBjdXJyZW50bHkgb3ZlcmZsb3dlZCwgb3IgbG9va3MgbGlrZSBpdCBtaWdodCBoYXZlIG92ZXJmbG93ZWQgaW4gdGhlCisgKiBwYXN0LgorICoKKyAqIFNldHRpbmcgY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XIHRvIDEgd2lsbCBjYXVzZSB0aGUgbWFjcm8gdG8gY2hlY2sKKyAqIHRoZSBjdXJyZW50IHN0YWNrIHN0YXRlIG9ubHkgLSBjb21wYXJpbmcgdGhlIGN1cnJlbnQgdG9wIG9mIHN0YWNrIHZhbHVlIHRvCisgKiB0aGUgc3RhY2sgbGltaXQuICBTZXR0aW5nIGNvbmZpZ0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVyB0byBncmVhdGVyIHRoYW4gMQorICogd2lsbCBhbHNvIGNhdXNlIHRoZSBsYXN0IGZldyBzdGFjayBieXRlcyB0byBiZSBjaGVja2VkIHRvIGVuc3VyZSB0aGUgdmFsdWUKKyAqIHRvIHdoaWNoIHRoZSBieXRlcyB3ZXJlIHNldCB3aGVuIHRoZSB0YXNrIHdhcyBjcmVhdGVkIGhhdmUgbm90IGJlZW4KKyAqIG92ZXJ3cml0dGVuLiAgTm90ZSB0aGlzIHNlY29uZCB0ZXN0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGFuIG92ZXJmbG93ZWQKKyAqIHN0YWNrIHdpbGwgYWx3YXlzIGJlIHJlY29nbmlzZWQuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggKCBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgPT0gMSApICYmICggcG9ydFNUQUNLX0dST1dUSCA8IDAgKSApCisKKwkvKiBPbmx5IHRoZSBjdXJyZW50IHN0YWNrIHN0YXRlIGlzIHRvIGJlIGNoZWNrZWQuICovCisJI2RlZmluZSB0YXNrQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XKCkJCQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkvKiBJcyB0aGUgY3VycmVudGx5IHNhdmVkIHN0YWNrIHBvaW50ZXIgd2l0aGluIHRoZSBzdGFjayBsaW1pdD8gKi8JCQkJCQkJCVwKKwkJaWYoIHB4Q3VycmVudFRDQi0+cHhUb3BPZlN0YWNrIDw9IHB4Q3VycmVudFRDQi0+cHhTdGFjayApCQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCXZBcHBsaWNhdGlvblN0YWNrT3ZlcmZsb3dIb29rKCAoIFRhc2tIYW5kbGVfdCApIHB4Q3VycmVudFRDQiwgcHhDdXJyZW50VENCLT5wY1Rhc2tOYW1lICk7CVwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl9CisKKyNlbmRpZiAvKiBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgPT0gMSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggKCBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgPT0gMSApICYmICggcG9ydFNUQUNLX0dST1dUSCA+IDAgKSApCisKKwkvKiBPbmx5IHRoZSBjdXJyZW50IHN0YWNrIHN0YXRlIGlzIHRvIGJlIGNoZWNrZWQuICovCisJI2RlZmluZSB0YXNrQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XKCkJCQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCS8qIElzIHRoZSBjdXJyZW50bHkgc2F2ZWQgc3RhY2sgcG9pbnRlciB3aXRoaW4gdGhlIHN0YWNrIGxpbWl0PyAqLwkJCQkJCQkJXAorCQlpZiggcHhDdXJyZW50VENCLT5weFRvcE9mU3RhY2sgPj0gcHhDdXJyZW50VENCLT5weEVuZE9mU3RhY2sgKQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCXZBcHBsaWNhdGlvblN0YWNrT3ZlcmZsb3dIb29rKCAoIFRhc2tIYW5kbGVfdCApIHB4Q3VycmVudFRDQiwgcHhDdXJyZW50VENCLT5wY1Rhc2tOYW1lICk7CVwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl9CisKKyNlbmRpZiAvKiBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgPT0gMSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggKCBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgPiAxICkgJiYgKCBwb3J0U1RBQ0tfR1JPV1RIIDwgMCApICkKKworCSNkZWZpbmUgdGFza0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVygpCQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJY29uc3QgdWludDMyX3QgKiBjb25zdCBwdWxTdGFjayA9ICggdWludDMyX3QgKiApIHB4Q3VycmVudFRDQi0+cHhTdGFjazsJCQkJCQkJXAorCQljb25zdCB1aW50MzJfdCB1bENoZWNrVmFsdWUgPSAoIHVpbnQzMl90ICkgMHhhNWE1YTVhNTsJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQlpZiggKCBwdWxTdGFja1sgMCBdICE9IHVsQ2hlY2tWYWx1ZSApIHx8CQkJCQkJCQkJCQkJXAorCQkJKCBwdWxTdGFja1sgMSBdICE9IHVsQ2hlY2tWYWx1ZSApIHx8CQkJCQkJCQkJCQkJXAorCQkJKCBwdWxTdGFja1sgMiBdICE9IHVsQ2hlY2tWYWx1ZSApIHx8CQkJCQkJCQkJCQkJXAorCQkJKCBwdWxTdGFja1sgMyBdICE9IHVsQ2hlY2tWYWx1ZSApICkJCQkJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQl2QXBwbGljYXRpb25TdGFja092ZXJmbG93SG9vayggKCBUYXNrSGFuZGxlX3QgKSBweEN1cnJlbnRUQ0IsIHB4Q3VycmVudFRDQi0+cGNUYXNrTmFtZSApOwlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJfQorCisjZW5kaWYgLyogI2lmKCBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgPiAxICkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID4gMSApICYmICggcG9ydFNUQUNLX0dST1dUSCA+IDAgKSApCisKKwkjZGVmaW5lIHRhc2tDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1coKQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCWludDhfdCAqcGNFbmRPZlN0YWNrID0gKCBpbnQ4X3QgKiApIHB4Q3VycmVudFRDQi0+cHhFbmRPZlN0YWNrOwkJCQkJCQkJCQkJCQkJCQkJCVwKKwlzdGF0aWMgY29uc3QgdWludDhfdCB1Y0V4cGVjdGVkU3RhY2tCeXRlc1tdID0gewl0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsCQlcCisJCQkJCQkJCQkJCQkJdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFLAkJXAorCQkJCQkJCQkJCQkJCXRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSwJCVwKKwkJCQkJCQkJCQkJCQl0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsCQlcCisJCQkJCQkJCQkJCQkJdHNrU1RBQ0tfRklMTF9CWVRFLCB0c2tTVEFDS19GSUxMX0JZVEUsIHRza1NUQUNLX0ZJTExfQllURSwgdHNrU1RBQ0tfRklMTF9CWVRFIH07CVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQlwY0VuZE9mU3RhY2sgLT0gc2l6ZW9mKCB1Y0V4cGVjdGVkU3RhY2tCeXRlcyApOwkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCS8qIEhhcyB0aGUgZXh0cmVtaXR5IG9mIHRoZSB0YXNrIHN0YWNrIGV2ZXIgYmVlbiB3cml0dGVuIG92ZXI/ICovCQkJCQkJCQkJCQkJCQkJCVwKKwkJaWYoIG1lbWNtcCggKCB2b2lkICogKSBwY0VuZE9mU3RhY2ssICggdm9pZCAqICkgdWNFeHBlY3RlZFN0YWNrQnl0ZXMsIHNpemVvZiggdWNFeHBlY3RlZFN0YWNrQnl0ZXMgKSApICE9IDAgKQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQl2QXBwbGljYXRpb25TdGFja092ZXJmbG93SG9vayggKCBUYXNrSGFuZGxlX3QgKSBweEN1cnJlbnRUQ0IsIHB4Q3VycmVudFRDQi0+cGNUYXNrTmFtZSApOwkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCX0KKworI2VuZGlmIC8qICNpZiggY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID4gMSApICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUmVtb3ZlIHN0YWNrIG92ZXJmbG93IG1hY3JvIGlmIG5vdCBiZWluZyB1c2VkLiAqLworI2lmbmRlZiB0YXNrQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XCisJI2RlZmluZSB0YXNrQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XKCkKKyNlbmRpZgorCisKKworI2VuZGlmIC8qIFNUQUNLX01BQ1JPU19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL3N0ZGludC5yZWFkbWUgYi9Tb3VyY2UvaW5jbHVkZS9zdGRpbnQucmVhZG1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTRjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvaW5jbHVkZS9zdGRpbnQucmVhZG1lCkBAIC0wLDAgKzEsMjcgQEAKKworI2lmbmRlZiBGUkVFUlRPU19TVERJTlQKKyNkZWZpbmUgRlJFRVJUT1NfU1RESU5UCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUSElTIElTIE5PVCBBIEZVTEwgc3RkaW50LmggSU1QTEVNRU5UQVRJT04gLSBJdCBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucworICogbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBGcmVlUlRPUyBjb2RlLiAgSXQgaXMgcHJvdmlkZWQgdG8gYWxsb3cgRnJlZVJUT1MgdG8gYmUKKyAqIGJ1aWx0IHVzaW5nIGNvbXBpbGVycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZWlyIG93biBzdGRpbnQuaCBkZWZpbml0aW9uLgorICoKKyAqIFRvIHVzZSB0aGlzIGZpbGU6CisgKgorICogICAgMSkgQ29weSB0aGlzIGZpbGUgaW50byB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgeW91ciBGcmVlUlRPU0NvbmZpZy5oCisgKiAgICAgICBoZWFkZXIgZmlsZSwgYXMgdGhhdCBkaXJlY3Rvcnkgd2lsbCBhbHJlYWR5IGJlIGluIHRoZSBjb21waWxlcnMgaW5jbHVkZQorICogICAgICAgcGF0aC4KKyAqCisgKiAgICAyKSBSZW5hbWUgdGhlIGNvcGllZCBmaWxlIHN0ZGludC5oLgorICoKKyAqLworCit0eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwordHlwZWRlZiBzaG9ydCBpbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKK3R5cGVkZWYgbG9uZyBpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQzMl90OworCisjZW5kaWYgLyogRlJFRVJUT1NfU1RESU5UICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9zdHJlYW1fYnVmZmVyLmggYi9Tb3VyY2UvaW5jbHVkZS9zdHJlYW1fYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxOGUwNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9pbmNsdWRlL3N0cmVhbV9idWZmZXIuaApAQCAtMCwwICsxLDg1MiBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qCisgKiBTdHJlYW0gYnVmZmVycyBhcmUgdXNlZCB0byBzZW5kIGEgY29udGludW91cyBzdHJlYW0gb2YgZGF0YSBmcm9tIG9uZSB0YXNrIG9yCisgKiBpbnRlcnJ1cHQgdG8gYW5vdGhlci4gIFRoZWlyIGltcGxlbWVudGF0aW9uIGlzIGxpZ2h0IHdlaWdodCwgbWFraW5nIHRoZW0KKyAqIHBhcnRpY3VsYXJseSBzdWl0ZWQgZm9yIGludGVycnVwdCB0byB0YXNrIGFuZCBjb3JlIHRvIGNvcmUgY29tbXVuaWNhdGlvbgorICogc2NlbmFyaW9zLgorICoKKyAqICoqKk5PVEUqKio6ICBVbmlxdWVseSBhbW9uZyBGcmVlUlRPUyBvYmplY3RzLCB0aGUgc3RyZWFtIGJ1ZmZlcgorICogaW1wbGVtZW50YXRpb24gKHNvIGFsc28gdGhlIG1lc3NhZ2UgYnVmZmVyIGltcGxlbWVudGF0aW9uLCBhcyBtZXNzYWdlIGJ1ZmZlcnMKKyAqIGFyZSBidWlsdCBvbiB0b3Agb2Ygc3RyZWFtIGJ1ZmZlcnMpIGFzc3VtZXMgdGhlcmUgaXMgb25seSBvbmUgdGFzayBvcgorICogaW50ZXJydXB0IHRoYXQgd2lsbCB3cml0ZSB0byB0aGUgYnVmZmVyICh0aGUgd3JpdGVyKSwgYW5kIG9ubHkgb25lIHRhc2sgb3IKKyAqIGludGVycnVwdCB0aGF0IHdpbGwgcmVhZCBmcm9tIHRoZSBidWZmZXIgKHRoZSByZWFkZXIpLiAgSXQgaXMgc2FmZSBmb3IgdGhlCisgKiB3cml0ZXIgYW5kIHJlYWRlciB0byBiZSBkaWZmZXJlbnQgdGFza3Mgb3IgaW50ZXJydXB0cywgYnV0LCB1bmxpa2Ugb3RoZXIKKyAqIEZyZWVSVE9TIG9iamVjdHMsIGl0IGlzIG5vdCBzYWZlIHRvIGhhdmUgbXVsdGlwbGUgZGlmZmVyZW50IHdyaXRlcnMgb3IKKyAqIG11bHRpcGxlIGRpZmZlcmVudCByZWFkZXJzLiAgSWYgdGhlcmUgYXJlIHRvIGJlIG11bHRpcGxlIGRpZmZlcmVudCB3cml0ZXJzCisgKiB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwbGFjZSBlYWNoIGNhbGwgdG8gYSB3cml0aW5nIEFQSSBmdW5jdGlvbgorICogKHN1Y2ggYXMgeFN0cmVhbUJ1ZmZlclNlbmQoKSkgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2V0IHRoZSBzZW5kCisgKiBibG9jayB0aW1lIHRvIDAuICBMaWtld2lzZSwgaWYgdGhlcmUgYXJlIHRvIGJlIG11bHRpcGxlIGRpZmZlcmVudCByZWFkZXJzCisgKiB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwbGFjZSBlYWNoIGNhbGwgdG8gYSByZWFkaW5nIEFQSSBmdW5jdGlvbgorICogKHN1Y2ggYXMgeFN0cmVhbUJ1ZmZlclJlYWQoKSkgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiBzZWN0aW9uIGFuZCBzZXQgdGhlCisgKiByZWNlaXZlIGJsb2NrIHRpbWUgdG8gMC4KKyAqCisgKi8KKworI2lmbmRlZiBTVFJFQU1fQlVGRkVSX0gKKyNkZWZpbmUgU1RSRUFNX0JVRkZFUl9ICisKKyNpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFR5cGUgYnkgd2hpY2ggc3RyZWFtIGJ1ZmZlcnMgYXJlIHJlZmVyZW5jZWQuICBGb3IgZXhhbXBsZSwgYSBjYWxsIHRvCisgKiB4U3RyZWFtQnVmZmVyQ3JlYXRlKCkgcmV0dXJucyBhbiBTdHJlYW1CdWZmZXJIYW5kbGVfdCB2YXJpYWJsZSB0aGF0IGNhbgorICogdGhlbiBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIHhTdHJlYW1CdWZmZXJTZW5kKCksIHhTdHJlYW1CdWZmZXJSZWNlaXZlKCksCisgKiBldGMuCisgKi8KK3R5cGVkZWYgdm9pZCAqIFN0cmVhbUJ1ZmZlckhhbmRsZV90OworCisKKy8qKgorICogbWVzc2FnZV9idWZmZXIuaAorICoKKzxwcmU+CitTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyQ3JlYXRlKCBzaXplX3QgeEJ1ZmZlclNpemVCeXRlcywgc2l6ZV90IHhUcmlnZ2VyTGV2ZWxCeXRlcyApOworPC9wcmU+CisgKgorICogQ3JlYXRlcyBhIG5ldyBzdHJlYW0gYnVmZmVyIHVzaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBtZW1vcnkuICBTZWUKKyAqIHhTdHJlYW1CdWZmZXJDcmVhdGVTdGF0aWMoKSBmb3IgYSB2ZXJzaW9uIHRoYXQgdXNlcyBzdGF0aWNhbGx5IGFsbG9jYXRlZAorICogbWVtb3J5IChtZW1vcnkgdGhhdCBpcyBhbGxvY2F0ZWQgYXQgY29tcGlsZSB0aW1lKS4KKyAqCisgKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiBtdXN0IGJlIHNldCB0byAxIG9yIGxlZnQgdW5kZWZpbmVkIGluCisgKiBGcmVlUlRPU0NvbmZpZy5oIGZvciB4U3RyZWFtQnVmZmVyQ3JlYXRlKCkgdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIEBwYXJhbSB4QnVmZmVyU2l6ZUJ5dGVzIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhlIHN0cmVhbSBidWZmZXIgd2lsbCBiZQorICogYWJsZSB0byBob2xkIGF0IGFueSBvbmUgdGltZS4KKyAqCisgKiBAcGFyYW0geFRyaWdnZXJMZXZlbEJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIGluIHRoZSBzdHJlYW0KKyAqIGJ1ZmZlciBiZWZvcmUgYSB0YXNrIHRoYXQgaXMgYmxvY2tlZCBvbiB0aGUgc3RyZWFtIGJ1ZmZlciB0byB3YWl0IGZvciBkYXRhIGlzCisgKiBtb3ZlZCBvdXQgb2YgdGhlIGJsb2NrZWQgc3RhdGUuICBGb3IgZXhhbXBsZSwgaWYgYSB0YXNrIGlzIGJsb2NrZWQgb24gYSByZWFkCisgKiBvZiBhbiBlbXB0eSBzdHJlYW0gYnVmZmVyIHRoYXQgaGFzIGEgdHJpZ2dlciBsZXZlbCBvZiAxIHRoZW4gdGhlIHRhc2sgd2lsbCBiZQorICogdW5ibG9ja2VkIHdoZW4gYSBzaW5nbGUgYnl0ZSBpcyB3cml0dGVuIHRvIHRoZSBidWZmZXIgb3IgdGhlIHRhc2sncyBibG9jaworICogdGltZSBleHBpcmVzLiAgQXMgYW5vdGhlciBleGFtcGxlLCBpZiBhIHRhc2sgaXMgYmxvY2tlZCBvbiBhIHJlYWQgb2YgYW4gZW1wdHkKKyAqIHN0cmVhbSBidWZmZXIgdGhhdCBoYXMgYSB0cmlnZ2VyIGxldmVsIG9mIDEwIHRoZW4gdGhlIHRhc2sgd2lsbCBub3QgYmUKKyAqIHVuYmxvY2tlZCB1bnRpbCB0aGUgc3RyZWFtIGJ1ZmZlciBjb250YWlucyBhdCBsZWFzdCAxMCBieXRlcyBvciB0aGUgdGFzaydzCisgKiBibG9jayB0aW1lIGV4cGlyZXMuICBJZiBhIHJlYWRpbmcgdGFzaydzIGJsb2NrIHRpbWUgZXhwaXJlcyBiZWZvcmUgdGhlCisgKiB0cmlnZ2VyIGxldmVsIGlzIHJlYWNoZWQgdGhlbiB0aGUgdGFzayB3aWxsIHN0aWxsIHJlY2VpdmUgaG93ZXZlciBtYW55IGJ5dGVzCisgKiBhcmUgYWN0dWFsbHkgYXZhaWxhYmxlLiAgU2V0dGluZyBhIHRyaWdnZXIgbGV2ZWwgb2YgMCB3aWxsIHJlc3VsdCBpbiBhCisgKiB0cmlnZ2VyIGxldmVsIG9mIDEgYmVpbmcgdXNlZC4gIEl0IGlzIG5vdCB2YWxpZCB0byBzcGVjaWZ5IGEgdHJpZ2dlciBsZXZlbAorICogdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhlIGJ1ZmZlciBzaXplLgorICoKKyAqIEByZXR1cm4gSWYgTlVMTCBpcyByZXR1cm5lZCwgdGhlbiB0aGUgc3RyZWFtIGJ1ZmZlciBjYW5ub3QgYmUgY3JlYXRlZAorICogYmVjYXVzZSB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgaGVhcCBtZW1vcnkgYXZhaWxhYmxlIGZvciBGcmVlUlRPUyB0byBhbGxvY2F0ZQorICogdGhlIHN0cmVhbSBidWZmZXIgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBzdG9yYWdlIGFyZWEuICBBIG5vbi1OVUxMIHZhbHVlIGJlaW5nCisgKiByZXR1cm5lZCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIGJ1ZmZlciBoYXMgYmVlbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseSAtCisgKiB0aGUgcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCBhcyB0aGUgaGFuZGxlIHRvIHRoZSBjcmVhdGVkIHN0cmVhbQorICogYnVmZmVyLgorICoKKyAqIEV4YW1wbGUgdXNlOgorPHByZT4KKwordm9pZCB2QUZ1bmN0aW9uKCB2b2lkICkKK3sKK1N0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXI7Citjb25zdCBzaXplX3QgeFN0cmVhbUJ1ZmZlclNpemVCeXRlcyA9IDEwMCwgeFRyaWdnZXJMZXZlbCA9IDEwOworCisgICAgLy8gQ3JlYXRlIGEgc3RyZWFtIGJ1ZmZlciB0aGF0IGNhbiBob2xkIDEwMCBieXRlcy4gIFRoZSBtZW1vcnkgdXNlZCB0byBob2xkCisgICAgLy8gYm90aCB0aGUgc3RyZWFtIGJ1ZmZlciBzdHJ1Y3R1cmUgYW5kIHRoZSBkYXRhIGluIHRoZSBzdHJlYW0gYnVmZmVyIGlzCisgICAgLy8gYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgorICAgIHhTdHJlYW1CdWZmZXIgPSB4U3RyZWFtQnVmZmVyQ3JlYXRlKCB4U3RyZWFtQnVmZmVyU2l6ZUJ5dGVzLCB4VHJpZ2dlckxldmVsICk7CisKKyAgICBpZiggeFN0cmVhbUJ1ZmZlciA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIC8vIFRoZXJlIHdhcyBub3QgZW5vdWdoIGhlYXAgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSB0byBjcmVhdGUgdGhlCisgICAgICAgIC8vIHN0cmVhbSBidWZmZXIuCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFRoZSBzdHJlYW0gYnVmZmVyIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSBhbmQgY2FuIG5vdyBiZSB1c2VkLgorICAgIH0KK30KKzwvcHJlPgorICogXGRlZmdyb3VwIHhTdHJlYW1CdWZmZXJDcmVhdGUgeFN0cmVhbUJ1ZmZlckNyZWF0ZQorICogXGluZ3JvdXAgU3RyZWFtQnVmZmVyTWFuYWdlbWVudAorICovCisjZGVmaW5lIHhTdHJlYW1CdWZmZXJDcmVhdGUoIHhCdWZmZXJTaXplQnl0ZXMsIHhUcmlnZ2VyTGV2ZWxCeXRlcyApIHhTdHJlYW1CdWZmZXJHZW5lcmljQ3JlYXRlKCB4QnVmZmVyU2l6ZUJ5dGVzLCB4VHJpZ2dlckxldmVsQnl0ZXMsIHBkRkFMU0UgKQorCisvKioKKyAqIHN0cmVhbV9idWZmZXIuaAorICoKKzxwcmU+CitTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyQ3JlYXRlU3RhdGljKCBzaXplX3QgeEJ1ZmZlclNpemVCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwdWNTdHJlYW1CdWZmZXJTdG9yYWdlQXJlYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpY1N0cmVhbUJ1ZmZlcl90ICpweFN0YXRpY1N0cmVhbUJ1ZmZlciApOworPC9wcmU+CisgKiBDcmVhdGVzIGEgbmV3IHN0cmVhbSBidWZmZXIgdXNpbmcgc3RhdGljYWxseSBhbGxvY2F0ZWQgbWVtb3J5LiAgU2VlCisgKiB4U3RyZWFtQnVmZmVyQ3JlYXRlKCkgZm9yIGEgdmVyc2lvbiB0aGF0IHVzZXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OIG11c3QgYmUgc2V0IHRvIDEgaW4gRnJlZVJUT1NDb25maWcuaCBmb3IKKyAqIHhTdHJlYW1CdWZmZXJDcmVhdGVTdGF0aWMoKSB0byBiZSBhdmFpbGFibGUuCisgKgorICogQHBhcmFtIHhCdWZmZXJTaXplQnl0ZXMgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdGhlCisgKiBwdWNTdHJlYW1CdWZmZXJTdG9yYWdlQXJlYSBwYXJhbWV0ZXIuCisgKgorICogQHBhcmFtIHhUcmlnZ2VyTGV2ZWxCeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBpbiB0aGUgc3RyZWFtCisgKiBidWZmZXIgYmVmb3JlIGEgdGFzayB0aGF0IGlzIGJsb2NrZWQgb24gdGhlIHN0cmVhbSBidWZmZXIgdG8gd2FpdCBmb3IgZGF0YSBpcworICogbW92ZWQgb3V0IG9mIHRoZSBibG9ja2VkIHN0YXRlLiAgRm9yIGV4YW1wbGUsIGlmIGEgdGFzayBpcyBibG9ja2VkIG9uIGEgcmVhZAorICogb2YgYW4gZW1wdHkgc3RyZWFtIGJ1ZmZlciB0aGF0IGhhcyBhIHRyaWdnZXIgbGV2ZWwgb2YgMSB0aGVuIHRoZSB0YXNrIHdpbGwgYmUKKyAqIHVuYmxvY2tlZCB3aGVuIGEgc2luZ2xlIGJ5dGUgaXMgd3JpdHRlbiB0byB0aGUgYnVmZmVyIG9yIHRoZSB0YXNrJ3MgYmxvY2sKKyAqIHRpbWUgZXhwaXJlcy4gIEFzIGFub3RoZXIgZXhhbXBsZSwgaWYgYSB0YXNrIGlzIGJsb2NrZWQgb24gYSByZWFkIG9mIGFuIGVtcHR5CisgKiBzdHJlYW0gYnVmZmVyIHRoYXQgaGFzIGEgdHJpZ2dlciBsZXZlbCBvZiAxMCB0aGVuIHRoZSB0YXNrIHdpbGwgbm90IGJlCisgKiB1bmJsb2NrZWQgdW50aWwgdGhlIHN0cmVhbSBidWZmZXIgY29udGFpbnMgYXQgbGVhc3QgMTAgYnl0ZXMgb3IgdGhlIHRhc2sncworICogYmxvY2sgdGltZSBleHBpcmVzLiAgSWYgYSByZWFkaW5nIHRhc2sncyBibG9jayB0aW1lIGV4cGlyZXMgYmVmb3JlIHRoZQorICogdHJpZ2dlciBsZXZlbCBpcyByZWFjaGVkIHRoZW4gdGhlIHRhc2sgd2lsbCBzdGlsbCByZWNlaXZlIGhvd2V2ZXIgbWFueSBieXRlcworICogYXJlIGFjdHVhbGx5IGF2YWlsYWJsZS4gIFNldHRpbmcgYSB0cmlnZ2VyIGxldmVsIG9mIDAgd2lsbCByZXN1bHQgaW4gYQorICogdHJpZ2dlciBsZXZlbCBvZiAxIGJlaW5nIHVzZWQuICBJdCBpcyBub3QgdmFsaWQgdG8gc3BlY2lmeSBhIHRyaWdnZXIgbGV2ZWwKKyAqIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBidWZmZXIgc2l6ZS4KKyAqCisgKiBAcGFyYW0gcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEgTXVzdCBwb2ludCB0byBhIHVpbnQ4X3QgYXJyYXkgdGhhdCBpcyBhdAorICogbGVhc3QgeEJ1ZmZlclNpemVCeXRlcyArIDEgYmlnLiAgVGhpcyBpcyB0aGUgYXJyYXkgdG8gd2hpY2ggc3RyZWFtcyBhcmUKKyAqIGNvcGllZCB3aGVuIHRoZXkgYXJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBidWZmZXIuCisgKgorICogQHBhcmFtIHB4U3RhdGljU3RyZWFtQnVmZmVyIE11c3QgcG9pbnQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlCisgKiBTdGF0aWNTdHJlYW1CdWZmZXJfdCwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGhvbGQgdGhlIHN0cmVhbSBidWZmZXIncyBkYXRhCisgKiBzdHJ1Y3R1cmUuCisgKgorICogQHJldHVybiBJZiB0aGUgc3RyZWFtIGJ1ZmZlciBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSB0aGVuIGEgaGFuZGxlIHRvIHRoZQorICogY3JlYXRlZCBzdHJlYW0gYnVmZmVyIGlzIHJldHVybmVkLiBJZiBlaXRoZXIgcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEgb3IKKyAqIHB4U3RhdGljc3RyZWFtQnVmZmVyIGFyZSBOVUxMIHRoZW4gTlVMTCBpcyByZXR1cm5lZC4KKyAqCisgKiBFeGFtcGxlIHVzZToKKzxwcmU+CisKKy8vIFVzZWQgdG8gZGltZW5zaW9uIHRoZSBhcnJheSB1c2VkIHRvIGhvbGQgdGhlIHN0cmVhbXMuICBUaGUgYXZhaWxhYmxlIHNwYWNlCisvLyB3aWxsIGFjdHVhbGx5IGJlIG9uZSBsZXNzIHRoYW4gdGhpcywgc28gOTk5LgorI2RlZmluZSBTVE9SQUdFX1NJWkVfQllURVMgMTAwMAorCisvLyBEZWZpbmVzIHRoZSBtZW1vcnkgdGhhdCB3aWxsIGFjdHVhbGx5IGhvbGQgdGhlIHN0cmVhbXMgd2l0aGluIHRoZSBzdHJlYW0KKy8vIGJ1ZmZlci4KK3N0YXRpYyB1aW50OF90IHVjU3RvcmFnZUJ1ZmZlclsgU1RPUkFHRV9TSVpFX0JZVEVTIF07CisKKy8vIFRoZSB2YXJpYWJsZSB1c2VkIHRvIGhvbGQgdGhlIHN0cmVhbSBidWZmZXIgc3RydWN0dXJlLgorU3RhdGljU3RyZWFtQnVmZmVyX3QgeFN0cmVhbUJ1ZmZlclN0cnVjdDsKKwordm9pZCBNeUZ1bmN0aW9uKCB2b2lkICkKK3sKK1N0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXI7Citjb25zdCBzaXplX3QgeFRyaWdnZXJMZXZlbCA9IDE7CisKKyAgICB4U3RyZWFtQnVmZmVyID0geFN0cmVhbUJ1ZmZlckNyZWF0ZVN0YXRpYyggc2l6ZW9mKCB1Y0J1ZmZlclN0b3JhZ2UgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFRyaWdnZXJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNCdWZmZXJTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeFN0cmVhbUJ1ZmZlclN0cnVjdCApOworCisgICAgLy8gQXMgbmVpdGhlciB0aGUgcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEgb3IgcHhTdGF0aWNTdHJlYW1CdWZmZXIKKyAgICAvLyBwYXJhbWV0ZXJzIHdlcmUgTlVMTCwgeFN0cmVhbUJ1ZmZlciB3aWxsIG5vdCBiZSBOVUxMLCBhbmQgY2FuIGJlIHVzZWQgdG8KKyAgICAvLyByZWZlcmVuY2UgdGhlIGNyZWF0ZWQgc3RyZWFtIGJ1ZmZlciBpbiBvdGhlciBzdHJlYW0gYnVmZmVyIEFQSSBjYWxscy4KKworICAgIC8vIE90aGVyIGNvZGUgdGhhdCB1c2VzIHRoZSBzdHJlYW0gYnVmZmVyIGNhbiBnbyBoZXJlLgorfQorCis8L3ByZT4KKyAqIFxkZWZncm91cCB4U3RyZWFtQnVmZmVyQ3JlYXRlU3RhdGljIHhTdHJlYW1CdWZmZXJDcmVhdGVTdGF0aWMKKyAqIFxpbmdyb3VwIFN0cmVhbUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworI2RlZmluZSB4U3RyZWFtQnVmZmVyQ3JlYXRlU3RhdGljKCB4QnVmZmVyU2l6ZUJ5dGVzLCB4VHJpZ2dlckxldmVsQnl0ZXMsIHB1Y1N0cmVhbUJ1ZmZlclN0b3JhZ2VBcmVhLCBweFN0YXRpY1N0cmVhbUJ1ZmZlciApIHhTdHJlYW1CdWZmZXJHZW5lcmljQ3JlYXRlU3RhdGljKCB4QnVmZmVyU2l6ZUJ5dGVzLCB4VHJpZ2dlckxldmVsQnl0ZXMsIHBkRkFMU0UsIHB1Y1N0cmVhbUJ1ZmZlclN0b3JhZ2VBcmVhLCBweFN0YXRpY1N0cmVhbUJ1ZmZlciApCisKKy8qKgorICogc3RyZWFtX2J1ZmZlci5oCisgKgorPHByZT4KK3NpemVfdCB4U3RyZWFtQnVmZmVyU2VuZCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcHZUeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOworPHByZT4KKyAqCisgKiBTZW5kcyBieXRlcyB0byBhIHN0cmVhbSBidWZmZXIuICBUaGUgYnl0ZXMgYXJlIGNvcGllZCBpbnRvIHRoZSBzdHJlYW0gYnVmZmVyLgorICoKKyAqICoqKk5PVEUqKio6ICBVbmlxdWVseSBhbW9uZyBGcmVlUlRPUyBvYmplY3RzLCB0aGUgc3RyZWFtIGJ1ZmZlcgorICogaW1wbGVtZW50YXRpb24gKHNvIGFsc28gdGhlIG1lc3NhZ2UgYnVmZmVyIGltcGxlbWVudGF0aW9uLCBhcyBtZXNzYWdlIGJ1ZmZlcnMKKyAqIGFyZSBidWlsdCBvbiB0b3Agb2Ygc3RyZWFtIGJ1ZmZlcnMpIGFzc3VtZXMgdGhlcmUgaXMgb25seSBvbmUgdGFzayBvcgorICogaW50ZXJydXB0IHRoYXQgd2lsbCB3cml0ZSB0byB0aGUgYnVmZmVyICh0aGUgd3JpdGVyKSwgYW5kIG9ubHkgb25lIHRhc2sgb3IKKyAqIGludGVycnVwdCB0aGF0IHdpbGwgcmVhZCBmcm9tIHRoZSBidWZmZXIgKHRoZSByZWFkZXIpLiAgSXQgaXMgc2FmZSBmb3IgdGhlCisgKiB3cml0ZXIgYW5kIHJlYWRlciB0byBiZSBkaWZmZXJlbnQgdGFza3Mgb3IgaW50ZXJydXB0cywgYnV0LCB1bmxpa2Ugb3RoZXIKKyAqIEZyZWVSVE9TIG9iamVjdHMsIGl0IGlzIG5vdCBzYWZlIHRvIGhhdmUgbXVsdGlwbGUgZGlmZmVyZW50IHdyaXRlcnMgb3IKKyAqIG11bHRpcGxlIGRpZmZlcmVudCByZWFkZXJzLiAgSWYgdGhlcmUgYXJlIHRvIGJlIG11bHRpcGxlIGRpZmZlcmVudCB3cml0ZXJzCisgKiB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwbGFjZSBlYWNoIGNhbGwgdG8gYSB3cml0aW5nIEFQSSBmdW5jdGlvbgorICogKHN1Y2ggYXMgeFN0cmVhbUJ1ZmZlclNlbmQoKSkgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2V0IHRoZSBzZW5kCisgKiBibG9jayB0aW1lIHRvIDAuICBMaWtld2lzZSwgaWYgdGhlcmUgYXJlIHRvIGJlIG11bHRpcGxlIGRpZmZlcmVudCByZWFkZXJzCisgKiB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwbGFjZSBlYWNoIGNhbGwgdG8gYSByZWFkaW5nIEFQSSBmdW5jdGlvbgorICogKHN1Y2ggYXMgeFN0cmVhbUJ1ZmZlclJlYWQoKSkgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2V0IHRoZSByZWNlaXZlCisgKiBibG9jayB0aW1lIHRvIDAuCisgKgorICogVXNlIHhTdHJlYW1CdWZmZXJTZW5kKCkgdG8gd3JpdGUgdG8gYSBzdHJlYW0gYnVmZmVyIGZyb20gYSB0YXNrLiAgVXNlCisgKiB4U3RyZWFtQnVmZmVyU2VuZEZyb21JU1IoKSB0byB3cml0ZSB0byBhIHN0cmVhbSBidWZmZXIgZnJvbSBhbiBpbnRlcnJ1cHQKKyAqIHNlcnZpY2Ugcm91dGluZSAoSVNSKS4KKyAqCisgKiBAcGFyYW0geFN0cmVhbUJ1ZmZlciBUaGUgaGFuZGxlIG9mIHRoZSBzdHJlYW0gYnVmZmVyIHRvIHdoaWNoIGEgc3RyZWFtIGlzCisgKiBiZWluZyBzZW50LgorICoKKyAqIEBwYXJhbSBwdlR4RGF0YSBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IGhvbGRzIHRoZSBieXRlcyB0byBiZSBjb3BpZWQKKyAqIGludG8gdGhlIHN0cmVhbSBidWZmZXIuCisgKgorICogQHBhcmFtIHhEYXRhTGVuZ3RoQnl0ZXMgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHB2VHhEYXRhCisgKiBpbnRvIHRoZSBzdHJlYW0gYnVmZmVyLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhlIHRhc2sgc2hvdWxkIHJlbWFpbiBpbiB0aGUKKyAqIEJsb2NrZWQgc3RhdGUgdG8gd2FpdCBmb3IgZW5vdWdoIHNwYWNlIHRvIGJlY29tZSBhdmFpbGFibGUgaW4gdGhlIHN0cmVhbQorICogYnVmZmVyLCBzaG91bGQgdGhlIHN0cmVhbSBidWZmZXIgY29udGFpbiB0b28gbGl0dGxlIHNwYWNlIHRvIGhvbGQgdGhlCisgKiBhbm90aGVyIHhEYXRhTGVuZ3RoQnl0ZXMgYnl0ZXMuICBUaGUgYmxvY2sgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGljayBwZXJpb2RzLAorICogc28gdGhlIGFic29sdXRlIHRpbWUgaXQgcmVwcmVzZW50cyBpcyBkZXBlbmRlbnQgb24gdGhlIHRpY2sgZnJlcXVlbmN5LiAgVGhlCisgKiBtYWNybyBwZE1TX1RPX1RJQ0tTKCkgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIHRpbWUgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcworICogaW50byBhIHRpbWUgc3BlY2lmaWVkIGluIHRpY2tzLiAgU2V0dGluZyB4VGlja3NUb1dhaXQgdG8gcG9ydE1BWF9ERUxBWSB3aWxsCisgKiBjYXVzZSB0aGUgdGFzayB0byB3YWl0IGluZGVmaW5pdGVseSAod2l0aG91dCB0aW1pbmcgb3V0KSwgcHJvdmlkZWQKKyAqIElOQ0xVREVfdlRhc2tTdXNwZW5kIGlzIHNldCB0byAxIGluIEZyZWVSVE9TQ29uZmlnLmguICBJZiBhIHRhc2sgdGltZXMgb3V0CisgKiBiZWZvcmUgaXQgY2FuIHdyaXRlIGFsbCB4RGF0YUxlbmd0aEJ5dGVzIGludG8gdGhlIGJ1ZmZlciBpdCB3aWxsIHN0aWxsIHdyaXRlCisgKiBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlLiAgQSB0YXNrIGRvZXMgbm90IHVzZSBhbnkgQ1BVIHRpbWUgd2hlbiBpdCBpcyBpbgorICogdGhlIGJsb2NrZWQgc3RhdGUuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBidWZmZXIuICBJZiBhIHRhc2sgdGltZXMKKyAqIG91dCBiZWZvcmUgaXQgY2FuIHdyaXRlIGFsbCB4RGF0YUxlbmd0aEJ5dGVzIGludG8gdGhlIGJ1ZmZlciBpdCB3aWxsIHN0aWxsCisgKiB3cml0ZSBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlLgorICoKKyAqIEV4YW1wbGUgdXNlOgorPHByZT4KK3ZvaWQgdkFGdW5jdGlvbiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCit7CitzaXplX3QgeEJ5dGVzU2VudDsKK3VpbnQ4X3QgdWNBcnJheVRvU2VuZFtdID0geyAwLCAxLCAyLCAzIH07CitjaGFyICpwY1N0cmluZ1RvU2VuZCA9ICJTdHJpbmcgdG8gc2VuZCI7Citjb25zdCBUaWNrVHlwZV90IHgxMDBtcyA9IHBkTVNfVE9fVElDS1MoIDEwMCApOworCisgICAgLy8gU2VuZCBhbiBhcnJheSB0byB0aGUgc3RyZWFtIGJ1ZmZlciwgYmxvY2tpbmcgZm9yIGEgbWF4aW11bSBvZiAxMDBtcyB0bworICAgIC8vIHdhaXQgZm9yIGVub3VnaCBzcGFjZSB0byBiZSBhdmFpbGFibGUgaW4gdGhlIHN0cmVhbSBidWZmZXIuCisgICAgeEJ5dGVzU2VudCA9IHhTdHJlYW1CdWZmZXJTZW5kKCB4U3RyZWFtQnVmZmVyLCAoIHZvaWQgKiApIHVjQXJyYXlUb1NlbmQsIHNpemVvZiggdWNBcnJheVRvU2VuZCApLCB4MTAwbXMgKTsKKworICAgIGlmKCB4Qnl0ZXNTZW50ICE9IHNpemVvZiggdWNBcnJheVRvU2VuZCApICkKKyAgICB7CisgICAgICAgIC8vIFRoZSBjYWxsIHRvIHhTdHJlYW1CdWZmZXJTZW5kKCkgdGltZXMgb3V0IGJlZm9yZSB0aGVyZSB3YXMgZW5vdWdoCisgICAgICAgIC8vIHNwYWNlIGluIHRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4sIGJ1dCBpdCBkaWQKKyAgICAgICAgLy8gc3VjY2Vzc2Z1bGx5IHdyaXRlIHhCeXRlc1NlbnQgYnl0ZXMuCisgICAgfQorCisgICAgLy8gU2VuZCB0aGUgc3RyaW5nIHRvIHRoZSBzdHJlYW0gYnVmZmVyLiAgUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGlzIG5vdAorICAgIC8vIGVub3VnaCBzcGFjZSBpbiB0aGUgYnVmZmVyLgorICAgIHhCeXRlc1NlbnQgPSB4U3RyZWFtQnVmZmVyU2VuZCggeFN0cmVhbUJ1ZmZlciwgKCB2b2lkICogKSBwY1N0cmluZ1RvU2VuZCwgc3RybGVuKCBwY1N0cmluZ1RvU2VuZCApLCAwICk7CisKKyAgICBpZiggeEJ5dGVzU2VudCAhPSBzdHJsZW4oIHBjU3RyaW5nVG9TZW5kICkgKQorICAgIHsKKyAgICAgICAgLy8gVGhlIGVudGlyZSBzdHJpbmcgY291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBzdHJlYW0gYnVmZmVyIGJlY2F1c2UKKyAgICAgICAgLy8gdGhlcmUgd2FzIG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyLCBidXQgeEJ5dGVzU2VudCBieXRlcworICAgICAgICAvLyB3ZXJlIHNlbnQuICBDb3VsZCB0cnkgYWdhaW4gdG8gc2VuZCB0aGUgcmVtYWluaW5nIGJ5dGVzLgorICAgIH0KK30KKzwvcHJlPgorICogXGRlZmdyb3VwIHhTdHJlYW1CdWZmZXJTZW5kIHhTdHJlYW1CdWZmZXJTZW5kCisgKiBcaW5ncm91cCBTdHJlYW1CdWZmZXJNYW5hZ2VtZW50CisgKi8KK3NpemVfdCB4U3RyZWFtQnVmZmVyU2VuZCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwKKwkJCQkJCSAgY29uc3Qgdm9pZCAqcHZUeERhdGEsCisJCQkJCQkgIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLAorCQkJCQkJICBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogc3RyZWFtX2J1ZmZlci5oCisgKgorPHByZT4KK3NpemVfdCB4U3RyZWFtQnVmZmVyU2VuZEZyb21JU1IoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwdlR4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworPHByZT4KKyAqCisgKiBJbnRlcnJ1cHQgc2FmZSB2ZXJzaW9uIG9mIHRoZSBBUEkgZnVuY3Rpb24gdGhhdCBzZW5kcyBhIHN0cmVhbSBvZiBieXRlcyB0bworICogdGhlIHN0cmVhbSBidWZmZXIuCisgKgorICogKioqTk9URSoqKjogIFVuaXF1ZWx5IGFtb25nIEZyZWVSVE9TIG9iamVjdHMsIHRoZSBzdHJlYW0gYnVmZmVyCisgKiBpbXBsZW1lbnRhdGlvbiAoc28gYWxzbyB0aGUgbWVzc2FnZSBidWZmZXIgaW1wbGVtZW50YXRpb24sIGFzIG1lc3NhZ2UgYnVmZmVycworICogYXJlIGJ1aWx0IG9uIHRvcCBvZiBzdHJlYW0gYnVmZmVycykgYXNzdW1lcyB0aGVyZSBpcyBvbmx5IG9uZSB0YXNrIG9yCisgKiBpbnRlcnJ1cHQgdGhhdCB3aWxsIHdyaXRlIHRvIHRoZSBidWZmZXIgKHRoZSB3cml0ZXIpLCBhbmQgb25seSBvbmUgdGFzayBvcgorICogaW50ZXJydXB0IHRoYXQgd2lsbCByZWFkIGZyb20gdGhlIGJ1ZmZlciAodGhlIHJlYWRlcikuICBJdCBpcyBzYWZlIGZvciB0aGUKKyAqIHdyaXRlciBhbmQgcmVhZGVyIHRvIGJlIGRpZmZlcmVudCB0YXNrcyBvciBpbnRlcnJ1cHRzLCBidXQsIHVubGlrZSBvdGhlcgorICogRnJlZVJUT1Mgb2JqZWN0cywgaXQgaXMgbm90IHNhZmUgdG8gaGF2ZSBtdWx0aXBsZSBkaWZmZXJlbnQgd3JpdGVycyBvcgorICogbXVsdGlwbGUgZGlmZmVyZW50IHJlYWRlcnMuICBJZiB0aGVyZSBhcmUgdG8gYmUgbXVsdGlwbGUgZGlmZmVyZW50IHdyaXRlcnMKKyAqIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0IHBsYWNlIGVhY2ggY2FsbCB0byBhIHdyaXRpbmcgQVBJIGZ1bmN0aW9uCisgKiAoc3VjaCBhcyB4U3RyZWFtQnVmZmVyU2VuZCgpKSBpbnNpZGUgYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBzZXQgdGhlIHNlbmQKKyAqIGJsb2NrIHRpbWUgdG8gMC4gIExpa2V3aXNlLCBpZiB0aGVyZSBhcmUgdG8gYmUgbXVsdGlwbGUgZGlmZmVyZW50IHJlYWRlcnMKKyAqIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0IHBsYWNlIGVhY2ggY2FsbCB0byBhIHJlYWRpbmcgQVBJIGZ1bmN0aW9uCisgKiAoc3VjaCBhcyB4U3RyZWFtQnVmZmVyUmVhZCgpKSBpbnNpZGUgYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBzZXQgdGhlIHJlY2VpdmUKKyAqIGJsb2NrIHRpbWUgdG8gMC4KKyAqCisgKiBVc2UgeFN0cmVhbUJ1ZmZlclNlbmQoKSB0byB3cml0ZSB0byBhIHN0cmVhbSBidWZmZXIgZnJvbSBhIHRhc2suICBVc2UKKyAqIHhTdHJlYW1CdWZmZXJTZW5kRnJvbUlTUigpIHRvIHdyaXRlIHRvIGEgc3RyZWFtIGJ1ZmZlciBmcm9tIGFuIGludGVycnVwdAorICogc2VydmljZSByb3V0aW5lIChJU1IpLgorICoKKyAqIEBwYXJhbSB4U3RyZWFtQnVmZmVyIFRoZSBoYW5kbGUgb2YgdGhlIHN0cmVhbSBidWZmZXIgdG8gd2hpY2ggYSBzdHJlYW0gaXMKKyAqIGJlaW5nIHNlbnQuCisgKgorICogQHBhcmFtIHB2VHhEYXRhIEEgcG9pbnRlciB0byB0aGUgZGF0YSB0aGF0IGlzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBzdHJlYW0KKyAqIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0geERhdGFMZW5ndGhCeXRlcyBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHB2VHhEYXRhCisgKiBpbnRvIHRoZSBzdHJlYW0gYnVmZmVyLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGEgc3RyZWFtIGJ1ZmZlciB3aWxsCisgKiBoYXZlIGEgdGFzayBibG9ja2VkIG9uIGl0IHdhaXRpbmcgZm9yIGRhdGEuICBDYWxsaW5nCisgKiB4U3RyZWFtQnVmZmVyU2VuZEZyb21JU1IoKSBjYW4gbWFrZSBkYXRhIGF2YWlsYWJsZSwgYW5kIHNvIGNhdXNlIGEgdGFzayB0aGF0CisgKiB3YXMgd2FpdGluZyBmb3IgZGF0YSB0byBsZWF2ZSB0aGUgQmxvY2tlZCBzdGF0ZS4gIElmIGNhbGxpbmcKKyAqIHhTdHJlYW1CdWZmZXJTZW5kRnJvbUlTUigpIGNhdXNlcyBhIHRhc2sgdG8gbGVhdmUgdGhlIEJsb2NrZWQgc3RhdGUsIGFuZCB0aGUKKyAqIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgKHRoZQorICogdGFzayB0aGF0IHdhcyBpbnRlcnJ1cHRlZCksIHRoZW4sIGludGVybmFsbHksIHhTdHJlYW1CdWZmZXJTZW5kRnJvbUlTUigpCisgKiB3aWxsIHNldCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB0byBwZFRSVUUuICBJZgorICogeFN0cmVhbUJ1ZmZlclNlbmRGcm9tSVNSKCkgc2V0cyB0aGlzIHZhbHVlIHRvIHBkVFJVRSwgdGhlbiBub3JtYWxseSBhCisgKiBjb250ZXh0IHN3aXRjaCBzaG91bGQgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIGV4aXRlZC4gIFRoaXMgd2lsbAorICogZW5zdXJlIHRoYXQgdGhlIGludGVycnVwdCByZXR1cm5zIGRpcmVjdGx5IHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IFJlYWR5CisgKiBzdGF0ZSB0YXNrLiAgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gc2hvdWxkIGJlIHNldCB0byBwZEZBTFNFIGJlZm9yZSBpdAorICogaXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uLiAgU2VlIHRoZSBleGFtcGxlIGNvZGUgYmVsb3cgZm9yIGFuIGV4YW1wbGUuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBidWZmZXIsIHdoaWNoIHdpbGwKKyAqIGJlIGxlc3MgdGhhbiB4RGF0YUxlbmd0aEJ5dGVzIGlmIHRoZSBzdHJlYW0gYnVmZmVyIGRpZG4ndCBoYXZlIGVub3VnaCBmcmVlCisgKiBzcGFjZSBmb3IgYWxsIHRoZSBieXRlcyB0byBiZSB3cml0dGVuLgorICoKKyAqIEV4YW1wbGUgdXNlOgorPHByZT4KKy8vIEEgc3RyZWFtIGJ1ZmZlciB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZC4KK1N0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXI7CisKK3ZvaWQgdkFuSW50ZXJydXB0U2VydmljZVJvdXRpbmUoIHZvaWQgKQoreworc2l6ZV90IHhCeXRlc1NlbnQ7CitjaGFyICpwY1N0cmluZ1RvU2VuZCA9ICJTdHJpbmcgdG8gc2VuZCI7CitCYXNlVHlwZV90IHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkRkFMU0U7IC8vIEluaXRpYWxpc2VkIHRvIHBkRkFMU0UuCisKKyAgICAvLyBBdHRlbXB0IHRvIHNlbmQgdGhlIHN0cmluZyB0byB0aGUgc3RyZWFtIGJ1ZmZlci4KKyAgICB4Qnl0ZXNTZW50ID0geFN0cmVhbUJ1ZmZlclNlbmRGcm9tSVNSKCB4U3RyZWFtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdm9pZCAqICkgcGNTdHJpbmdUb1NlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCBwY1N0cmluZ1RvU2VuZCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKworICAgIGlmKCB4Qnl0ZXNTZW50ICE9IHN0cmxlbiggcGNTdHJpbmdUb1NlbmQgKSApCisgICAgeworICAgICAgICAvLyBUaGVyZSB3YXMgbm90IGVub3VnaCBmcmVlIHNwYWNlIGluIHRoZSBzdHJlYW0gYnVmZmVyIGZvciB0aGUgZW50aXJlCisgICAgICAgIC8vIHN0cmluZyB0byBiZSB3cml0dGVuLCB1dCB4Qnl0ZXNTZW50IGJ5dGVzIHdlcmUgd3JpdHRlbi4KKyAgICB9CisKKyAgICAvLyBJZiB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gd2FzIHNldCB0byBwZFRSVUUgaW5zaWRlCisgICAgLy8geFN0cmVhbUJ1ZmZlclNlbmRGcm9tSVNSKCkgdGhlbiBhIHRhc2sgdGhhdCBoYXMgYSBwcmlvcml0eSBhYm92ZSB0aGUKKyAgICAvLyBwcmlvcml0eSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrIHdhcyB1bmJsb2NrZWQgYW5kIGEgY29udGV4dAorICAgIC8vIHN3aXRjaCBzaG91bGQgYmUgcGVyZm9ybWVkIHRvIGVuc3VyZSB0aGUgSVNSIHJldHVybnMgdG8gdGhlIHVuYmxvY2tlZAorICAgIC8vIHRhc2suICBJbiBtb3N0IEZyZWVSVE9TIHBvcnRzIHRoaXMgaXMgZG9uZSBieSBzaW1wbHkgcGFzc2luZworICAgIC8vIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBpbnRvIHRhc2tZSUVMRF9GUk9NX0lTUigpLCB3aGljaCB3aWxsIHRlc3QgdGhlCisgICAgLy8gdmFyaWFibGVzIHZhbHVlLCBhbmQgcGVyZm9ybSB0aGUgY29udGV4dCBzd2l0Y2ggaWYgbmVjZXNzYXJ5LiAgQ2hlY2sgdGhlCisgICAgLy8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHBvcnQgaW4gdXNlIGZvciBwb3J0IHNwZWNpZmljIGluc3RydWN0aW9ucy4KKyAgICB0YXNrWUlFTERfRlJPTV9JU1IoIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworfQorPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFN0cmVhbUJ1ZmZlclNlbmRGcm9tSVNSIHhTdHJlYW1CdWZmZXJTZW5kRnJvbUlTUgorICogXGluZ3JvdXAgU3RyZWFtQnVmZmVyTWFuYWdlbWVudAorICovCitzaXplX3QgeFN0cmVhbUJ1ZmZlclNlbmRGcm9tSVNSKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLAorCQkJCQkJCQkgY29uc3Qgdm9pZCAqcHZUeERhdGEsCisJCQkJCQkJCSBzaXplX3QgeERhdGFMZW5ndGhCeXRlcywKKwkJCQkJCQkJIEJhc2VUeXBlX3QgKiBjb25zdCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBzdHJlYW1fYnVmZmVyLmgKKyAqCis8cHJlPgorc2l6ZV90IHhTdHJlYW1CdWZmZXJSZWNlaXZlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwdlJ4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKKzwvcHJlPgorICoKKyAqIFJlY2VpdmVzIGJ5dGVzIGZyb20gYSBzdHJlYW0gYnVmZmVyLgorICoKKyAqICoqKk5PVEUqKio6ICBVbmlxdWVseSBhbW9uZyBGcmVlUlRPUyBvYmplY3RzLCB0aGUgc3RyZWFtIGJ1ZmZlcgorICogaW1wbGVtZW50YXRpb24gKHNvIGFsc28gdGhlIG1lc3NhZ2UgYnVmZmVyIGltcGxlbWVudGF0aW9uLCBhcyBtZXNzYWdlIGJ1ZmZlcnMKKyAqIGFyZSBidWlsdCBvbiB0b3Agb2Ygc3RyZWFtIGJ1ZmZlcnMpIGFzc3VtZXMgdGhlcmUgaXMgb25seSBvbmUgdGFzayBvcgorICogaW50ZXJydXB0IHRoYXQgd2lsbCB3cml0ZSB0byB0aGUgYnVmZmVyICh0aGUgd3JpdGVyKSwgYW5kIG9ubHkgb25lIHRhc2sgb3IKKyAqIGludGVycnVwdCB0aGF0IHdpbGwgcmVhZCBmcm9tIHRoZSBidWZmZXIgKHRoZSByZWFkZXIpLiAgSXQgaXMgc2FmZSBmb3IgdGhlCisgKiB3cml0ZXIgYW5kIHJlYWRlciB0byBiZSBkaWZmZXJlbnQgdGFza3Mgb3IgaW50ZXJydXB0cywgYnV0LCB1bmxpa2Ugb3RoZXIKKyAqIEZyZWVSVE9TIG9iamVjdHMsIGl0IGlzIG5vdCBzYWZlIHRvIGhhdmUgbXVsdGlwbGUgZGlmZmVyZW50IHdyaXRlcnMgb3IKKyAqIG11bHRpcGxlIGRpZmZlcmVudCByZWFkZXJzLiAgSWYgdGhlcmUgYXJlIHRvIGJlIG11bHRpcGxlIGRpZmZlcmVudCB3cml0ZXJzCisgKiB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwbGFjZSBlYWNoIGNhbGwgdG8gYSB3cml0aW5nIEFQSSBmdW5jdGlvbgorICogKHN1Y2ggYXMgeFN0cmVhbUJ1ZmZlclNlbmQoKSkgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2V0IHRoZSBzZW5kCisgKiBibG9jayB0aW1lIHRvIDAuICBMaWtld2lzZSwgaWYgdGhlcmUgYXJlIHRvIGJlIG11bHRpcGxlIGRpZmZlcmVudCByZWFkZXJzCisgKiB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwbGFjZSBlYWNoIGNhbGwgdG8gYSByZWFkaW5nIEFQSSBmdW5jdGlvbgorICogKHN1Y2ggYXMgeFN0cmVhbUJ1ZmZlclJlYWQoKSkgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2V0IHRoZSByZWNlaXZlCisgKiBibG9jayB0aW1lIHRvIDAuCisgKgorICogVXNlIHhTdHJlYW1CdWZmZXJSZWNlaXZlKCkgdG8gcmVhZCBmcm9tIGEgc3RyZWFtIGJ1ZmZlciBmcm9tIGEgdGFzay4gIFVzZQorICogeFN0cmVhbUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCkgdG8gcmVhZCBmcm9tIGEgc3RyZWFtIGJ1ZmZlciBmcm9tIGFuCisgKiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIChJU1IpLgorICoKKyAqIEBwYXJhbSB4U3RyZWFtQnVmZmVyIFRoZSBoYW5kbGUgb2YgdGhlIHN0cmVhbSBidWZmZXIgZnJvbSB3aGljaCBieXRlcyBhcmUgdG8KKyAqIGJlIHJlY2VpdmVkLgorICoKKyAqIEBwYXJhbSBwdlJ4RGF0YSBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSByZWNlaXZlZCBieXRlcyB3aWxsIGJlCisgKiBjb3BpZWQuCisgKgorICogQHBhcmFtIHhCdWZmZXJMZW5ndGhCeXRlcyBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUKKyAqIHB2UnhEYXRhIHBhcmFtZXRlci4gIFRoaXMgc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVjZWl2ZSBpbiBvbmUKKyAqIGNhbGwuICB4U3RyZWFtQnVmZmVyUmVjZWl2ZSB3aWxsIHJldHVybiBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlIHVwIHRvIGEKKyAqIG1heGltdW0gc2V0IGJ5IHhCdWZmZXJMZW5ndGhCeXRlcy4KKyAqCisgKiBAcGFyYW0geFRpY2tzVG9XYWl0IFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRoZSB0YXNrIHNob3VsZCByZW1haW4gaW4gdGhlCisgKiBCbG9ja2VkIHN0YXRlIHRvIHdhaXQgZm9yIGRhdGEgdG8gYmVjb21lIGF2YWlsYWJsZSBpZiB0aGUgc3RyZWFtIGJ1ZmZlciBpcworICogZW1wdHkuICB4U3RyZWFtQnVmZmVyUmVjZWl2ZSgpIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHhUaWNrc1RvV2FpdCBpcworICogemVyby4gIFRoZSBibG9jayB0aW1lIGlzIHNwZWNpZmllZCBpbiB0aWNrIHBlcmlvZHMsIHNvIHRoZSBhYnNvbHV0ZSB0aW1lIGl0CisgKiByZXByZXNlbnRzIGlzIGRlcGVuZGVudCBvbiB0aGUgdGljayBmcmVxdWVuY3kuICBUaGUgbWFjcm8gcGRNU19UT19USUNLUygpIGNhbgorICogYmUgdXNlZCB0byBjb252ZXJ0IGEgdGltZSBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzIGludG8gYSB0aW1lIHNwZWNpZmllZCBpbgorICogdGlja3MuICBTZXR0aW5nIHhUaWNrc1RvV2FpdCB0byBwb3J0TUFYX0RFTEFZIHdpbGwgY2F1c2UgdGhlIHRhc2sgdG8gd2FpdAorICogaW5kZWZpbml0ZWx5ICh3aXRob3V0IHRpbWluZyBvdXQpLCBwcm92aWRlZCBJTkNMVURFX3ZUYXNrU3VzcGVuZCBpcyBzZXQgdG8gMQorICogaW4gRnJlZVJUT1NDb25maWcuaC4gIEEgdGFzayBkb2VzIG5vdCB1c2UgYW55IENQVSB0aW1lIHdoZW4gaXQgaXMgaW4gdGhlCisgKiBCbG9ja2VkIHN0YXRlLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIGZyb20gdGhlIHN0cmVhbSBidWZmZXIsIHdoaWNoIHdpbGwKKyAqIGJlIGxlc3MgdGhhbiB4QnVmZmVyTGVuZ3RoQnl0ZXMgaWYgdGhlIGNhbGwgdG8geFN0cmVhbUJ1ZmZlclJlY2VpdmUoKSB0aW1lZAorICogb3V0IGJlZm9yZSB4QnVmZmVyTGVuZ3RoQnl0ZXMgd2VyZSBhdmFpbGFibGUuCisgKgorICogRXhhbXBsZSB1c2U6Cis8cHJlPgordm9pZCB2QUZ1bmN0aW9uKCBTdHJlYW1CdWZmZXJfdCB4U3RyZWFtQnVmZmVyICkKK3sKK3VpbnQ4X3QgdWNSeERhdGFbIDIwIF07CitzaXplX3QgeFJlY2VpdmVkQnl0ZXM7Citjb25zdCBUaWNrVHlwZV90IHhCbG9ja1RpbWUgPSBwZE1TX1RPX1RJQ0tTKCAyMCApOworCisgICAgLy8gUmVjZWl2ZSB1cCB0byBhbm90aGVyIHNpemVvZiggdWNSeERhdGEgKSBieXRlcyBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyLgorICAgIC8vIFdhaXQgaW4gdGhlIEJsb2NrZWQgc3RhdGUgKHNvIG5vdCB1c2luZyBhbnkgQ1BVIHByb2Nlc3NpbmcgdGltZSkgZm9yIGEKKyAgICAvLyBtYXhpbXVtIG9mIDEwMG1zIGZvciB0aGUgZnVsbCBzaXplb2YoIHVjUnhEYXRhICkgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlCisgICAgLy8gYXZhaWxhYmxlLgorICAgIHhSZWNlaXZlZEJ5dGVzID0geFN0cmVhbUJ1ZmZlclJlY2VpdmUoIHhTdHJlYW1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2lkICogKSB1Y1J4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHVjUnhEYXRhICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeEJsb2NrVGltZSApOworCisgICAgaWYoIHhSZWNlaXZlZEJ5dGVzID4gMCApCisgICAgeworICAgICAgICAvLyBBIHVjUnhEYXRhIGNvbnRhaW5zIGFub3RoZXIgeFJlY2lldmVkQnl0ZXMgYnl0ZXMgb2YgZGF0YSwgd2hpY2ggY2FuCisgICAgICAgIC8vIGJlIHByb2Nlc3NlZCBoZXJlLi4uLgorICAgIH0KK30KKzwvcHJlPgorICogXGRlZmdyb3VwIHhTdHJlYW1CdWZmZXJSZWNlaXZlIHhTdHJlYW1CdWZmZXJSZWNlaXZlCisgKiBcaW5ncm91cCBTdHJlYW1CdWZmZXJNYW5hZ2VtZW50CisgKi8KK3NpemVfdCB4U3RyZWFtQnVmZmVyUmVjZWl2ZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwKKwkJCQkJCQkgdm9pZCAqcHZSeERhdGEsCisJCQkJCQkJIHNpemVfdCB4QnVmZmVyTGVuZ3RoQnl0ZXMsCisJCQkJCQkJIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBzdHJlYW1fYnVmZmVyLmgKKyAqCis8cHJlPgorc2l6ZV90IHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB2UnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKzwvcHJlPgorICoKKyAqIEFuIGludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIEFQSSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGJ5dGVzIGZyb20gYQorICogc3RyZWFtIGJ1ZmZlci4KKyAqCisgKiBVc2UgeFN0cmVhbUJ1ZmZlclJlY2VpdmUoKSB0byByZWFkIGJ5dGVzIGZyb20gYSBzdHJlYW0gYnVmZmVyIGZyb20gYSB0YXNrLgorICogVXNlIHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUigpIHRvIHJlYWQgYnl0ZXMgZnJvbSBhIHN0cmVhbSBidWZmZXIgZnJvbSBhbgorICogaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAoSVNSKS4KKyAqCisgKiBAcGFyYW0geFN0cmVhbUJ1ZmZlciBUaGUgaGFuZGxlIG9mIHRoZSBzdHJlYW0gYnVmZmVyIGZyb20gd2hpY2ggYSBzdHJlYW0KKyAqIGlzIGJlaW5nIHJlY2VpdmVkLgorICoKKyAqIEBwYXJhbSBwdlJ4RGF0YSBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSByZWNlaXZlZCBieXRlcyBhcmUKKyAqIGNvcGllZC4KKyAqCisgKiBAcGFyYW0geEJ1ZmZlckxlbmd0aEJ5dGVzIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoZQorICogcHZSeERhdGEgcGFyYW1ldGVyLiAgVGhpcyBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWNlaXZlIGluIG9uZQorICogY2FsbC4gIHhTdHJlYW1CdWZmZXJSZWNlaXZlIHdpbGwgcmV0dXJuIGFzIG1hbnkgYnl0ZXMgYXMgcG9zc2libGUgdXAgdG8gYQorICogbWF4aW11bSBzZXQgYnkgeEJ1ZmZlckxlbmd0aEJ5dGVzLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGEgc3RyZWFtIGJ1ZmZlciB3aWxsCisgKiBoYXZlIGEgdGFzayBibG9ja2VkIG9uIGl0IHdhaXRpbmcgZm9yIHNwYWNlIHRvIGJlY29tZSBhdmFpbGFibGUuICBDYWxsaW5nCisgKiB4U3RyZWFtQnVmZmVyUmVjZWl2ZUZyb21JU1IoKSBjYW4gbWFrZSBzcGFjZSBhdmFpbGFibGUsIGFuZCBzbyBjYXVzZSBhIHRhc2sKKyAqIHRoYXQgaXMgd2FpdGluZyBmb3Igc3BhY2UgdG8gbGVhdmUgdGhlIEJsb2NrZWQgc3RhdGUuICBJZiBjYWxsaW5nCisgKiB4U3RyZWFtQnVmZmVyUmVjZWl2ZUZyb21JU1IoKSBjYXVzZXMgYSB0YXNrIHRvIGxlYXZlIHRoZSBCbG9ja2VkIHN0YXRlLCBhbmQKKyAqIHRoZSB1bmJsb2NrZWQgdGFzayBoYXMgYSBwcmlvcml0eSBoaWdoZXIgdGhhbiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrCisgKiAodGhlIHRhc2sgdGhhdCB3YXMgaW50ZXJydXB0ZWQpLCB0aGVuLCBpbnRlcm5hbGx5LAorICogeFN0cmVhbUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCkgd2lsbCBzZXQgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gdG8gcGRUUlVFLgorICogSWYgeFN0cmVhbUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCkgc2V0cyB0aGlzIHZhbHVlIHRvIHBkVFJVRSwgdGhlbiBub3JtYWxseSBhCisgKiBjb250ZXh0IHN3aXRjaCBzaG91bGQgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIGV4aXRlZC4gIFRoYXQgd2lsbAorICogZW5zdXJlIHRoZSBpbnRlcnJ1cHQgcmV0dXJucyBkaXJlY3RseSB0byB0aGUgaGlnaGVzdCBwcmlvcml0eSBSZWFkeSBzdGF0ZQorICogdGFzay4gICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHNob3VsZCBiZSBzZXQgdG8gcGRGQUxTRSBiZWZvcmUgaXQgaXMKKyAqIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvbi4gIFNlZSB0aGUgY29kZSBleGFtcGxlIGJlbG93IGZvciBhbiBleGFtcGxlLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSBidWZmZXIsIGlmIGFueS4KKyAqCisgKiBFeGFtcGxlIHVzZToKKzxwcmU+CisvLyBBIHN0cmVhbSBidWZmZXIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQuCitTdHJlYW1CdWZmZXJfdCB4U3RyZWFtQnVmZmVyOworCit2b2lkIHZBbkludGVycnVwdFNlcnZpY2VSb3V0aW5lKCB2b2lkICkKK3sKK3VpbnQ4X3QgdWNSeERhdGFbIDIwIF07CitzaXplX3QgeFJlY2VpdmVkQnl0ZXM7CitCYXNlVHlwZV90IHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkRkFMU0U7ICAvLyBJbml0aWFsaXNlZCB0byBwZEZBTFNFLgorCisgICAgLy8gUmVjZWl2ZSB0aGUgbmV4dCBzdHJlYW0gZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlci4KKyAgICB4UmVjZWl2ZWRCeXRlcyA9IHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUiggeFN0cmVhbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2lkICogKSB1Y1J4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCB1Y1J4RGF0YSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisKKyAgICBpZiggeFJlY2VpdmVkQnl0ZXMgPiAwICkKKyAgICB7CisgICAgICAgIC8vIHVjUnhEYXRhIGNvbnRhaW5zIHhSZWNlaXZlZEJ5dGVzIHJlYWQgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlci4KKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgc3RyZWFtIGhlcmUuLi4uCisgICAgfQorCisgICAgLy8gSWYgeEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHdhcyBzZXQgdG8gcGRUUlVFIGluc2lkZQorICAgIC8vIHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUigpIHRoZW4gYSB0YXNrIHRoYXQgaGFzIGEgcHJpb3JpdHkgYWJvdmUgdGhlCisgICAgLy8gcHJpb3JpdHkgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayB3YXMgdW5ibG9ja2VkIGFuZCBhIGNvbnRleHQKKyAgICAvLyBzd2l0Y2ggc2hvdWxkIGJlIHBlcmZvcm1lZCB0byBlbnN1cmUgdGhlIElTUiByZXR1cm5zIHRvIHRoZSB1bmJsb2NrZWQKKyAgICAvLyB0YXNrLiAgSW4gbW9zdCBGcmVlUlRPUyBwb3J0cyB0aGlzIGlzIGRvbmUgYnkgc2ltcGx5IHBhc3NpbmcKKyAgICAvLyB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gaW50byB0YXNrWUlFTERfRlJPTV9JU1IoKSwgd2hpY2ggd2lsbCB0ZXN0IHRoZQorICAgIC8vIHZhcmlhYmxlcyB2YWx1ZSwgYW5kIHBlcmZvcm0gdGhlIGNvbnRleHQgc3dpdGNoIGlmIG5lY2Vzc2FyeS4gIENoZWNrIHRoZQorICAgIC8vIGRvY3VtZW50YXRpb24gZm9yIHRoZSBwb3J0IGluIHVzZSBmb3IgcG9ydCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuCisgICAgdGFza1lJRUxEX0ZST01fSVNSKCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKK30KKzwvcHJlPgorICogXGRlZmdyb3VwIHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUiB4U3RyZWFtQnVmZmVyUmVjZWl2ZUZyb21JU1IKKyAqIFxpbmdyb3VwIFN0cmVhbUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworc2l6ZV90IHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwKKwkJCQkJCQkJCXZvaWQgKnB2UnhEYXRhLAorCQkJCQkJCQkJc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywKKwkJCQkJCQkJCUJhc2VUeXBlX3QgKiBjb25zdCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBzdHJlYW1fYnVmZmVyLmgKKyAqCis8cHJlPgordm9pZCB2U3RyZWFtQnVmZmVyRGVsZXRlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICk7Cis8L3ByZT4KKyAqCisgKiBEZWxldGVzIGEgc3RyZWFtIGJ1ZmZlciB0aGF0IHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgdXNpbmcgYSBjYWxsIHRvCisgKiB4U3RyZWFtQnVmZmVyQ3JlYXRlKCkgb3IgeFN0cmVhbUJ1ZmZlckNyZWF0ZVN0YXRpYygpLiAgSWYgdGhlIHN0cmVhbQorICogYnVmZmVyIHdhcyBjcmVhdGVkIHVzaW5nIGR5bmFtaWMgbWVtb3J5ICh0aGF0IGlzLCBieSB4U3RyZWFtQnVmZmVyQ3JlYXRlKCkpLAorICogdGhlbiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpcyBmcmVlZC4KKyAqCisgKiBBIHN0cmVhbSBidWZmZXIgaGFuZGxlIG11c3Qgbm90IGJlIHVzZWQgYWZ0ZXIgdGhlIHN0cmVhbSBidWZmZXIgaGFzIGJlZW4KKyAqIGRlbGV0ZWQuCisgKgorICogQHBhcmFtIHhTdHJlYW1CdWZmZXIgVGhlIGhhbmRsZSBvZiB0aGUgc3RyZWFtIGJ1ZmZlciB0byBiZSBkZWxldGVkLgorICoKKyAqIFxkZWZncm91cCB2U3RyZWFtQnVmZmVyRGVsZXRlIHZTdHJlYW1CdWZmZXJEZWxldGUKKyAqIFxpbmdyb3VwIFN0cmVhbUJ1ZmZlck1hbmFnZW1lbnQKKyAqLwordm9pZCB2U3RyZWFtQnVmZmVyRGVsZXRlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBzdHJlYW1fYnVmZmVyLmgKKyAqCis8cHJlPgorQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVySXNGdWxsKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICk7Cis8L3ByZT4KKyAqCisgKiBRdWVyaWVzIGEgc3RyZWFtIGJ1ZmZlciB0byBzZWUgaWYgaXQgaXMgZnVsbC4gIEEgc3RyZWFtIGJ1ZmZlciBpcyBmdWxsIGlmIGl0CisgKiBkb2VzIG5vdCBoYXZlIGFueSBmcmVlIHNwYWNlLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBhY2NlcHQgYW55IG1vcmUgZGF0YS4KKyAqCisgKiBAcGFyYW0geFN0cmVhbUJ1ZmZlciBUaGUgaGFuZGxlIG9mIHRoZSBzdHJlYW0gYnVmZmVyIGJlaW5nIHF1ZXJpZWQuCisgKgorICogQHJldHVybiBJZiB0aGUgc3RyZWFtIGJ1ZmZlciBpcyBmdWxsIHRoZW4gcGRUUlVFIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlCisgKiBwZEZBTFNFIGlzIHJldHVybmVkLgorICoKKyAqIFxkZWZncm91cCB4U3RyZWFtQnVmZmVySXNGdWxsIHhTdHJlYW1CdWZmZXJJc0Z1bGwKKyAqIFxpbmdyb3VwIFN0cmVhbUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVySXNGdWxsKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBzdHJlYW1fYnVmZmVyLmgKKyAqCis8cHJlPgorQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVySXNFbXB0eSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApOworPC9wcmU+CisgKgorICogUXVlcmllcyBhIHN0cmVhbSBidWZmZXIgdG8gc2VlIGlmIGl0IGlzIGVtcHR5LiAgQSBzdHJlYW0gYnVmZmVyIGlzIGVtcHR5IGlmCisgKiBpdCBkb2VzIG5vdCBjb250YWluIGFueSBkYXRhLgorICoKKyAqIEBwYXJhbSB4U3RyZWFtQnVmZmVyIFRoZSBoYW5kbGUgb2YgdGhlIHN0cmVhbSBidWZmZXIgYmVpbmcgcXVlcmllZC4KKyAqCisgKiBAcmV0dXJuIElmIHRoZSBzdHJlYW0gYnVmZmVyIGlzIGVtcHR5IHRoZW4gcGRUUlVFIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlCisgKiBwZEZBTFNFIGlzIHJldHVybmVkLgorICoKKyAqIFxkZWZncm91cCB4U3RyZWFtQnVmZmVySXNFbXB0eSB4U3RyZWFtQnVmZmVySXNFbXB0eQorICogXGluZ3JvdXAgU3RyZWFtQnVmZmVyTWFuYWdlbWVudAorICovCitCYXNlVHlwZV90IHhTdHJlYW1CdWZmZXJJc0VtcHR5KCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBzdHJlYW1fYnVmZmVyLmgKKyAqCis8cHJlPgorQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVyUmVzZXQoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKTsKKzwvcHJlPgorICoKKyAqIFJlc2V0cyBhIHN0cmVhbSBidWZmZXIgdG8gaXRzIGluaXRpYWwsIGVtcHR5LCBzdGF0ZS4gIEFueSBkYXRhIHRoYXQgd2FzIGluCisgKiB0aGUgc3RyZWFtIGJ1ZmZlciBpcyBkaXNjYXJkZWQuICBBIHN0cmVhbSBidWZmZXIgY2FuIG9ubHkgYmUgcmVzZXQgaWYgdGhlcmUKKyAqIGFyZSBubyB0YXNrcyBibG9ja2VkIHdhaXRpbmcgdG8gZWl0aGVyIHNlbmQgdG8gb3IgcmVjZWl2ZSBmcm9tIHRoZSBzdHJlYW0KKyAqIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0geFN0cmVhbUJ1ZmZlciBUaGUgaGFuZGxlIG9mIHRoZSBzdHJlYW0gYnVmZmVyIGJlaW5nIHJlc2V0LgorICoKKyAqIEByZXR1cm4gSWYgdGhlIHN0cmVhbSBidWZmZXIgaXMgcmVzZXQgdGhlbiBwZFBBU1MgaXMgcmV0dXJuZWQuICBJZiB0aGVyZSB3YXMKKyAqIGEgdGFzayBibG9ja2VkIHdhaXRpbmcgdG8gc2VuZCB0byBvciByZWFkIGZyb20gdGhlIHN0cmVhbSBidWZmZXIgdGhlbiB0aGUKKyAqIHN0cmVhbSBidWZmZXIgaXMgbm90IHJlc2V0IGFuZCBwZEZBSUwgaXMgcmV0dXJuZWQuCisgKgorICogXGRlZmdyb3VwIHhTdHJlYW1CdWZmZXJSZXNldCB4U3RyZWFtQnVmZmVyUmVzZXQKKyAqIFxpbmdyb3VwIFN0cmVhbUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVyUmVzZXQoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHN0cmVhbV9idWZmZXIuaAorICoKKzxwcmU+CitzaXplX3QgeFN0cmVhbUJ1ZmZlclNwYWNlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApOworPC9wcmU+CisgKgorICogUXVlcmllcyBhIHN0cmVhbSBidWZmZXIgdG8gc2VlIGhvdyBtdWNoIGZyZWUgc3BhY2UgaXQgY29udGFpbnMsIHdoaWNoIGlzCisgKiBlcXVhbCB0byB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBjYW4gYmUgc2VudCB0byB0aGUgc3RyZWFtIGJ1ZmZlciBiZWZvcmUgaXQKKyAqIGlzIGZ1bGwuCisgKgorICogQHBhcmFtIHhTdHJlYW1CdWZmZXIgVGhlIGhhbmRsZSBvZiB0aGUgc3RyZWFtIGJ1ZmZlciBiZWluZyBxdWVyaWVkLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0gYnVmZmVyIGJlZm9yZQorICogdGhlIHN0cmVhbSBidWZmZXIgd291bGQgYmUgZnVsbC4KKyAqCisgKiBcZGVmZ3JvdXAgeFN0cmVhbUJ1ZmZlclNwYWNlc0F2YWlsYWJsZSB4U3RyZWFtQnVmZmVyU3BhY2VzQXZhaWxhYmxlCisgKiBcaW5ncm91cCBTdHJlYW1CdWZmZXJNYW5hZ2VtZW50CisgKi8KK3NpemVfdCB4U3RyZWFtQnVmZmVyU3BhY2VzQXZhaWxhYmxlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBzdHJlYW1fYnVmZmVyLmgKKyAqCis8cHJlPgorc2l6ZV90IHhTdHJlYW1CdWZmZXJCeXRlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApOworPC9wcmU+CisgKgorICogUXVlcmllcyBhIHN0cmVhbSBidWZmZXIgdG8gc2VlIGhvdyBtdWNoIGRhdGEgaXQgY29udGFpbnMsIHdoaWNoIGlzIGVxdWFsIHRvCisgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlciBiZWZvcmUgdGhlIHN0cmVhbQorICogYnVmZmVyIHdvdWxkIGJlIGVtcHR5LgorICoKKyAqIEBwYXJhbSB4U3RyZWFtQnVmZmVyIFRoZSBoYW5kbGUgb2YgdGhlIHN0cmVhbSBidWZmZXIgYmVpbmcgcXVlcmllZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyIGJlZm9yZQorICogdGhlIHN0cmVhbSBidWZmZXIgd291bGQgYmUgZW1wdHkuCisgKgorICogXGRlZmdyb3VwIHhTdHJlYW1CdWZmZXJCeXRlc0F2YWlsYWJsZSB4U3RyZWFtQnVmZmVyQnl0ZXNBdmFpbGFibGUKKyAqIFxpbmdyb3VwIFN0cmVhbUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworc2l6ZV90IHhTdHJlYW1CdWZmZXJCeXRlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogc3RyZWFtX2J1ZmZlci5oCisgKgorPHByZT4KK0Jhc2VUeXBlX3QgeFN0cmVhbUJ1ZmZlclNldFRyaWdnZXJMZXZlbCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgc2l6ZV90IHhUcmlnZ2VyTGV2ZWwgKTsKKzwvcHJlPgorICoKKyAqIEEgc3RyZWFtIGJ1ZmZlcidzIHRyaWdnZXIgbGV2ZWwgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgaW4gdGhlCisgKiBzdHJlYW0gYnVmZmVyIGJlZm9yZSBhIHRhc2sgdGhhdCBpcyBibG9ja2VkIG9uIHRoZSBzdHJlYW0gYnVmZmVyIHRvCisgKiB3YWl0IGZvciBkYXRhIGlzIG1vdmVkIG91dCBvZiB0aGUgYmxvY2tlZCBzdGF0ZS4gIEZvciBleGFtcGxlLCBpZiBhIHRhc2sgaXMKKyAqIGJsb2NrZWQgb24gYSByZWFkIG9mIGFuIGVtcHR5IHN0cmVhbSBidWZmZXIgdGhhdCBoYXMgYSB0cmlnZ2VyIGxldmVsIG9mIDEKKyAqIHRoZW4gdGhlIHRhc2sgd2lsbCBiZSB1bmJsb2NrZWQgd2hlbiBhIHNpbmdsZSBieXRlIGlzIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlcgorICogb3IgdGhlIHRhc2sncyBibG9jayB0aW1lIGV4cGlyZXMuICBBcyBhbm90aGVyIGV4YW1wbGUsIGlmIGEgdGFzayBpcyBibG9ja2VkCisgKiBvbiBhIHJlYWQgb2YgYW4gZW1wdHkgc3RyZWFtIGJ1ZmZlciB0aGF0IGhhcyBhIHRyaWdnZXIgbGV2ZWwgb2YgMTAgdGhlbiB0aGUKKyAqIHRhc2sgd2lsbCBub3QgYmUgdW5ibG9ja2VkIHVudGlsIHRoZSBzdHJlYW0gYnVmZmVyIGNvbnRhaW5zIGF0IGxlYXN0IDEwIGJ5dGVzCisgKiBvciB0aGUgdGFzaydzIGJsb2NrIHRpbWUgZXhwaXJlcy4gIElmIGEgcmVhZGluZyB0YXNrJ3MgYmxvY2sgdGltZSBleHBpcmVzCisgKiBiZWZvcmUgdGhlIHRyaWdnZXIgbGV2ZWwgaXMgcmVhY2hlZCB0aGVuIHRoZSB0YXNrIHdpbGwgc3RpbGwgcmVjZWl2ZSBob3dldmVyCisgKiBtYW55IGJ5dGVzIGFyZSBhY3R1YWxseSBhdmFpbGFibGUuICBTZXR0aW5nIGEgdHJpZ2dlciBsZXZlbCBvZiAwIHdpbGwgcmVzdWx0CisgKiBpbiBhIHRyaWdnZXIgbGV2ZWwgb2YgMSBiZWluZyB1c2VkLiAgSXQgaXMgbm90IHZhbGlkIHRvIHNwZWNpZnkgYSB0cmlnZ2VyCisgKiBsZXZlbCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgYnVmZmVyIHNpemUuCisgKgorICogQSB0cmlnZ2VyIGxldmVsIGlzIHNldCB3aGVuIHRoZSBzdHJlYW0gYnVmZmVyIGlzIGNyZWF0ZWQsIGFuZCBjYW4gYmUgbW9kaWZpZWQKKyAqIHVzaW5nIHhTdHJlYW1CdWZmZXJTZXRUcmlnZ2VyTGV2ZWwoKS4KKyAqCisgKiBAcGFyYW0geFN0cmVhbUJ1ZmZlciBUaGUgaGFuZGxlIG9mIHRoZSBzdHJlYW0gYnVmZmVyIGJlaW5nIHVwZGF0ZWQuCisgKgorICogQHBhcmFtIHhUcmlnZ2VyTGV2ZWwgVGhlIG5ldyB0cmlnZ2VyIGxldmVsIGZvciB0aGUgc3RyZWFtIGJ1ZmZlci4KKyAqCisgKiBAcmV0dXJuIElmIHhUcmlnZ2VyTGV2ZWwgd2FzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3RyZWFtIGJ1ZmZlcidzIGxlbmd0aAorICogdGhlbiB0aGUgdHJpZ2dlciBsZXZlbCB3aWxsIGJlIHVwZGF0ZWQgYW5kIHBkVFJVRSBpcyByZXR1cm5lZC4gIE90aGVyd2lzZQorICogcGRGQUxTRSBpcyByZXR1cm5lZC4KKyAqCisgKiBcZGVmZ3JvdXAgeFN0cmVhbUJ1ZmZlclNldFRyaWdnZXJMZXZlbCB4U3RyZWFtQnVmZmVyU2V0VHJpZ2dlckxldmVsCisgKiBcaW5ncm91cCBTdHJlYW1CdWZmZXJNYW5hZ2VtZW50CisgKi8KK0Jhc2VUeXBlX3QgeFN0cmVhbUJ1ZmZlclNldFRyaWdnZXJMZXZlbCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgc2l6ZV90IHhUcmlnZ2VyTGV2ZWwgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHN0cmVhbV9idWZmZXIuaAorICoKKzxwcmU+CitCYXNlVHlwZV90IHhTdHJlYW1CdWZmZXJTZW5kQ29tcGxldGVkRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworPC9wcmU+CisgKgorICogRm9yIGFkdmFuY2VkIHVzZXJzIG9ubHkuCisgKgorICogVGhlIHNiU0VORF9DT01QTEVURUQoKSBtYWNybyBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIEZyZWVSVE9TIEFQSXMgd2hlbgorICogZGF0YSBpcyBzZW50IHRvIGEgbWVzc2FnZSBidWZmZXIgb3Igc3RyZWFtIGJ1ZmZlci4gIElmIHRoZXJlIHdhcyBhIHRhc2sgdGhhdAorICogd2FzIGJsb2NrZWQgb24gdGhlIG1lc3NhZ2Ugb3Igc3RyZWFtIGJ1ZmZlciB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZSB0aGVuCisgKiB0aGUgc2JTRU5EX0NPTVBMRVRFRCgpIG1hY3JvIHNlbmRzIGEgbm90aWZpY2F0aW9uIHRvIHRoZSB0YXNrIHRvIHJlbW92ZSBpdAorICogZnJvbSB0aGUgQmxvY2tlZCBzdGF0ZS4gIHhTdHJlYW1CdWZmZXJTZW5kQ29tcGxldGVkRnJvbUlTUigpIGRvZXMgdGhlIHNhbWUKKyAqIHRoaW5nLiAgSXQgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gaW1wbGVtZW50IHRoZWlyIG93bgorICogdmVyc2lvbiBvZiBzYlNFTkRfQ09NUExFVEVEKCksIGFuZCBNVVNUIE5PVCBCRSBVU0VEIEFUIEFOWSBPVEhFUiBUSU1FLgorICoKKyAqIFNlZSB0aGUgZXhhbXBsZSBpbXBsZW1lbnRlZCBpbiBGcmVlUlRPUy9EZW1vL01pbmltYWwvTWVzc2FnZUJ1ZmZlckFNUC5jIGZvcgorICogYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW0geFN0cmVhbUJ1ZmZlciBUaGUgaGFuZGxlIG9mIHRoZSBzdHJlYW0gYnVmZmVyIHRvIHdoaWNoIGRhdGEgd2FzCisgKiB3cml0dGVuLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHNob3VsZCBiZQorICogaW5pdGlhbGlzZWQgdG8gcGRGQUxTRSBiZWZvcmUgaXQgaXMgcGFzc2VkIGludG8KKyAqIHhTdHJlYW1CdWZmZXJTZW5kQ29tcGxldGVkRnJvbUlTUigpLiAgSWYgY2FsbGluZworICogeFN0cmVhbUJ1ZmZlclNlbmRDb21wbGV0ZWRGcm9tSVNSKCkgcmVtb3ZlcyBhIHRhc2sgZnJvbSB0aGUgQmxvY2tlZCBzdGF0ZSwKKyAqIGFuZCB0aGUgdGFzayBoYXMgYSBwcmlvcml0eSBhYm92ZSB0aGUgcHJpb3JpdHkgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2ssCisgKiB0aGVuICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHdpbGwgZ2V0IHNldCB0byBwZFRSVUUgaW5kaWNhdGluZyB0aGF0IGEKKyAqIGNvbnRleHQgc3dpdGNoIHNob3VsZCBiZSBwZXJmb3JtZWQgYmVmb3JlIGV4aXRpbmcgdGhlIElTUi4KKyAqCisgKiBAcmV0dXJuIElmIGEgdGFzayB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBCbG9ja2VkIHN0YXRlIHRoZW4gcGRUUlVFIGlzIHJldHVybmVkLgorICogT3RoZXJ3aXNlIHBkRkFMU0UgaXMgcmV0dXJuZWQuCisgKgorICogXGRlZmdyb3VwIHhTdHJlYW1CdWZmZXJTZW5kQ29tcGxldGVkRnJvbUlTUiB4U3RyZWFtQnVmZmVyU2VuZENvbXBsZXRlZEZyb21JU1IKKyAqIFxpbmdyb3VwIFN0cmVhbUJ1ZmZlck1hbmFnZW1lbnQKKyAqLworQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVyU2VuZENvbXBsZXRlZEZyb21JU1IoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHN0cmVhbV9idWZmZXIuaAorICoKKzxwcmU+CitCYXNlVHlwZV90IHhTdHJlYW1CdWZmZXJSZWNlaXZlQ29tcGxldGVkRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworPC9wcmU+CisgKgorICogRm9yIGFkdmFuY2VkIHVzZXJzIG9ubHkuCisgKgorICogVGhlIHNiUkVDRUlWRV9DT01QTEVURUQoKSBtYWNybyBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIEZyZWVSVE9TIEFQSXMgd2hlbgorICogZGF0YSBpcyByZWFkIG91dCBvZiBhIG1lc3NhZ2UgYnVmZmVyIG9yIHN0cmVhbSBidWZmZXIuICBJZiB0aGVyZSB3YXMgYSB0YXNrCisgKiB0aGF0IHdhcyBibG9ja2VkIG9uIHRoZSBtZXNzYWdlIG9yIHN0cmVhbSBidWZmZXIgd2FpdGluZyBmb3IgZGF0YSB0byBhcnJpdmUKKyAqIHRoZW4gdGhlIHNiUkVDRUlWRV9DT01QTEVURUQoKSBtYWNybyBzZW5kcyBhIG5vdGlmaWNhdGlvbiB0byB0aGUgdGFzayB0bworICogcmVtb3ZlIGl0IGZyb20gdGhlIEJsb2NrZWQgc3RhdGUuICB4U3RyZWFtQnVmZmVyUmVjZWl2ZUNvbXBsZXRlZEZyb21JU1IoKQorICogZG9lcyB0aGUgc2FtZSB0aGluZy4gIEl0IGlzIHByb3ZpZGVkIHRvIGVuYWJsZSBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvCisgKiBpbXBsZW1lbnQgdGhlaXIgb3duIHZlcnNpb24gb2Ygc2JSRUNFSVZFX0NPTVBMRVRFRCgpLCBhbmQgTVVTVCBOT1QgQkUgVVNFRCBBVAorICogQU5ZIE9USEVSIFRJTUUuCisgKgorICogU2VlIHRoZSBleGFtcGxlIGltcGxlbWVudGVkIGluIEZyZWVSVE9TL0RlbW8vTWluaW1hbC9NZXNzYWdlQnVmZmVyQU1QLmMgZm9yCisgKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorICoKKyAqIEBwYXJhbSB4U3RyZWFtQnVmZmVyIFRoZSBoYW5kbGUgb2YgdGhlIHN0cmVhbSBidWZmZXIgZnJvbSB3aGljaCBkYXRhIHdhcworICogcmVhZC4KKyAqCisgKiBAcGFyYW0gcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBzaG91bGQgYmUKKyAqIGluaXRpYWxpc2VkIHRvIHBkRkFMU0UgYmVmb3JlIGl0IGlzIHBhc3NlZCBpbnRvCisgKiB4U3RyZWFtQnVmZmVyUmVjZWl2ZUNvbXBsZXRlZEZyb21JU1IoKS4gIElmIGNhbGxpbmcKKyAqIHhTdHJlYW1CdWZmZXJSZWNlaXZlQ29tcGxldGVkRnJvbUlTUigpIHJlbW92ZXMgYSB0YXNrIGZyb20gdGhlIEJsb2NrZWQgc3RhdGUsCisgKiBhbmQgdGhlIHRhc2sgaGFzIGEgcHJpb3JpdHkgYWJvdmUgdGhlIHByaW9yaXR5IG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrLAorICogdGhlbiAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB3aWxsIGdldCBzZXQgdG8gcGRUUlVFIGluZGljYXRpbmcgdGhhdCBhCisgKiBjb250ZXh0IHN3aXRjaCBzaG91bGQgYmUgcGVyZm9ybWVkIGJlZm9yZSBleGl0aW5nIHRoZSBJU1IuCisgKgorICogQHJldHVybiBJZiBhIHRhc2sgd2FzIHJlbW92ZWQgZnJvbSB0aGUgQmxvY2tlZCBzdGF0ZSB0aGVuIHBkVFJVRSBpcyByZXR1cm5lZC4KKyAqIE90aGVyd2lzZSBwZEZBTFNFIGlzIHJldHVybmVkLgorICoKKyAqIFxkZWZncm91cCB4U3RyZWFtQnVmZmVyUmVjZWl2ZUNvbXBsZXRlZEZyb21JU1IgeFN0cmVhbUJ1ZmZlclJlY2VpdmVDb21wbGV0ZWRGcm9tSVNSCisgKiBcaW5ncm91cCBTdHJlYW1CdWZmZXJNYW5hZ2VtZW50CisgKi8KK0Jhc2VUeXBlX3QgeFN0cmVhbUJ1ZmZlclJlY2VpdmVDb21wbGV0ZWRGcm9tSVNSKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyogRnVuY3Rpb25zIGJlbG93IGhlcmUgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLiAqLworU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGUoIHNpemVfdCB4QnVmZmVyU2l6ZUJ5dGVzLAorCQkJCQkJCQkJCQkJIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsCisJCQkJCQkJCQkJCQkgQmFzZVR5cGVfdCB4SXNNZXNzYWdlQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGVTdGF0aWMoIHNpemVfdCB4QnVmZmVyU2l6ZUJ5dGVzLAorCQkJCQkJCQkJCQkJCSAgIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsCisJCQkJCQkJCQkJCQkJICAgQmFzZVR5cGVfdCB4SXNNZXNzYWdlQnVmZmVyLAorCQkJCQkJCQkJCQkJCSAgIHVpbnQ4X3QgKiBjb25zdCBwdWNTdHJlYW1CdWZmZXJTdG9yYWdlQXJlYSwKKwkJCQkJCQkJCQkJCQkgICBTdGF0aWNTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RhdGljU3RyZWFtQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisJdm9pZCB2U3RyZWFtQnVmZmVyU2V0U3RyZWFtQnVmZmVyTnVtYmVyKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBVQmFzZVR5cGVfdCB1eFN0cmVhbUJ1ZmZlck51bWJlciApIFBSSVZJTEVHRURfRlVOQ1RJT047CisJVUJhc2VUeXBlX3QgdXhTdHJlYW1CdWZmZXJHZXRTdHJlYW1CdWZmZXJOdW1iZXIoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCXVpbnQ4X3QgdWNTdHJlYW1CdWZmZXJHZXRTdHJlYW1CdWZmZXJUeXBlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCggX19jcGx1c3BsdXMgKQorfQorI2VuZGlmCisKKyNlbmRpZgkvKiAhZGVmaW5lZCggU1RSRUFNX0JVRkZFUl9IICkgKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL3Rhc2suaCBiL1NvdXJjZS9pbmNsdWRlL3Rhc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGVlMDY4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL2luY2x1ZGUvdGFzay5oCkBAIC0wLDAgKzEsMjMzOCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKworI2lmbmRlZiBJTkNfVEFTS19ICisjZGVmaW5lIElOQ19UQVNLX0gKKworI2lmbmRlZiBJTkNfRlJFRVJUT1NfSAorCSNlcnJvciAiaW5jbHVkZSBGcmVlUlRPUy5oIG11c3QgYXBwZWFyIGluIHNvdXJjZSBmaWxlcyBiZWZvcmUgaW5jbHVkZSB0YXNrLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImxpc3QuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNQUNST1MgQU5EIERFRklOSVRJT05TCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIHRza0tFUk5FTF9WRVJTSU9OX05VTUJFUiAiVjEwLjAuMSIKKyNkZWZpbmUgdHNrS0VSTkVMX1ZFUlNJT05fTUFKT1IgMTAKKyNkZWZpbmUgdHNrS0VSTkVMX1ZFUlNJT05fTUlOT1IgMAorI2RlZmluZSB0c2tLRVJORUxfVkVSU0lPTl9CVUlMRCAxCisKKy8qKgorICogdGFzay4gaAorICoKKyAqIFR5cGUgYnkgd2hpY2ggdGFza3MgYXJlIHJlZmVyZW5jZWQuICBGb3IgZXhhbXBsZSwgYSBjYWxsIHRvIHhUYXNrQ3JlYXRlCisgKiByZXR1cm5zICh2aWEgYSBwb2ludGVyIHBhcmFtZXRlcikgYW4gVGFza0hhbmRsZV90IHZhcmlhYmxlIHRoYXQgY2FuIHRoZW4KKyAqIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdlRhc2tEZWxldGUgdG8gZGVsZXRlIHRoZSB0YXNrLgorICoKKyAqIFxkZWZncm91cCBUYXNrSGFuZGxlX3QgVGFza0hhbmRsZV90CisgKiBcaW5ncm91cCBUYXNrcworICovCit0eXBlZGVmIHZvaWQgKiBUYXNrSGFuZGxlX3Q7CisKKy8qCisgKiBEZWZpbmVzIHRoZSBwcm90b3R5cGUgdG8gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIHRhc2sgaG9vayBmdW5jdGlvbiBtdXN0CisgKiBjb25mb3JtLgorICovCit0eXBlZGVmIEJhc2VUeXBlX3QgKCpUYXNrSG9va0Z1bmN0aW9uX3QpKCB2b2lkICogKTsKKworLyogVGFzayBzdGF0ZXMgcmV0dXJuZWQgYnkgZVRhc2tHZXRTdGF0ZS4gKi8KK3R5cGVkZWYgZW51bQoreworCWVSdW5uaW5nID0gMCwJLyogQSB0YXNrIGlzIHF1ZXJ5aW5nIHRoZSBzdGF0ZSBvZiBpdHNlbGYsIHNvIG11c3QgYmUgcnVubmluZy4gKi8KKwllUmVhZHksCQkJLyogVGhlIHRhc2sgYmVpbmcgcXVlcmllZCBpcyBpbiBhIHJlYWQgb3IgcGVuZGluZyByZWFkeSBsaXN0LiAqLworCWVCbG9ja2VkLAkJLyogVGhlIHRhc2sgYmVpbmcgcXVlcmllZCBpcyBpbiB0aGUgQmxvY2tlZCBzdGF0ZS4gKi8KKwllU3VzcGVuZGVkLAkJLyogVGhlIHRhc2sgYmVpbmcgcXVlcmllZCBpcyBpbiB0aGUgU3VzcGVuZGVkIHN0YXRlLCBvciBpcyBpbiB0aGUgQmxvY2tlZCBzdGF0ZSB3aXRoIGFuIGluZmluaXRlIHRpbWUgb3V0LiAqLworCWVEZWxldGVkLAkJLyogVGhlIHRhc2sgYmVpbmcgcXVlcmllZCBoYXMgYmVlbiBkZWxldGVkLCBidXQgaXRzIFRDQiBoYXMgbm90IHlldCBiZWVuIGZyZWVkLiAqLworCWVJbnZhbGlkCQkJLyogVXNlZCBhcyBhbiAnaW52YWxpZCBzdGF0ZScgdmFsdWUuICovCit9IGVUYXNrU3RhdGU7CisKKy8qIEFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIHdoZW4gdlRhc2tOb3RpZnkoKSBpcyBjYWxsZWQuICovCit0eXBlZGVmIGVudW0KK3sKKwllTm9BY3Rpb24gPSAwLAkJCQkvKiBOb3RpZnkgdGhlIHRhc2sgd2l0aG91dCB1cGRhdGluZyBpdHMgbm90aWZ5IHZhbHVlLiAqLworCWVTZXRCaXRzLAkJCQkJLyogU2V0IGJpdHMgaW4gdGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUuICovCisJZUluY3JlbWVudCwJCQkJCS8qIEluY3JlbWVudCB0aGUgdGFzaydzIG5vdGlmaWNhdGlvbiB2YWx1ZS4gKi8KKwllU2V0VmFsdWVXaXRoT3ZlcndyaXRlLAkJLyogU2V0IHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIHRvIGEgc3BlY2lmaWMgdmFsdWUgZXZlbiBpZiB0aGUgcHJldmlvdXMgdmFsdWUgaGFzIG5vdCB5ZXQgYmVlbiByZWFkIGJ5IHRoZSB0YXNrLiAqLworCWVTZXRWYWx1ZVdpdGhvdXRPdmVyd3JpdGUJLyogU2V0IHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIGlmIHRoZSBwcmV2aW91cyB2YWx1ZSBoYXMgYmVlbiByZWFkIGJ5IHRoZSB0YXNrLiAqLworfSBlTm90aWZ5QWN0aW9uOworCisvKgorICogVXNlZCBpbnRlcm5hbGx5IG9ubHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhUSU1FX09VVAoreworCUJhc2VUeXBlX3QgeE92ZXJmbG93Q291bnQ7CisJVGlja1R5cGVfdCB4VGltZU9uRW50ZXJpbmc7Cit9IFRpbWVPdXRfdDsKKworLyoKKyAqIERlZmluZXMgdGhlIG1lbW9yeSByYW5nZXMgYWxsb2NhdGVkIHRvIHRoZSB0YXNrIHdoZW4gYW4gTVBVIGlzIHVzZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhNRU1PUllfUkVHSU9OCit7CisJdm9pZCAqcHZCYXNlQWRkcmVzczsKKwl1aW50MzJfdCB1bExlbmd0aEluQnl0ZXM7CisJdWludDMyX3QgdWxQYXJhbWV0ZXJzOworfSBNZW1vcnlSZWdpb25fdDsKKworLyoKKyAqIFBhcmFtZXRlcnMgcmVxdWlyZWQgdG8gY3JlYXRlIGFuIE1QVSBwcm90ZWN0ZWQgdGFzay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeFRBU0tfUEFSQU1FVEVSUworeworCVRhc2tGdW5jdGlvbl90IHB2VGFza0NvZGU7CisJY29uc3QgY2hhciAqIGNvbnN0IHBjTmFtZTsJLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisJdWludDE2X3QgdXNTdGFja0RlcHRoOworCXZvaWQgKnB2UGFyYW1ldGVyczsKKwlVQmFzZVR5cGVfdCB1eFByaW9yaXR5OworCVN0YWNrVHlwZV90ICpwdXhTdGFja0J1ZmZlcjsKKwlNZW1vcnlSZWdpb25fdCB4UmVnaW9uc1sgcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUyBdOworCSNpZiAoICggcG9ydFVTSU5HX01QVV9XUkFQUEVSUyA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSApCisJCVN0YXRpY1Rhc2tfdCAqIGNvbnN0IHB4VGFza0J1ZmZlcjsKKwkjZW5kaWYKK30gVGFza1BhcmFtZXRlcnNfdDsKKworLyogVXNlZCB3aXRoIHRoZSB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgc3RhdGUgb2YgZWFjaCB0YXNrCitpbiB0aGUgc3lzdGVtLiAqLwordHlwZWRlZiBzdHJ1Y3QgeFRBU0tfU1RBVFVTCit7CisJVGFza0hhbmRsZV90IHhIYW5kbGU7CQkJLyogVGhlIGhhbmRsZSBvZiB0aGUgdGFzayB0byB3aGljaCB0aGUgcmVzdCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHN0cnVjdHVyZSByZWxhdGVzLiAqLworCWNvbnN0IGNoYXIgKnBjVGFza05hbWU7CQkJLyogQSBwb2ludGVyIHRvIHRoZSB0YXNrJ3MgbmFtZS4gIFRoaXMgdmFsdWUgd2lsbCBiZSBpbnZhbGlkIGlmIHRoZSB0YXNrIHdhcyBkZWxldGVkIHNpbmNlIHRoZSBzdHJ1Y3R1cmUgd2FzIHBvcHVsYXRlZCEgKi8gLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisJVUJhc2VUeXBlX3QgeFRhc2tOdW1iZXI7CQkvKiBBIG51bWJlciB1bmlxdWUgdG8gdGhlIHRhc2suICovCisJZVRhc2tTdGF0ZSBlQ3VycmVudFN0YXRlOwkJLyogVGhlIHN0YXRlIGluIHdoaWNoIHRoZSB0YXNrIGV4aXN0ZWQgd2hlbiB0aGUgc3RydWN0dXJlIHdhcyBwb3B1bGF0ZWQuICovCisJVUJhc2VUeXBlX3QgdXhDdXJyZW50UHJpb3JpdHk7CS8qIFRoZSBwcmlvcml0eSBhdCB3aGljaCB0aGUgdGFzayB3YXMgcnVubmluZyAobWF5IGJlIGluaGVyaXRlZCkgd2hlbiB0aGUgc3RydWN0dXJlIHdhcyBwb3B1bGF0ZWQuICovCisJVUJhc2VUeXBlX3QgdXhCYXNlUHJpb3JpdHk7CQkvKiBUaGUgcHJpb3JpdHkgdG8gd2hpY2ggdGhlIHRhc2sgd2lsbCByZXR1cm4gaWYgdGhlIHRhc2sncyBjdXJyZW50IHByaW9yaXR5IGhhcyBiZWVuIGluaGVyaXRlZCB0byBhdm9pZCB1bmJvdW5kZWQgcHJpb3JpdHkgaW52ZXJzaW9uIHdoZW4gb2J0YWluaW5nIGEgbXV0ZXguICBPbmx5IHZhbGlkIGlmIGNvbmZpZ1VTRV9NVVRFWEVTIGlzIGRlZmluZWQgYXMgMSBpbiBGcmVlUlRPU0NvbmZpZy5oLiAqLworCXVpbnQzMl90IHVsUnVuVGltZUNvdW50ZXI7CQkvKiBUaGUgdG90YWwgcnVuIHRpbWUgYWxsb2NhdGVkIHRvIHRoZSB0YXNrIHNvIGZhciwgYXMgZGVmaW5lZCBieSB0aGUgcnVuIHRpbWUgc3RhdHMgY2xvY2suICBTZWUgaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvcnRvcy1ydW4tdGltZS1zdGF0cy5odG1sLiAgT25seSB2YWxpZCB3aGVuIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTIGlzIGRlZmluZWQgYXMgMSBpbiBGcmVlUlRPU0NvbmZpZy5oLiAqLworCVN0YWNrVHlwZV90ICpweFN0YWNrQmFzZTsJCS8qIFBvaW50cyB0byB0aGUgbG93ZXN0IGFkZHJlc3Mgb2YgdGhlIHRhc2sncyBzdGFjayBhcmVhLiAqLworCXVpbnQxNl90IHVzU3RhY2tIaWdoV2F0ZXJNYXJrOwkvKiBUaGUgbWluaW11bSBhbW91bnQgb2Ygc3RhY2sgc3BhY2UgdGhhdCBoYXMgcmVtYWluZWQgZm9yIHRoZSB0YXNrIHNpbmNlIHRoZSB0YXNrIHdhcyBjcmVhdGVkLiAgVGhlIGNsb3NlciB0aGlzIHZhbHVlIGlzIHRvIHplcm8gdGhlIGNsb3NlciB0aGUgdGFzayBoYXMgY29tZSB0byBvdmVyZmxvd2luZyBpdHMgc3RhY2suICovCit9IFRhc2tTdGF0dXNfdDsKKworLyogUG9zc2libGUgcmV0dXJuIHZhbHVlcyBmb3IgZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkuICovCit0eXBlZGVmIGVudW0KK3sKKwllQWJvcnRTbGVlcCA9IDAsCQkvKiBBIHRhc2sgaGFzIGJlZW4gbWFkZSByZWFkeSBvciBhIGNvbnRleHQgc3dpdGNoIHBlbmRlZCBzaW5jZSBwb3J0U1VQUE9SRVNTX1RJQ0tTX0FORF9TTEVFUCgpIHdhcyBjYWxsZWQgLSBhYm9ydCBlbnRlcmluZyBhIHNsZWVwIG1vZGUuICovCisJZVN0YW5kYXJkU2xlZXAsCQkJLyogRW50ZXIgYSBzbGVlcCBtb2RlIHRoYXQgd2lsbCBub3QgbGFzdCBhbnkgbG9uZ2VyIHRoYW4gdGhlIGV4cGVjdGVkIGlkbGUgdGltZS4gKi8KKwllTm9UYXNrc1dhaXRpbmdUaW1lb3V0CS8qIE5vIHRhc2tzIGFyZSB3YWl0aW5nIGZvciBhIHRpbWVvdXQgc28gaXQgaXMgc2FmZSB0byBlbnRlciBhIHNsZWVwIG1vZGUgdGhhdCBjYW4gb25seSBiZSBleGl0ZWQgYnkgYW4gZXh0ZXJuYWwgaW50ZXJydXB0LiAqLworfSBlU2xlZXBNb2RlU3RhdHVzOworCisvKioKKyAqIERlZmluZXMgdGhlIHByaW9yaXR5IHVzZWQgYnkgdGhlIGlkbGUgdGFzay4gIFRoaXMgbXVzdCBub3QgYmUgbW9kaWZpZWQuCisgKgorICogXGluZ3JvdXAgVGFza1V0aWxzCisgKi8KKyNkZWZpbmUgdHNrSURMRV9QUklPUklUWQkJCSggKCBVQmFzZVR5cGVfdCApIDBVICkKKworLyoqCisgKiB0YXNrLiBoCisgKgorICogTWFjcm8gZm9yIGZvcmNpbmcgYSBjb250ZXh0IHN3aXRjaC4KKyAqCisgKiBcZGVmZ3JvdXAgdGFza1lJRUxEIHRhc2tZSUVMRAorICogXGluZ3JvdXAgU2NoZWR1bGVyQ29udHJvbAorICovCisjZGVmaW5lIHRhc2tZSUVMRCgpCQkJCQlwb3J0WUlFTEQoKQorCisvKioKKyAqIHRhc2suIGgKKyAqCisgKiBNYWNybyB0byBtYXJrIHRoZSBzdGFydCBvZiBhIGNyaXRpY2FsIGNvZGUgcmVnaW9uLiAgUHJlZW1wdGl2ZSBjb250ZXh0CisgKiBzd2l0Y2hlcyBjYW5ub3Qgb2NjdXIgd2hlbiBpbiBhIGNyaXRpY2FsIHJlZ2lvbi4KKyAqCisgKiBOT1RFOiBUaGlzIG1heSBhbHRlciB0aGUgc3RhY2sgKGRlcGVuZGluZyBvbiB0aGUgcG9ydGFibGUgaW1wbGVtZW50YXRpb24pCisgKiBzbyBtdXN0IGJlIHVzZWQgd2l0aCBjYXJlIQorICoKKyAqIFxkZWZncm91cCB0YXNrRU5URVJfQ1JJVElDQUwgdGFza0VOVEVSX0NSSVRJQ0FMCisgKiBcaW5ncm91cCBTY2hlZHVsZXJDb250cm9sCisgKi8KKyNkZWZpbmUgdGFza0VOVEVSX0NSSVRJQ0FMKCkJCXBvcnRFTlRFUl9DUklUSUNBTCgpCisjZGVmaW5lIHRhc2tFTlRFUl9DUklUSUNBTF9GUk9NX0lTUigpIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQorCisvKioKKyAqIHRhc2suIGgKKyAqCisgKiBNYWNybyB0byBtYXJrIHRoZSBlbmQgb2YgYSBjcml0aWNhbCBjb2RlIHJlZ2lvbi4gIFByZWVtcHRpdmUgY29udGV4dAorICogc3dpdGNoZXMgY2Fubm90IG9jY3VyIHdoZW4gaW4gYSBjcml0aWNhbCByZWdpb24uCisgKgorICogTk9URTogVGhpcyBtYXkgYWx0ZXIgdGhlIHN0YWNrIChkZXBlbmRpbmcgb24gdGhlIHBvcnRhYmxlIGltcGxlbWVudGF0aW9uKQorICogc28gbXVzdCBiZSB1c2VkIHdpdGggY2FyZSEKKyAqCisgKiBcZGVmZ3JvdXAgdGFza0VYSVRfQ1JJVElDQUwgdGFza0VYSVRfQ1JJVElDQUwKKyAqIFxpbmdyb3VwIFNjaGVkdWxlckNvbnRyb2wKKyAqLworI2RlZmluZSB0YXNrRVhJVF9DUklUSUNBTCgpCQkJcG9ydEVYSVRfQ1JJVElDQUwoKQorI2RlZmluZSB0YXNrRVhJVF9DUklUSUNBTF9GUk9NX0lTUiggeCApIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggeCApCisvKioKKyAqIHRhc2suIGgKKyAqCisgKiBNYWNybyB0byBkaXNhYmxlIGFsbCBtYXNrYWJsZSBpbnRlcnJ1cHRzLgorICoKKyAqIFxkZWZncm91cCB0YXNrRElTQUJMRV9JTlRFUlJVUFRTIHRhc2tESVNBQkxFX0lOVEVSUlVQVFMKKyAqIFxpbmdyb3VwIFNjaGVkdWxlckNvbnRyb2wKKyAqLworI2RlZmluZSB0YXNrRElTQUJMRV9JTlRFUlJVUFRTKCkJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCisKKy8qKgorICogdGFzay4gaAorICoKKyAqIE1hY3JvIHRvIGVuYWJsZSBtaWNyb2NvbnRyb2xsZXIgaW50ZXJydXB0cy4KKyAqCisgKiBcZGVmZ3JvdXAgdGFza0VOQUJMRV9JTlRFUlJVUFRTIHRhc2tFTkFCTEVfSU5URVJSVVBUUworICogXGluZ3JvdXAgU2NoZWR1bGVyQ29udHJvbAorICovCisjZGVmaW5lIHRhc2tFTkFCTEVfSU5URVJSVVBUUygpCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQorCisvKiBEZWZpbml0aW9ucyByZXR1cm5lZCBieSB4VGFza0dldFNjaGVkdWxlclN0YXRlKCkuICB0YXNrU0NIRURVTEVSX1NVU1BFTkRFRCBpcworMCB0byBnZW5lcmF0ZSBtb3JlIG9wdGltYWwgY29kZSB3aGVuIGNvbmZpZ0FTU0VSVCgpIGlzIGRlZmluZWQgYXMgdGhlIGNvbnN0YW50CitpcyB1c2VkIGluIGFzc2VydCgpIHN0YXRlbWVudHMuICovCisjZGVmaW5lIHRhc2tTQ0hFRFVMRVJfU1VTUEVOREVECQkoICggQmFzZVR5cGVfdCApIDAgKQorI2RlZmluZSB0YXNrU0NIRURVTEVSX05PVF9TVEFSVEVECSggKCBCYXNlVHlwZV90ICkgMSApCisjZGVmaW5lIHRhc2tTQ0hFRFVMRVJfUlVOTklORwkJKCAoIEJhc2VUeXBlX3QgKSAyICkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUQVNLIENSRUFUSU9OIEFQSQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiB0YXNrLiBoCisgKjxwcmU+CisgQmFzZVR5cGVfdCB4VGFza0NyZWF0ZSgKKwkJCQkJCQkgIFRhc2tGdW5jdGlvbl90IHB2VGFza0NvZGUsCisJCQkJCQkJICBjb25zdCBjaGFyICogY29uc3QgcGNOYW1lLAorCQkJCQkJCSAgY29uZmlnU1RBQ0tfREVQVEhfVFlQRSB1c1N0YWNrRGVwdGgsCisJCQkJCQkJICB2b2lkICpwdlBhcmFtZXRlcnMsCisJCQkJCQkJICBVQmFzZVR5cGVfdCB1eFByaW9yaXR5LAorCQkJCQkJCSAgVGFza0hhbmRsZV90ICpwdkNyZWF0ZWRUYXNrCisJCQkJCQkgICk7PC9wcmU+CisgKgorICogQ3JlYXRlIGEgbmV3IHRhc2sgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiB0YXNrcyB0aGF0IGFyZSByZWFkeSB0byBydW4uCisgKgorICogSW50ZXJuYWxseSwgd2l0aGluIHRoZSBGcmVlUlRPUyBpbXBsZW1lbnRhdGlvbiwgdGFza3MgdXNlIHR3byBibG9ja3Mgb2YKKyAqIG1lbW9yeS4gIFRoZSBmaXJzdCBibG9jayBpcyB1c2VkIHRvIGhvbGQgdGhlIHRhc2sncyBkYXRhIHN0cnVjdHVyZXMuICBUaGUKKyAqIHNlY29uZCBibG9jayBpcyB1c2VkIGJ5IHRoZSB0YXNrIGFzIGl0cyBzdGFjay4gIElmIGEgdGFzayBpcyBjcmVhdGVkIHVzaW5nCisgKiB4VGFza0NyZWF0ZSgpIHRoZW4gYm90aCBibG9ja3Mgb2YgbWVtb3J5IGFyZSBhdXRvbWF0aWNhbGx5IGR5bmFtaWNhbGx5CisgKiBhbGxvY2F0ZWQgaW5zaWRlIHRoZSB4VGFza0NyZWF0ZSgpIGZ1bmN0aW9uLiAgKHNlZQorICogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTExLmh0bWwpLiAgSWYgYSB0YXNrIGlzIGNyZWF0ZWQgdXNpbmcKKyAqIHhUYXNrQ3JlYXRlU3RhdGljKCkgdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgcHJvdmlkZSB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeS4gIHhUYXNrQ3JlYXRlU3RhdGljKCkgdGhlcmVmb3JlIGFsbG93cyBhIHRhc2sgdG8gYmUgY3JlYXRlZCB3aXRob3V0CisgKiB1c2luZyBhbnkgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBTZWUgeFRhc2tDcmVhdGVTdGF0aWMoKSBmb3IgYSB2ZXJzaW9uIHRoYXQgZG9lcyBub3QgdXNlIGFueSBkeW5hbWljIG1lbW9yeQorICogYWxsb2NhdGlvbi4KKyAqCisgKiB4VGFza0NyZWF0ZSgpIGNhbiBvbmx5IGJlIHVzZWQgdG8gY3JlYXRlIGEgdGFzayB0aGF0IGhhcyB1bnJlc3RyaWN0ZWQKKyAqIGFjY2VzcyB0byB0aGUgZW50aXJlIG1pY3JvY29udHJvbGxlciBtZW1vcnkgbWFwLiAgU3lzdGVtcyB0aGF0IGluY2x1ZGUgTVBVCisgKiBzdXBwb3J0IGNhbiBhbHRlcm5hdGl2ZWx5IGNyZWF0ZSBhbiBNUFUgY29uc3RyYWluZWQgdGFzayB1c2luZworICogeFRhc2tDcmVhdGVSZXN0cmljdGVkKCkuCisgKgorICogQHBhcmFtIHB2VGFza0NvZGUgUG9pbnRlciB0byB0aGUgdGFzayBlbnRyeSBmdW5jdGlvbi4gIFRhc2tzCisgKiBtdXN0IGJlIGltcGxlbWVudGVkIHRvIG5ldmVyIHJldHVybiAoaS5lLiBjb250aW51b3VzIGxvb3ApLgorICoKKyAqIEBwYXJhbSBwY05hbWUgQSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUgdGFzay4gIFRoaXMgaXMgbWFpbmx5IHVzZWQgdG8KKyAqIGZhY2lsaXRhdGUgZGVidWdnaW5nLiAgTWF4IGxlbmd0aCBkZWZpbmVkIGJ5IGNvbmZpZ01BWF9UQVNLX05BTUVfTEVOIC0gZGVmYXVsdAorICogaXMgMTYuCisgKgorICogQHBhcmFtIHVzU3RhY2tEZXB0aCBUaGUgc2l6ZSBvZiB0aGUgdGFzayBzdGFjayBzcGVjaWZpZWQgYXMgdGhlIG51bWJlciBvZgorICogdmFyaWFibGVzIHRoZSBzdGFjayBjYW4gaG9sZCAtIG5vdCB0aGUgbnVtYmVyIG9mIGJ5dGVzLiAgRm9yIGV4YW1wbGUsIGlmCisgKiB0aGUgc3RhY2sgaXMgMTYgYml0cyB3aWRlIGFuZCB1c1N0YWNrRGVwdGggaXMgZGVmaW5lZCBhcyAxMDAsIDIwMCBieXRlcworICogd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIHN0YWNrIHN0b3JhZ2UuCisgKgorICogQHBhcmFtIHB2UGFyYW1ldGVycyBQb2ludGVyIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSB0YXNrCisgKiBiZWluZyBjcmVhdGVkLgorICoKKyAqIEBwYXJhbSB1eFByaW9yaXR5IFRoZSBwcmlvcml0eSBhdCB3aGljaCB0aGUgdGFzayBzaG91bGQgcnVuLiAgU3lzdGVtcyB0aGF0CisgKiBpbmNsdWRlIE1QVSBzdXBwb3J0IGNhbiBvcHRpb25hbGx5IGNyZWF0ZSB0YXNrcyBpbiBhIHByaXZpbGVnZWQgKHN5c3RlbSkKKyAqIG1vZGUgYnkgc2V0dGluZyBiaXQgcG9ydFBSSVZJTEVHRV9CSVQgb2YgdGhlIHByaW9yaXR5IHBhcmFtZXRlci4gIEZvcgorICogZXhhbXBsZSwgdG8gY3JlYXRlIGEgcHJpdmlsZWdlZCB0YXNrIGF0IHByaW9yaXR5IDIgdGhlIHV4UHJpb3JpdHkgcGFyYW1ldGVyCisgKiBzaG91bGQgYmUgc2V0IHRvICggMiB8IHBvcnRQUklWSUxFR0VfQklUICkuCisgKgorICogQHBhcmFtIHB2Q3JlYXRlZFRhc2sgVXNlZCB0byBwYXNzIGJhY2sgYSBoYW5kbGUgYnkgd2hpY2ggdGhlIGNyZWF0ZWQgdGFzaworICogY2FuIGJlIHJlZmVyZW5jZWQuCisgKgorICogQHJldHVybiBwZFBBU1MgaWYgdGhlIHRhc2sgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuZCBhZGRlZCB0byBhIHJlYWR5CisgKiBsaXN0LCBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSBkZWZpbmVkIGluIHRoZSBmaWxlIHByb2pkZWZzLmgKKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKyAvLyBUYXNrIHRvIGJlIGNyZWF0ZWQuCisgdm9pZCB2VGFza0NvZGUoIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorIHsKKwkgZm9yKCA7OyApCisJIHsKKwkJIC8vIFRhc2sgY29kZSBnb2VzIGhlcmUuCisJIH0KKyB9CisKKyAvLyBGdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSB0YXNrLgorIHZvaWQgdk90aGVyRnVuY3Rpb24oIHZvaWQgKQorIHsKKyBzdGF0aWMgdWludDhfdCB1Y1BhcmFtZXRlclRvUGFzczsKKyBUYXNrSGFuZGxlX3QgeEhhbmRsZSA9IE5VTEw7CisKKwkgLy8gQ3JlYXRlIHRoZSB0YXNrLCBzdG9yaW5nIHRoZSBoYW5kbGUuICBOb3RlIHRoYXQgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgdWNQYXJhbWV0ZXJUb1Bhc3MKKwkgLy8gbXVzdCBleGlzdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB0YXNrLCBzbyBpbiB0aGlzIGNhc2UgaXMgZGVjbGFyZWQgc3RhdGljLiAgSWYgaXQgd2FzIGp1c3QgYW4KKwkgLy8gYW4gYXV0b21hdGljIHN0YWNrIHZhcmlhYmxlIGl0IG1pZ2h0IG5vIGxvbmdlciBleGlzdCwgb3IgYXQgbGVhc3QgaGF2ZSBiZWVuIGNvcnJ1cHRlZCwgYnkgdGhlIHRpbWUKKwkgLy8gdGhlIG5ldyB0YXNrIGF0dGVtcHRzIHRvIGFjY2VzcyBpdC4KKwkgeFRhc2tDcmVhdGUoIHZUYXNrQ29kZSwgIk5BTUUiLCBTVEFDS19TSVpFLCAmdWNQYXJhbWV0ZXJUb1Bhc3MsIHRza0lETEVfUFJJT1JJVFksICZ4SGFuZGxlICk7CisgICAgIGNvbmZpZ0FTU0VSVCggeEhhbmRsZSApOworCisJIC8vIFVzZSB0aGUgaGFuZGxlIHRvIGRlbGV0ZSB0aGUgdGFzay4KKyAgICAgaWYoIHhIYW5kbGUgIT0gTlVMTCApCisgICAgIHsKKwkgICAgIHZUYXNrRGVsZXRlKCB4SGFuZGxlICk7CisgICAgIH0KKyB9CisgICA8L3ByZT4KKyAqIFxkZWZncm91cCB4VGFza0NyZWF0ZSB4VGFza0NyZWF0ZQorICogXGluZ3JvdXAgVGFza3MKKyAqLworI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKwlCYXNlVHlwZV90IHhUYXNrQ3JlYXRlKAlUYXNrRnVuY3Rpb25fdCBweFRhc2tDb2RlLAorCQkJCQkJCWNvbnN0IGNoYXIgKiBjb25zdCBwY05hbWUsCS8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworCQkJCQkJCWNvbnN0IGNvbmZpZ1NUQUNLX0RFUFRIX1RZUEUgdXNTdGFja0RlcHRoLAorCQkJCQkJCXZvaWQgKiBjb25zdCBwdlBhcmFtZXRlcnMsCisJCQkJCQkJVUJhc2VUeXBlX3QgdXhQcmlvcml0eSwKKwkJCQkJCQlUYXNrSGFuZGxlX3QgKiBjb25zdCBweENyZWF0ZWRUYXNrICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZgorCisvKioKKyAqIHRhc2suIGgKKyAqPHByZT4KKyBUYXNrSGFuZGxlX3QgeFRhc2tDcmVhdGVTdGF0aWMoIFRhc2tGdW5jdGlvbl90IHB2VGFza0NvZGUsCisJCQkJCQkJCSBjb25zdCBjaGFyICogY29uc3QgcGNOYW1lLAorCQkJCQkJCQkgdWludDMyX3QgdWxTdGFja0RlcHRoLAorCQkJCQkJCQkgdm9pZCAqcHZQYXJhbWV0ZXJzLAorCQkJCQkJCQkgVUJhc2VUeXBlX3QgdXhQcmlvcml0eSwKKwkJCQkJCQkJIFN0YWNrVHlwZV90ICpweFN0YWNrQnVmZmVyLAorCQkJCQkJCQkgU3RhdGljVGFza190ICpweFRhc2tCdWZmZXIgKTs8L3ByZT4KKyAqCisgKiBDcmVhdGUgYSBuZXcgdGFzayBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHRhc2tzIHRoYXQgYXJlIHJlYWR5IHRvIHJ1bi4KKyAqCisgKiBJbnRlcm5hbGx5LCB3aXRoaW4gdGhlIEZyZWVSVE9TIGltcGxlbWVudGF0aW9uLCB0YXNrcyB1c2UgdHdvIGJsb2NrcyBvZgorICogbWVtb3J5LiAgVGhlIGZpcnN0IGJsb2NrIGlzIHVzZWQgdG8gaG9sZCB0aGUgdGFzaydzIGRhdGEgc3RydWN0dXJlcy4gIFRoZQorICogc2Vjb25kIGJsb2NrIGlzIHVzZWQgYnkgdGhlIHRhc2sgYXMgaXRzIHN0YWNrLiAgSWYgYSB0YXNrIGlzIGNyZWF0ZWQgdXNpbmcKKyAqIHhUYXNrQ3JlYXRlKCkgdGhlbiBib3RoIGJsb2NrcyBvZiBtZW1vcnkgYXJlIGF1dG9tYXRpY2FsbHkgZHluYW1pY2FsbHkKKyAqIGFsbG9jYXRlZCBpbnNpZGUgdGhlIHhUYXNrQ3JlYXRlKCkgZnVuY3Rpb24uICAoc2VlCisgKiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTEuaHRtbCkuICBJZiBhIHRhc2sgaXMgY3JlYXRlZCB1c2luZworICogeFRhc2tDcmVhdGVTdGF0aWMoKSB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgbXVzdCBwcm92aWRlIHRoZSByZXF1aXJlZAorICogbWVtb3J5LiAgeFRhc2tDcmVhdGVTdGF0aWMoKSB0aGVyZWZvcmUgYWxsb3dzIGEgdGFzayB0byBiZSBjcmVhdGVkIHdpdGhvdXQKKyAqIHVzaW5nIGFueSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIEBwYXJhbSBwdlRhc2tDb2RlIFBvaW50ZXIgdG8gdGhlIHRhc2sgZW50cnkgZnVuY3Rpb24uICBUYXNrcworICogbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBuZXZlciByZXR1cm4gKGkuZS4gY29udGludW91cyBsb29wKS4KKyAqCisgKiBAcGFyYW0gcGNOYW1lIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHRhc2suICBUaGlzIGlzIG1haW5seSB1c2VkIHRvCisgKiBmYWNpbGl0YXRlIGRlYnVnZ2luZy4gIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIGRlZmluZWQgYnkKKyAqIGNvbmZpZ01BWF9UQVNLX05BTUVfTEVOIGluIEZyZWVSVE9TQ29uZmlnLmguCisgKgorICogQHBhcmFtIHVsU3RhY2tEZXB0aCBUaGUgc2l6ZSBvZiB0aGUgdGFzayBzdGFjayBzcGVjaWZpZWQgYXMgdGhlIG51bWJlciBvZgorICogdmFyaWFibGVzIHRoZSBzdGFjayBjYW4gaG9sZCAtIG5vdCB0aGUgbnVtYmVyIG9mIGJ5dGVzLiAgRm9yIGV4YW1wbGUsIGlmCisgKiB0aGUgc3RhY2sgaXMgMzItYml0cyB3aWRlIGFuZCB1bFN0YWNrRGVwdGggaXMgZGVmaW5lZCBhcyAxMDAgdGhlbiA0MDAgYnl0ZXMKKyAqIHdpbGwgYmUgYWxsb2NhdGVkIGZvciBzdGFjayBzdG9yYWdlLgorICoKKyAqIEBwYXJhbSBwdlBhcmFtZXRlcnMgUG9pbnRlciB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcGFyYW1ldGVyIGZvciB0aGUgdGFzaworICogYmVpbmcgY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0gdXhQcmlvcml0eSBUaGUgcHJpb3JpdHkgYXQgd2hpY2ggdGhlIHRhc2sgd2lsbCBydW4uCisgKgorICogQHBhcmFtIHB4U3RhY2tCdWZmZXIgTXVzdCBwb2ludCB0byBhIFN0YWNrVHlwZV90IGFycmF5IHRoYXQgaGFzIGF0IGxlYXN0CisgKiB1bFN0YWNrRGVwdGggaW5kZXhlcyAtIHRoZSBhcnJheSB3aWxsIHRoZW4gYmUgdXNlZCBhcyB0aGUgdGFzaydzIHN0YWNrLAorICogcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIHRoZSBzdGFjayB0byBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisgKgorICogQHBhcmFtIHB4VGFza0J1ZmZlciBNdXN0IHBvaW50IHRvIGEgdmFyaWFibGUgb2YgdHlwZSBTdGF0aWNUYXNrX3QsIHdoaWNoIHdpbGwKKyAqIHRoZW4gYmUgdXNlZCB0byBob2xkIHRoZSB0YXNrJ3MgZGF0YSBzdHJ1Y3R1cmVzLCByZW1vdmluZyB0aGUgbmVlZCBmb3IgdGhlCisgKiBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgorICoKKyAqIEByZXR1cm4gSWYgbmVpdGhlciBweFN0YWNrQnVmZmVyIG9yIHB4VGFza0J1ZmZlciBhcmUgTlVMTCwgdGhlbiB0aGUgdGFzayB3aWxsCisgKiBiZSBjcmVhdGVkIGFuZCBwZFBBU1MgaXMgcmV0dXJuZWQuICBJZiBlaXRoZXIgcHhTdGFja0J1ZmZlciBvciBweFRhc2tCdWZmZXIKKyAqIGFyZSBOVUxMIHRoZW4gdGhlIHRhc2sgd2lsbCBub3QgYmUgY3JlYXRlZCBhbmQKKyAqIGVyckNPVUxEX05PVF9BTExPQ0FURV9SRVFVSVJFRF9NRU1PUlkgaXMgcmV0dXJuZWQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+CisKKyAgICAvLyBEaW1lbnNpb25zIHRoZSBidWZmZXIgdGhhdCB0aGUgdGFzayBiZWluZyBjcmVhdGVkIHdpbGwgdXNlIGFzIGl0cyBzdGFjay4KKyAgICAvLyBOT1RFOiAgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHdvcmRzIHRoZSBzdGFjayB3aWxsIGhvbGQsIG5vdCB0aGUgbnVtYmVyIG9mCisgICAgLy8gYnl0ZXMuICBGb3IgZXhhbXBsZSwgaWYgZWFjaCBzdGFjayBpdGVtIGlzIDMyLWJpdHMsIGFuZCB0aGlzIGlzIHNldCB0byAxMDAsCisgICAgLy8gdGhlbiA0MDAgYnl0ZXMgKDEwMCAqIDMyLWJpdHMpIHdpbGwgYmUgYWxsb2NhdGVkLgorICAgICNkZWZpbmUgU1RBQ0tfU0laRSAyMDAKKworICAgIC8vIFN0cnVjdHVyZSB0aGF0IHdpbGwgaG9sZCB0aGUgVENCIG9mIHRoZSB0YXNrIGJlaW5nIGNyZWF0ZWQuCisgICAgU3RhdGljVGFza190IHhUYXNrQnVmZmVyOworCisgICAgLy8gQnVmZmVyIHRoYXQgdGhlIHRhc2sgYmVpbmcgY3JlYXRlZCB3aWxsIHVzZSBhcyBpdHMgc3RhY2suICBOb3RlIHRoaXMgaXMKKyAgICAvLyBhbiBhcnJheSBvZiBTdGFja1R5cGVfdCB2YXJpYWJsZXMuICBUaGUgc2l6ZSBvZiBTdGFja1R5cGVfdCBpcyBkZXBlbmRlbnQgb24KKyAgICAvLyB0aGUgUlRPUyBwb3J0LgorICAgIFN0YWNrVHlwZV90IHhTdGFja1sgU1RBQ0tfU0laRSBdOworCisgICAgLy8gRnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSB0YXNrIGJlaW5nIGNyZWF0ZWQuCisgICAgdm9pZCB2VGFza0NvZGUoIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorICAgIHsKKyAgICAgICAgLy8gVGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSAxIGFzIDEgaXMgcGFzc2VkIGluIHRoZQorICAgICAgICAvLyBwdlBhcmFtZXRlcnMgdmFsdWUgaW4gdGhlIGNhbGwgdG8geFRhc2tDcmVhdGVTdGF0aWMoKS4KKyAgICAgICAgY29uZmlnQVNTRVJUKCAoIHVpbnQzMl90ICkgcHZQYXJhbWV0ZXJzID09IDFVTCApOworCisgICAgICAgIGZvciggOzsgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUYXNrIGNvZGUgZ29lcyBoZXJlLgorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgdGFzay4KKyAgICB2b2lkIHZPdGhlckZ1bmN0aW9uKCB2b2lkICkKKyAgICB7CisgICAgICAgIFRhc2tIYW5kbGVfdCB4SGFuZGxlID0gTlVMTDsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIHRhc2sgd2l0aG91dCB1c2luZyBhbnkgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgICAgICAgeEhhbmRsZSA9IHhUYXNrQ3JlYXRlU3RhdGljKAorICAgICAgICAgICAgICAgICAgICAgIHZUYXNrQ29kZSwgICAgICAgLy8gRnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSB0YXNrLgorICAgICAgICAgICAgICAgICAgICAgICJOQU1FIiwgICAgICAgICAgLy8gVGV4dCBuYW1lIGZvciB0aGUgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgICBTVEFDS19TSVpFLCAgICAgIC8vIFN0YWNrIHNpemUgaW4gd29yZHMsIG5vdCBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAoIHZvaWQgKiApIDEsICAgIC8vIFBhcmFtZXRlciBwYXNzZWQgaW50byB0aGUgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgICB0c2tJRExFX1BSSU9SSVRZLC8vIFByaW9yaXR5IGF0IHdoaWNoIHRoZSB0YXNrIGlzIGNyZWF0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgeFN0YWNrLCAgICAgICAgICAvLyBBcnJheSB0byB1c2UgYXMgdGhlIHRhc2sncyBzdGFjay4KKyAgICAgICAgICAgICAgICAgICAgICAmeFRhc2tCdWZmZXIgKTsgIC8vIFZhcmlhYmxlIHRvIGhvbGQgdGhlIHRhc2sncyBkYXRhIHN0cnVjdHVyZS4KKworICAgICAgICAvLyBwdXhTdGFja0J1ZmZlciBhbmQgcHhUYXNrQnVmZmVyIHdlcmUgbm90IE5VTEwsIHNvIHRoZSB0YXNrIHdpbGwgaGF2ZQorICAgICAgICAvLyBiZWVuIGNyZWF0ZWQsIGFuZCB4SGFuZGxlIHdpbGwgYmUgdGhlIHRhc2sncyBoYW5kbGUuICBVc2UgdGhlIGhhbmRsZQorICAgICAgICAvLyB0byBzdXNwZW5kIHRoZSB0YXNrLgorICAgICAgICB2VGFza1N1c3BlbmQoIHhIYW5kbGUgKTsKKyAgICB9CisgICA8L3ByZT4KKyAqIFxkZWZncm91cCB4VGFza0NyZWF0ZVN0YXRpYyB4VGFza0NyZWF0ZVN0YXRpYworICogXGluZ3JvdXAgVGFza3MKKyAqLworI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCVRhc2tIYW5kbGVfdCB4VGFza0NyZWF0ZVN0YXRpYygJVGFza0Z1bmN0aW9uX3QgcHhUYXNrQ29kZSwKKwkJCQkJCQkJCWNvbnN0IGNoYXIgKiBjb25zdCBwY05hbWUsIC8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworCQkJCQkJCQkJY29uc3QgdWludDMyX3QgdWxTdGFja0RlcHRoLAorCQkJCQkJCQkJdm9pZCAqIGNvbnN0IHB2UGFyYW1ldGVycywKKwkJCQkJCQkJCVVCYXNlVHlwZV90IHV4UHJpb3JpdHksCisJCQkJCQkJCQlTdGFja1R5cGVfdCAqIGNvbnN0IHB1eFN0YWNrQnVmZmVyLAorCQkJCQkJCQkJU3RhdGljVGFza190ICogY29uc3QgcHhUYXNrQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZiAvKiBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OICovCisKKy8qKgorICogdGFzay4gaAorICo8cHJlPgorIEJhc2VUeXBlX3QgeFRhc2tDcmVhdGVSZXN0cmljdGVkKCBUYXNrUGFyYW1ldGVyc190ICpweFRhc2tEZWZpbml0aW9uLCBUYXNrSGFuZGxlX3QgKnB4Q3JlYXRlZFRhc2sgKTs8L3ByZT4KKyAqCisgKiBPbmx5IGF2YWlsYWJsZSB3aGVuIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OIGlzIHNldCB0byAxLgorICoKKyAqIHhUYXNrQ3JlYXRlUmVzdHJpY3RlZCgpIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gc3lzdGVtcyB0aGF0IGluY2x1ZGUgYW4gTVBVCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDcmVhdGUgYSBuZXcgdGFzayBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHRhc2tzIHRoYXQgYXJlIHJlYWR5IHRvIHJ1bi4KKyAqIFRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGRlZmluZSB0aGUgbWVtb3J5IHJlZ2lvbnMgYW5kIGFzc29jaWF0ZWQgYWNjZXNzCisgKiBwZXJtaXNzaW9ucyBhbGxvY2F0ZWQgdG8gdGhlIHRhc2suCisgKgorICogU2VlIHhUYXNrQ3JlYXRlUmVzdHJpY3RlZFN0YXRpYygpIGZvciBhIHZlcnNpb24gdGhhdCBkb2VzIG5vdCB1c2UgYW55CisgKiBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIEBwYXJhbSBweFRhc2tEZWZpbml0aW9uIFBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhIG1lbWJlcgorICogZm9yIGVhY2ggb2YgdGhlIG5vcm1hbCB4VGFza0NyZWF0ZSgpIHBhcmFtZXRlcnMgKHNlZSB0aGUgeFRhc2tDcmVhdGUoKSBBUEkKKyAqIGRvY3VtZW50YXRpb24pIHBsdXMgYW4gb3B0aW9uYWwgc3RhY2sgYnVmZmVyIGFuZCB0aGUgbWVtb3J5IHJlZ2lvbgorICogZGVmaW5pdGlvbnMuCisgKgorICogQHBhcmFtIHB4Q3JlYXRlZFRhc2sgVXNlZCB0byBwYXNzIGJhY2sgYSBoYW5kbGUgYnkgd2hpY2ggdGhlIGNyZWF0ZWQgdGFzaworICogY2FuIGJlIHJlZmVyZW5jZWQuCisgKgorICogQHJldHVybiBwZFBBU1MgaWYgdGhlIHRhc2sgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuZCBhZGRlZCB0byBhIHJlYWR5CisgKiBsaXN0LCBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSBkZWZpbmVkIGluIHRoZSBmaWxlIHByb2pkZWZzLmgKKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKy8vIENyZWF0ZSBhbiBUYXNrUGFyYW1ldGVyc190IHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIHRhc2sgdG8gYmUgY3JlYXRlZC4KK3N0YXRpYyBjb25zdCBUYXNrUGFyYW1ldGVyc190IHhDaGVja1Rhc2tQYXJhbWV0ZXJzID0KK3sKKwl2QVRhc2ssCQkvLyBwdlRhc2tDb2RlIC0gdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGUgdGFzay4KKwkiQVRhc2siLAkvLyBwY05hbWUgLSBqdXN0IGEgdGV4dCBuYW1lIGZvciB0aGUgdGFzayB0byBhc3Npc3QgZGVidWdnaW5nLgorCTEwMCwJCS8vIHVzU3RhY2tEZXB0aAktIHRoZSBzdGFjayBzaXplIERFRklORUQgSU4gV09SRFMuCisJTlVMTCwJCS8vIHB2UGFyYW1ldGVycyAtIHBhc3NlZCBpbnRvIHRoZSB0YXNrIGZ1bmN0aW9uIGFzIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorCSggMVVMIHwgcG9ydFBSSVZJTEVHRV9CSVQgKSwvLyB1eFByaW9yaXR5IC0gdGFzayBwcmlvcml0eSwgc2V0IHRoZSBwb3J0UFJJVklMRUdFX0JJVCBpZiB0aGUgdGFzayBzaG91bGQgcnVuIGluIGEgcHJpdmlsZWdlZCBzdGF0ZS4KKwljU3RhY2tCdWZmZXIsLy8gcHV4U3RhY2tCdWZmZXIgLSB0aGUgYnVmZmVyIHRvIGJlIHVzZWQgYXMgdGhlIHRhc2sgc3RhY2suCisKKwkvLyB4UmVnaW9ucyAtIEFsbG9jYXRlIHVwIHRvIHRocmVlIHNlcGFyYXRlIG1lbW9yeSByZWdpb25zIGZvciBhY2Nlc3MgYnkKKwkvLyB0aGUgdGFzaywgd2l0aCBhcHByb3ByaWF0ZSBhY2Nlc3MgcGVybWlzc2lvbnMuICBEaWZmZXJlbnQgcHJvY2Vzc29ycyBoYXZlCisJLy8gZGlmZmVyZW50IG1lbW9yeSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIC0gcmVmZXIgdG8gdGhlIEZyZWVSVE9TIGRvY3VtZW50YXRpb24KKwkvLyBmb3IgZnVsbCBpbmZvcm1hdGlvbi4KKwl7CisJCS8vIEJhc2UgYWRkcmVzcwkJCQkJTGVuZ3RoCVBhcmFtZXRlcnMKKyAgICAgICAgeyBjUmVhZFdyaXRlQXJyYXksCQkJCTMyLAkJcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSB9LAorICAgICAgICB7IGNSZWFkT25seUFycmF5LAkJCQkzMiwJCXBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSB9LAorICAgICAgICB7IGNQcml2aWxlZ2VkT25seUFjY2Vzc0FycmF5LAkxMjgsCXBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURSB9CisJfQorfTsKKworaW50IG1haW4oIHZvaWQgKQoreworVGFza0hhbmRsZV90IHhIYW5kbGU7CisKKwkvLyBDcmVhdGUgYSB0YXNrIGZyb20gdGhlIGNvbnN0IHN0cnVjdHVyZSBkZWZpbmVkIGFib3ZlLiAgVGhlIHRhc2sgaGFuZGxlCisJLy8gaXMgcmVxdWVzdGVkICh0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBub3QgTlVMTCkgYnV0IGluIHRoaXMgY2FzZSBqdXN0IGZvcgorCS8vIGRlbW9uc3RyYXRpb24gcHVycG9zZXMgYXMgaXRzIG5vdCBhY3R1YWxseSB1c2VkLgorCXhUYXNrQ3JlYXRlUmVzdHJpY3RlZCggJnhSZWdUZXN0MVBhcmFtZXRlcnMsICZ4SGFuZGxlICk7CisKKwkvLyBTdGFydCB0aGUgc2NoZWR1bGVyLgorCXZUYXNrU3RhcnRTY2hlZHVsZXIoKTsKKworCS8vIFdpbGwgb25seSBnZXQgaGVyZSBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjcmVhdGUgdGhlIGlkbGUKKwkvLyBhbmQvb3IgdGltZXIgdGFzay4KKwlmb3IoIDs7ICk7Cit9CisgICA8L3ByZT4KKyAqIFxkZWZncm91cCB4VGFza0NyZWF0ZVJlc3RyaWN0ZWQgeFRhc2tDcmVhdGVSZXN0cmljdGVkCisgKiBcaW5ncm91cCBUYXNrcworICovCisjaWYoIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMgPT0gMSApCisJQmFzZVR5cGVfdCB4VGFza0NyZWF0ZVJlc3RyaWN0ZWQoIGNvbnN0IFRhc2tQYXJhbWV0ZXJzX3QgKiBjb25zdCBweFRhc2tEZWZpbml0aW9uLCBUYXNrSGFuZGxlX3QgKnB4Q3JlYXRlZFRhc2sgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworI2VuZGlmCisKKy8qKgorICogdGFzay4gaAorICo8cHJlPgorIEJhc2VUeXBlX3QgeFRhc2tDcmVhdGVSZXN0cmljdGVkU3RhdGljKCBUYXNrUGFyYW1ldGVyc190ICpweFRhc2tEZWZpbml0aW9uLCBUYXNrSGFuZGxlX3QgKnB4Q3JlYXRlZFRhc2sgKTs8L3ByZT4KKyAqCisgKiBPbmx5IGF2YWlsYWJsZSB3aGVuIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gaXMgc2V0IHRvIDEuCisgKgorICogeFRhc2tDcmVhdGVSZXN0cmljdGVkU3RhdGljKCkgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBzeXN0ZW1zIHRoYXQgaW5jbHVkZSBhbgorICogTVBVIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEludGVybmFsbHksIHdpdGhpbiB0aGUgRnJlZVJUT1MgaW1wbGVtZW50YXRpb24sIHRhc2tzIHVzZSB0d28gYmxvY2tzIG9mCisgKiBtZW1vcnkuICBUaGUgZmlyc3QgYmxvY2sgaXMgdXNlZCB0byBob2xkIHRoZSB0YXNrJ3MgZGF0YSBzdHJ1Y3R1cmVzLiAgVGhlCisgKiBzZWNvbmQgYmxvY2sgaXMgdXNlZCBieSB0aGUgdGFzayBhcyBpdHMgc3RhY2suICBJZiBhIHRhc2sgaXMgY3JlYXRlZCB1c2luZworICogeFRhc2tDcmVhdGVSZXN0cmljdGVkKCkgdGhlbiB0aGUgc3RhY2sgaXMgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdyaXRlciwKKyAqIGFuZCB0aGUgbWVtb3J5IHVzZWQgdG8gaG9sZCB0aGUgdGFzaydzIGRhdGEgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkKKyAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpbnNpZGUgdGhlIHhUYXNrQ3JlYXRlUmVzdHJpY3RlZCgpIGZ1bmN0aW9uLiAgSWYgYSB0YXNrCisgKiBpcyBjcmVhdGVkIHVzaW5nIHhUYXNrQ3JlYXRlUmVzdHJpY3RlZFN0YXRpYygpIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlcgorICogbXVzdCBwcm92aWRlIHRoZSBtZW1vcnkgdXNlZCB0byBob2xkIHRoZSB0YXNrJ3MgZGF0YSBzdHJ1Y3R1cmVzIHRvby4KKyAqIHhUYXNrQ3JlYXRlUmVzdHJpY3RlZFN0YXRpYygpIHRoZXJlZm9yZSBhbGxvd3MgYSBtZW1vcnkgcHJvdGVjdGVkIHRhc2sgdG8gYmUKKyAqIGNyZWF0ZWQgd2l0aG91dCB1c2luZyBhbnkgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBAcGFyYW0gcHhUYXNrRGVmaW5pdGlvbiBQb2ludGVyIHRvIGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYSBtZW1iZXIKKyAqIGZvciBlYWNoIG9mIHRoZSBub3JtYWwgeFRhc2tDcmVhdGUoKSBwYXJhbWV0ZXJzIChzZWUgdGhlIHhUYXNrQ3JlYXRlKCkgQVBJCisgKiBkb2N1bWVudGF0aW9uKSBwbHVzIGFuIG9wdGlvbmFsIHN0YWNrIGJ1ZmZlciBhbmQgdGhlIG1lbW9yeSByZWdpb24KKyAqIGRlZmluaXRpb25zLiAgSWYgY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiBpcyBzZXQgdG8gMSB0aGUgc3RydWN0dXJlCisgKiBjb250YWlucyBhbiBhZGRpdGlvbmFsIG1lbWJlciwgd2hpY2ggaXMgdXNlZCB0byBwb2ludCB0byBhIHZhcmlhYmxlIG9mIHR5cGUKKyAqIFN0YXRpY1Rhc2tfdCAtIHdoaWNoIGlzIHRoZW4gdXNlZCB0byBob2xkIHRoZSB0YXNrJ3MgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHB4Q3JlYXRlZFRhc2sgVXNlZCB0byBwYXNzIGJhY2sgYSBoYW5kbGUgYnkgd2hpY2ggdGhlIGNyZWF0ZWQgdGFzaworICogY2FuIGJlIHJlZmVyZW5jZWQuCisgKgorICogQHJldHVybiBwZFBBU1MgaWYgdGhlIHRhc2sgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuZCBhZGRlZCB0byBhIHJlYWR5CisgKiBsaXN0LCBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSBkZWZpbmVkIGluIHRoZSBmaWxlIHByb2pkZWZzLmgKKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKy8vIENyZWF0ZSBhbiBUYXNrUGFyYW1ldGVyc190IHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIHRhc2sgdG8gYmUgY3JlYXRlZC4KKy8vIFRoZSBTdGF0aWNUYXNrX3QgdmFyaWFibGUgaXMgb25seSBpbmNsdWRlZCBpbiB0aGUgc3RydWN0dXJlIHdoZW4KKy8vIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gaXMgc2V0IHRvIDEuICBUaGUgUFJJVklMRUdFRF9EQVRBIG1hY3JvIGNhbgorLy8gYmUgdXNlZCB0byBmb3JjZSB0aGUgdmFyaWFibGUgaW50byB0aGUgUlRPUyBrZXJuZWwncyBwcml2aWxlZ2VkIGRhdGEgYXJlYS4KK3N0YXRpYyBQUklWSUxFR0VEX0RBVEEgU3RhdGljVGFza190IHhUYXNrQnVmZmVyOworc3RhdGljIGNvbnN0IFRhc2tQYXJhbWV0ZXJzX3QgeENoZWNrVGFza1BhcmFtZXRlcnMgPQoreworCXZBVGFzaywJCS8vIHB2VGFza0NvZGUgLSB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSB0YXNrLgorCSJBVGFzayIsCS8vIHBjTmFtZSAtIGp1c3QgYSB0ZXh0IG5hbWUgZm9yIHRoZSB0YXNrIHRvIGFzc2lzdCBkZWJ1Z2dpbmcuCisJMTAwLAkJLy8gdXNTdGFja0RlcHRoCS0gdGhlIHN0YWNrIHNpemUgREVGSU5FRCBJTiBXT1JEUy4KKwlOVUxMLAkJLy8gcHZQYXJhbWV0ZXJzIC0gcGFzc2VkIGludG8gdGhlIHRhc2sgZnVuY3Rpb24gYXMgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCisJKCAxVUwgfCBwb3J0UFJJVklMRUdFX0JJVCApLC8vIHV4UHJpb3JpdHkgLSB0YXNrIHByaW9yaXR5LCBzZXQgdGhlIHBvcnRQUklWSUxFR0VfQklUIGlmIHRoZSB0YXNrIHNob3VsZCBydW4gaW4gYSBwcml2aWxlZ2VkIHN0YXRlLgorCWNTdGFja0J1ZmZlciwvLyBwdXhTdGFja0J1ZmZlciAtIHRoZSBidWZmZXIgdG8gYmUgdXNlZCBhcyB0aGUgdGFzayBzdGFjay4KKworCS8vIHhSZWdpb25zIC0gQWxsb2NhdGUgdXAgdG8gdGhyZWUgc2VwYXJhdGUgbWVtb3J5IHJlZ2lvbnMgZm9yIGFjY2VzcyBieQorCS8vIHRoZSB0YXNrLCB3aXRoIGFwcHJvcHJpYXRlIGFjY2VzcyBwZXJtaXNzaW9ucy4gIERpZmZlcmVudCBwcm9jZXNzb3JzIGhhdmUKKwkvLyBkaWZmZXJlbnQgbWVtb3J5IGFsaWdubWVudCByZXF1aXJlbWVudHMgLSByZWZlciB0byB0aGUgRnJlZVJUT1MgZG9jdW1lbnRhdGlvbgorCS8vIGZvciBmdWxsIGluZm9ybWF0aW9uLgorCXsKKwkJLy8gQmFzZSBhZGRyZXNzCQkJCQlMZW5ndGgJUGFyYW1ldGVycworICAgICAgICB7IGNSZWFkV3JpdGVBcnJheSwJCQkJMzIsCQlwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFIH0sCisgICAgICAgIHsgY1JlYWRPbmx5QXJyYXksCQkJCTMyLAkJcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZIH0sCisgICAgICAgIHsgY1ByaXZpbGVnZWRPbmx5QWNjZXNzQXJyYXksCTEyOCwJcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFIH0KKwl9CisKKwkmeFRhc2tCdWZmZXI7IC8vIEhvbGRzIHRoZSB0YXNrJ3MgZGF0YSBzdHJ1Y3R1cmUuCit9OworCitpbnQgbWFpbiggdm9pZCApCit7CitUYXNrSGFuZGxlX3QgeEhhbmRsZTsKKworCS8vIENyZWF0ZSBhIHRhc2sgZnJvbSB0aGUgY29uc3Qgc3RydWN0dXJlIGRlZmluZWQgYWJvdmUuICBUaGUgdGFzayBoYW5kbGUKKwkvLyBpcyByZXF1ZXN0ZWQgKHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIG5vdCBOVUxMKSBidXQgaW4gdGhpcyBjYXNlIGp1c3QgZm9yCisJLy8gZGVtb25zdHJhdGlvbiBwdXJwb3NlcyBhcyBpdHMgbm90IGFjdHVhbGx5IHVzZWQuCisJeFRhc2tDcmVhdGVSZXN0cmljdGVkKCAmeFJlZ1Rlc3QxUGFyYW1ldGVycywgJnhIYW5kbGUgKTsKKworCS8vIFN0YXJ0IHRoZSBzY2hlZHVsZXIuCisJdlRhc2tTdGFydFNjaGVkdWxlcigpOworCisJLy8gV2lsbCBvbmx5IGdldCBoZXJlIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGNyZWF0ZSB0aGUgaWRsZQorCS8vIGFuZC9vciB0aW1lciB0YXNrLgorCWZvciggOzsgKTsKK30KKyAgIDwvcHJlPgorICogXGRlZmdyb3VwIHhUYXNrQ3JlYXRlUmVzdHJpY3RlZFN0YXRpYyB4VGFza0NyZWF0ZVJlc3RyaWN0ZWRTdGF0aWMKKyAqIFxpbmdyb3VwIFRhc2tzCisgKi8KKyNpZiggKCBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICkKKwlCYXNlVHlwZV90IHhUYXNrQ3JlYXRlUmVzdHJpY3RlZFN0YXRpYyggY29uc3QgVGFza1BhcmFtZXRlcnNfdCAqIGNvbnN0IHB4VGFza0RlZmluaXRpb24sIFRhc2tIYW5kbGVfdCAqcHhDcmVhdGVkVGFzayApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYKKworLyoqCisgKiB0YXNrLiBoCisgKjxwcmU+Cisgdm9pZCB2VGFza0FsbG9jYXRlTVBVUmVnaW9ucyggVGFza0hhbmRsZV90IHhUYXNrLCBjb25zdCBNZW1vcnlSZWdpb25fdCAqIGNvbnN0IHB4UmVnaW9ucyApOzwvcHJlPgorICoKKyAqIE1lbW9yeSByZWdpb25zIGFyZSBhc3NpZ25lZCB0byBhIHJlc3RyaWN0ZWQgdGFzayB3aGVuIHRoZSB0YXNrIGlzIGNyZWF0ZWQgYnkKKyAqIGEgY2FsbCB0byB4VGFza0NyZWF0ZVJlc3RyaWN0ZWQoKS4gIFRoZXNlIHJlZ2lvbnMgY2FuIGJlIHJlZGVmaW5lZCB1c2luZworICogdlRhc2tBbGxvY2F0ZU1QVVJlZ2lvbnMoKS4KKyAqCisgKiBAcGFyYW0geFRhc2sgVGhlIGhhbmRsZSBvZiB0aGUgdGFzayBiZWluZyB1cGRhdGVkLgorICoKKyAqIEBwYXJhbSB4UmVnaW9ucyBBIHBvaW50ZXIgdG8gYW4gTWVtb3J5UmVnaW9uX3Qgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlCisgKiBuZXcgbWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9ucy4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKy8vIERlZmluZSBhbiBhcnJheSBvZiBNZW1vcnlSZWdpb25fdCBzdHJ1Y3R1cmVzIHRoYXQgY29uZmlndXJlcyBhbiBNUFUgcmVnaW9uCisvLyBhbGxvd2luZyByZWFkL3dyaXRlIGFjY2VzcyBmb3IgMTAyNCBieXRlcyBzdGFydGluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorLy8gdWNPbmVLQnl0ZSBhcnJheS4gIFRoZSBvdGhlciB0d28gb2YgdGhlIG1heGltdW0gMyBkZWZpbmFibGUgcmVnaW9ucyBhcmUKKy8vIHVudXNlZCBzbyBzZXQgdG8gemVyby4KK3N0YXRpYyBjb25zdCBNZW1vcnlSZWdpb25fdCB4QWx0UmVnaW9uc1sgcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUyBdID0KK3sKKwkvLyBCYXNlIGFkZHJlc3MJCUxlbmd0aAkJUGFyYW1ldGVycworCXsgdWNPbmVLQnl0ZSwJCTEwMjQsCQlwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFIH0sCisJeyAwLAkJCQkwLAkJCTAgfSwKKwl7IDAsCQkJCTAsCQkJMCB9Cit9OworCit2b2lkIHZBVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkKK3sKKwkvLyBUaGlzIHRhc2sgd2FzIGNyZWF0ZWQgc3VjaCB0aGF0IGl0IGhhcyBhY2Nlc3MgdG8gY2VydGFpbiByZWdpb25zIG9mCisJLy8gbWVtb3J5IGFzIGRlZmluZWQgYnkgdGhlIE1QVSBjb25maWd1cmF0aW9uLiAgQXQgc29tZSBwb2ludCBpdCBpcworCS8vIGRlc2lyZWQgdGhhdCB0aGVzZSBNUFUgcmVnaW9ucyBhcmUgcmVwbGFjZWQgd2l0aCB0aGF0IGRlZmluZWQgaW4gdGhlCisJLy8geEFsdFJlZ2lvbnMgY29uc3Qgc3RydWN0IGFib3ZlLiAgVXNlIGEgY2FsbCB0byB2VGFza0FsbG9jYXRlTVBVUmVnaW9ucygpCisJLy8gZm9yIHRoaXMgcHVycG9zZS4gIE5VTEwgaXMgdXNlZCBhcyB0aGUgdGFzayBoYW5kbGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzCisJLy8gZnVuY3Rpb24gc2hvdWxkIG1vZGlmeSB0aGUgTVBVIHJlZ2lvbnMgb2YgdGhlIGNhbGxpbmcgdGFzay4KKwl2VGFza0FsbG9jYXRlTVBVUmVnaW9ucyggTlVMTCwgeEFsdFJlZ2lvbnMgKTsKKworCS8vIE5vdyB0aGUgdGFzayBjYW4gY29udGludWUgaXRzIGZ1bmN0aW9uLCBidXQgZnJvbSB0aGlzIHBvaW50IG9uIGNhbiBvbmx5CisJLy8gYWNjZXNzIGl0cyBzdGFjayBhbmQgdGhlIHVjT25lS0J5dGUgYXJyYXkgKHVubGVzcyBhbnkgb3RoZXIgc3RhdGljYWxseQorCS8vIGRlZmluZWQgb3Igc2hhcmVkIHJlZ2lvbnMgaGF2ZSBiZWVuIGRlY2xhcmVkIGVsc2V3aGVyZSkuCit9CisgICA8L3ByZT4KKyAqIFxkZWZncm91cCB4VGFza0NyZWF0ZVJlc3RyaWN0ZWQgeFRhc2tDcmVhdGVSZXN0cmljdGVkCisgKiBcaW5ncm91cCBUYXNrcworICovCit2b2lkIHZUYXNrQWxsb2NhdGVNUFVSZWdpb25zKCBUYXNrSGFuZGxlX3QgeFRhc2ssIGNvbnN0IE1lbW9yeVJlZ2lvbl90ICogY29uc3QgcHhSZWdpb25zICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8cHJlPnZvaWQgdlRhc2tEZWxldGUoIFRhc2tIYW5kbGVfdCB4VGFzayApOzwvcHJlPgorICoKKyAqIElOQ0xVREVfdlRhc2tEZWxldGUgbXVzdCBiZSBkZWZpbmVkIGFzIDEgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlLgorICogU2VlIHRoZSBjb25maWd1cmF0aW9uIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogUmVtb3ZlIGEgdGFzayBmcm9tIHRoZSBSVE9TIHJlYWwgdGltZSBrZXJuZWwncyBtYW5hZ2VtZW50LiAgVGhlIHRhc2sgYmVpbmcKKyAqIGRlbGV0ZWQgd2lsbCBiZSByZW1vdmVkIGZyb20gYWxsIHJlYWR5LCBibG9ja2VkLCBzdXNwZW5kZWQgYW5kIGV2ZW50IGxpc3RzLgorICoKKyAqIE5PVEU6ICBUaGUgaWRsZSB0YXNrIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBrZXJuZWwgYWxsb2NhdGVkCisgKiBtZW1vcnkgZnJvbSB0YXNrcyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkLiAgSXQgaXMgdGhlcmVmb3JlIGltcG9ydGFudCB0aGF0CisgKiB0aGUgaWRsZSB0YXNrIGlzIG5vdCBzdGFydmVkIG9mIG1pY3JvY29udHJvbGxlciBwcm9jZXNzaW5nIHRpbWUgaWYgeW91cgorICogYXBwbGljYXRpb24gbWFrZXMgYW55IGNhbGxzIHRvIHZUYXNrRGVsZXRlICgpLiAgTWVtb3J5IGFsbG9jYXRlZCBieSB0aGUKKyAqIHRhc2sgY29kZSBpcyBub3QgYXV0b21hdGljYWxseSBmcmVlZCwgYW5kIHNob3VsZCBiZSBmcmVlZCBiZWZvcmUgdGhlIHRhc2sKKyAqIGlzIGRlbGV0ZWQuCisgKgorICogU2VlIHRoZSBkZW1vIGFwcGxpY2F0aW9uIGZpbGUgZGVhdGguYyBmb3Igc2FtcGxlIGNvZGUgdGhhdCB1dGlsaXNlcworICogdlRhc2tEZWxldGUgKCkuCisgKgorICogQHBhcmFtIHhUYXNrIFRoZSBoYW5kbGUgb2YgdGhlIHRhc2sgdG8gYmUgZGVsZXRlZC4gIFBhc3NpbmcgTlVMTCB3aWxsCisgKiBjYXVzZSB0aGUgY2FsbGluZyB0YXNrIHRvIGJlIGRlbGV0ZWQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+Cisgdm9pZCB2T3RoZXJGdW5jdGlvbiggdm9pZCApCisgeworIFRhc2tIYW5kbGVfdCB4SGFuZGxlOworCisJIC8vIENyZWF0ZSB0aGUgdGFzaywgc3RvcmluZyB0aGUgaGFuZGxlLgorCSB4VGFza0NyZWF0ZSggdlRhc2tDb2RlLCAiTkFNRSIsIFNUQUNLX1NJWkUsIE5VTEwsIHRza0lETEVfUFJJT1JJVFksICZ4SGFuZGxlICk7CisKKwkgLy8gVXNlIHRoZSBoYW5kbGUgdG8gZGVsZXRlIHRoZSB0YXNrLgorCSB2VGFza0RlbGV0ZSggeEhhbmRsZSApOworIH0KKyAgIDwvcHJlPgorICogXGRlZmdyb3VwIHZUYXNrRGVsZXRlIHZUYXNrRGVsZXRlCisgKiBcaW5ncm91cCBUYXNrcworICovCit2b2lkIHZUYXNrRGVsZXRlKCBUYXNrSGFuZGxlX3QgeFRhc2tUb0RlbGV0ZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRBU0sgQ09OVFJPTCBBUEkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogdGFzay4gaAorICogPHByZT52b2lkIHZUYXNrRGVsYXkoIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9EZWxheSApOzwvcHJlPgorICoKKyAqIERlbGF5IGEgdGFzayBmb3IgYSBnaXZlbiBudW1iZXIgb2YgdGlja3MuICBUaGUgYWN0dWFsIHRpbWUgdGhhdCB0aGUKKyAqIHRhc2sgcmVtYWlucyBibG9ja2VkIGRlcGVuZHMgb24gdGhlIHRpY2sgcmF0ZS4gIFRoZSBjb25zdGFudAorICogcG9ydFRJQ0tfUEVSSU9EX01TIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSByZWFsIHRpbWUgZnJvbSB0aGUgdGljaworICogcmF0ZSAtIHdpdGggdGhlIHJlc29sdXRpb24gb2Ygb25lIHRpY2sgcGVyaW9kLgorICoKKyAqIElOQ0xVREVfdlRhc2tEZWxheSBtdXN0IGJlIGRlZmluZWQgYXMgMSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUuCisgKiBTZWUgdGhlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKgorICogdlRhc2tEZWxheSgpIHNwZWNpZmllcyBhIHRpbWUgYXQgd2hpY2ggdGhlIHRhc2sgd2lzaGVzIHRvIHVuYmxvY2sgcmVsYXRpdmUgdG8KKyAqIHRoZSB0aW1lIGF0IHdoaWNoIHZUYXNrRGVsYXkoKSBpcyBjYWxsZWQuICBGb3IgZXhhbXBsZSwgc3BlY2lmeWluZyBhIGJsb2NrCisgKiBwZXJpb2Qgb2YgMTAwIHRpY2tzIHdpbGwgY2F1c2UgdGhlIHRhc2sgdG8gdW5ibG9jayAxMDAgdGlja3MgYWZ0ZXIKKyAqIHZUYXNrRGVsYXkoKSBpcyBjYWxsZWQuICB2VGFza0RlbGF5KCkgZG9lcyBub3QgdGhlcmVmb3JlIHByb3ZpZGUgYSBnb29kIG1ldGhvZAorICogb2YgY29udHJvbGxpbmcgdGhlIGZyZXF1ZW5jeSBvZiBhIHBlcmlvZGljIHRhc2sgYXMgdGhlIHBhdGggdGFrZW4gdGhyb3VnaCB0aGUKKyAqIGNvZGUsIGFzIHdlbGwgYXMgb3RoZXIgdGFzayBhbmQgaW50ZXJydXB0IGFjdGl2aXR5LCB3aWxsIGVmZmVjdCB0aGUgZnJlcXVlbmN5CisgKiBhdCB3aGljaCB2VGFza0RlbGF5KCkgZ2V0cyBjYWxsZWQgYW5kIHRoZXJlZm9yZSB0aGUgdGltZSBhdCB3aGljaCB0aGUgdGFzaworICogbmV4dCBleGVjdXRlcy4gIFNlZSB2VGFza0RlbGF5VW50aWwoKSBmb3IgYW4gYWx0ZXJuYXRpdmUgQVBJIGZ1bmN0aW9uIGRlc2lnbmVkCisgKiB0byBmYWNpbGl0YXRlIGZpeGVkIGZyZXF1ZW5jeSBleGVjdXRpb24uICBJdCBkb2VzIHRoaXMgYnkgc3BlY2lmeWluZyBhbgorICogYWJzb2x1dGUgdGltZSAocmF0aGVyIHRoYW4gYSByZWxhdGl2ZSB0aW1lKSBhdCB3aGljaCB0aGUgY2FsbGluZyB0YXNrIHNob3VsZAorICogdW5ibG9jay4KKyAqCisgKiBAcGFyYW0geFRpY2tzVG9EZWxheSBUaGUgYW1vdW50IG9mIHRpbWUsIGluIHRpY2sgcGVyaW9kcywgdGhhdAorICogdGhlIGNhbGxpbmcgdGFzayBzaG91bGQgYmxvY2suCisgKgorICogRXhhbXBsZSB1c2FnZToKKworIHZvaWQgdlRhc2tGdW5jdGlvbiggdm9pZCAqIHB2UGFyYW1ldGVycyApCisgeworIC8vIEJsb2NrIGZvciA1MDBtcy4KKyBjb25zdCBUaWNrVHlwZV90IHhEZWxheSA9IDUwMCAvIHBvcnRUSUNLX1BFUklPRF9NUzsKKworCSBmb3IoIDs7ICkKKwkgeworCQkgLy8gU2ltcGx5IHRvZ2dsZSB0aGUgTEVEIGV2ZXJ5IDUwMG1zLCBibG9ja2luZyBiZXR3ZWVuIGVhY2ggdG9nZ2xlLgorCQkgdlRvZ2dsZUxFRCgpOworCQkgdlRhc2tEZWxheSggeERlbGF5ICk7CisJIH0KKyB9CisKKyAqIFxkZWZncm91cCB2VGFza0RlbGF5IHZUYXNrRGVsYXkKKyAqIFxpbmdyb3VwIFRhc2tDdHJsCisgKi8KK3ZvaWQgdlRhc2tEZWxheSggY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb0RlbGF5ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8cHJlPnZvaWQgdlRhc2tEZWxheVVudGlsKCBUaWNrVHlwZV90ICpweFByZXZpb3VzV2FrZVRpbWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpbWVJbmNyZW1lbnQgKTs8L3ByZT4KKyAqCisgKiBJTkNMVURFX3ZUYXNrRGVsYXlVbnRpbCBtdXN0IGJlIGRlZmluZWQgYXMgMSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUuCisgKiBTZWUgdGhlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBEZWxheSBhIHRhc2sgdW50aWwgYSBzcGVjaWZpZWQgdGltZS4gIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgcGVyaW9kaWMKKyAqIHRhc2tzIHRvIGVuc3VyZSBhIGNvbnN0YW50IGV4ZWN1dGlvbiBmcmVxdWVuY3kuCisgKgorICogVGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gdlRhc2tEZWxheSAoKSBpbiBvbmUgaW1wb3J0YW50IGFzcGVjdDogIHZUYXNrRGVsYXkgKCkgd2lsbAorICogY2F1c2UgYSB0YXNrIHRvIGJsb2NrIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0aWNrcyBmcm9tIHRoZSB0aW1lIHZUYXNrRGVsYXkgKCkgaXMKKyAqIGNhbGxlZC4gIEl0IGlzIHRoZXJlZm9yZSBkaWZmaWN1bHQgdG8gdXNlIHZUYXNrRGVsYXkgKCkgYnkgaXRzZWxmIHRvIGdlbmVyYXRlIGEgZml4ZWQKKyAqIGV4ZWN1dGlvbiBmcmVxdWVuY3kgYXMgdGhlIHRpbWUgYmV0d2VlbiBhIHRhc2sgc3RhcnRpbmcgdG8gZXhlY3V0ZSBhbmQgdGhhdCB0YXNrCisgKiBjYWxsaW5nIHZUYXNrRGVsYXkgKCkgbWF5IG5vdCBiZSBmaXhlZCBbdGhlIHRhc2sgbWF5IHRha2UgYSBkaWZmZXJlbnQgcGF0aCB0aG91Z2ggdGhlCisgKiBjb2RlIGJldHdlZW4gY2FsbHMsIG9yIG1heSBnZXQgaW50ZXJydXB0ZWQgb3IgcHJlZW1wdGVkIGEgZGlmZmVyZW50IG51bWJlciBvZiB0aW1lcworICogZWFjaCB0aW1lIGl0IGV4ZWN1dGVzXS4KKyAqCisgKiBXaGVyZWFzIHZUYXNrRGVsYXkgKCkgc3BlY2lmaWVzIGEgd2FrZSB0aW1lIHJlbGF0aXZlIHRvIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBmdW5jdGlvbgorICogaXMgY2FsbGVkLCB2VGFza0RlbGF5VW50aWwgKCkgc3BlY2lmaWVzIHRoZSBhYnNvbHV0ZSAoZXhhY3QpIHRpbWUgYXQgd2hpY2ggaXQgd2lzaGVzIHRvCisgKiB1bmJsb2NrLgorICoKKyAqIFRoZSBjb25zdGFudCBwb3J0VElDS19QRVJJT0RfTVMgY2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHJlYWwgdGltZSBmcm9tIHRoZSB0aWNrCisgKiByYXRlIC0gd2l0aCB0aGUgcmVzb2x1dGlvbiBvZiBvbmUgdGljayBwZXJpb2QuCisgKgorICogQHBhcmFtIHB4UHJldmlvdXNXYWtlVGltZSBQb2ludGVyIHRvIGEgdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgdGltZSBhdCB3aGljaCB0aGUKKyAqIHRhc2sgd2FzIGxhc3QgdW5ibG9ja2VkLiAgVGhlIHZhcmlhYmxlIG11c3QgYmUgaW5pdGlhbGlzZWQgd2l0aCB0aGUgY3VycmVudCB0aW1lCisgKiBwcmlvciB0byBpdHMgZmlyc3QgdXNlIChzZWUgdGhlIGV4YW1wbGUgYmVsb3cpLiAgRm9sbG93aW5nIHRoaXMgdGhlIHZhcmlhYmxlIGlzCisgKiBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2l0aGluIHZUYXNrRGVsYXlVbnRpbCAoKS4KKyAqCisgKiBAcGFyYW0geFRpbWVJbmNyZW1lbnQgVGhlIGN5Y2xlIHRpbWUgcGVyaW9kLiAgVGhlIHRhc2sgd2lsbCBiZSB1bmJsb2NrZWQgYXQKKyAqIHRpbWUgKnB4UHJldmlvdXNXYWtlVGltZSArIHhUaW1lSW5jcmVtZW50LiAgQ2FsbGluZyB2VGFza0RlbGF5VW50aWwgd2l0aCB0aGUKKyAqIHNhbWUgeFRpbWVJbmNyZW1lbnQgcGFyYW1ldGVyIHZhbHVlIHdpbGwgY2F1c2UgdGhlIHRhc2sgdG8gZXhlY3V0ZSB3aXRoCisgKiBhIGZpeGVkIGludGVyZmFjZSBwZXJpb2QuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+CisgLy8gUGVyZm9ybSBhbiBhY3Rpb24gZXZlcnkgMTAgdGlja3MuCisgdm9pZCB2VGFza0Z1bmN0aW9uKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisgVGlja1R5cGVfdCB4TGFzdFdha2VUaW1lOworIGNvbnN0IFRpY2tUeXBlX3QgeEZyZXF1ZW5jeSA9IDEwOworCisJIC8vIEluaXRpYWxpc2UgdGhlIHhMYXN0V2FrZVRpbWUgdmFyaWFibGUgd2l0aCB0aGUgY3VycmVudCB0aW1lLgorCSB4TGFzdFdha2VUaW1lID0geFRhc2tHZXRUaWNrQ291bnQgKCk7CisJIGZvciggOzsgKQorCSB7CisJCSAvLyBXYWl0IGZvciB0aGUgbmV4dCBjeWNsZS4KKwkJIHZUYXNrRGVsYXlVbnRpbCggJnhMYXN0V2FrZVRpbWUsIHhGcmVxdWVuY3kgKTsKKworCQkgLy8gUGVyZm9ybSBhY3Rpb24gaGVyZS4KKwkgfQorIH0KKyAgIDwvcHJlPgorICogXGRlZmdyb3VwIHZUYXNrRGVsYXlVbnRpbCB2VGFza0RlbGF5VW50aWwKKyAqIFxpbmdyb3VwIFRhc2tDdHJsCisgKi8KK3ZvaWQgdlRhc2tEZWxheVVudGlsKCBUaWNrVHlwZV90ICogY29uc3QgcHhQcmV2aW91c1dha2VUaW1lLCBjb25zdCBUaWNrVHlwZV90IHhUaW1lSW5jcmVtZW50ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8cHJlPkJhc2VUeXBlX3QgeFRhc2tBYm9ydERlbGF5KCBUYXNrSGFuZGxlX3QgeFRhc2sgKTs8L3ByZT4KKyAqCisgKiBJTkNMVURFX3hUYXNrQWJvcnREZWxheSBtdXN0IGJlIGRlZmluZWQgYXMgMSBpbiBGcmVlUlRPU0NvbmZpZy5oIGZvciB0aGlzCisgKiBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUuCisgKgorICogQSB0YXNrIHdpbGwgZW50ZXIgdGhlIEJsb2NrZWQgc3RhdGUgd2hlbiBpdCBpcyB3YWl0aW5nIGZvciBhbiBldmVudC4gIFRoZQorICogZXZlbnQgaXQgaXMgd2FpdGluZyBmb3IgY2FuIGJlIGEgdGVtcG9yYWwgZXZlbnQgKHdhaXRpbmcgZm9yIGEgdGltZSksIHN1Y2gKKyAqIGFzIHdoZW4gdlRhc2tEZWxheSgpIGlzIGNhbGxlZCwgb3IgYW4gZXZlbnQgb24gYW4gb2JqZWN0LCBzdWNoIGFzIHdoZW4KKyAqIHhRdWV1ZVJlY2VpdmUoKSBvciB1bFRhc2tOb3RpZnlUYWtlKCkgaXMgY2FsbGVkLiAgSWYgdGhlIGhhbmRsZSBvZiBhIHRhc2sKKyAqIHRoYXQgaXMgaW4gdGhlIEJsb2NrZWQgc3RhdGUgaXMgdXNlZCBpbiBhIGNhbGwgdG8geFRhc2tBYm9ydERlbGF5KCkgdGhlbiB0aGUKKyAqIHRhc2sgd2lsbCBsZWF2ZSB0aGUgQmxvY2tlZCBzdGF0ZSwgYW5kIHJldHVybiBmcm9tIHdoaWNoZXZlciBmdW5jdGlvbiBjYWxsCisgKiBwbGFjZWQgdGhlIHRhc2sgaW50byB0aGUgQmxvY2tlZCBzdGF0ZS4KKyAqCisgKiBAcGFyYW0geFRhc2sgVGhlIGhhbmRsZSBvZiB0aGUgdGFzayB0byByZW1vdmUgZnJvbSB0aGUgQmxvY2tlZCBzdGF0ZS4KKyAqCisgKiBAcmV0dXJuIElmIHRoZSB0YXNrIHJlZmVyZW5jZWQgYnkgeFRhc2sgd2FzIG5vdCBpbiB0aGUgQmxvY2tlZCBzdGF0ZSB0aGVuCisgKiBwZEZBSUwgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgcGRQQVNTIGlzIHJldHVybmVkLgorICoKKyAqIFxkZWZncm91cCB4VGFza0Fib3J0RGVsYXkgeFRhc2tBYm9ydERlbGF5CisgKiBcaW5ncm91cCBUYXNrQ3RybAorICovCitCYXNlVHlwZV90IHhUYXNrQWJvcnREZWxheSggVGFza0hhbmRsZV90IHhUYXNrICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8cHJlPlVCYXNlVHlwZV90IHV4VGFza1ByaW9yaXR5R2V0KCBUYXNrSGFuZGxlX3QgeFRhc2sgKTs8L3ByZT4KKyAqCisgKiBJTkNMVURFX3V4VGFza1ByaW9yaXR5R2V0IG11c3QgYmUgZGVmaW5lZCBhcyAxIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGF2YWlsYWJsZS4KKyAqIFNlZSB0aGUgY29uZmlndXJhdGlvbiBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIE9idGFpbiB0aGUgcHJpb3JpdHkgb2YgYW55IHRhc2suCisgKgorICogQHBhcmFtIHhUYXNrIEhhbmRsZSBvZiB0aGUgdGFzayB0byBiZSBxdWVyaWVkLiAgUGFzc2luZyBhIE5VTEwKKyAqIGhhbmRsZSByZXN1bHRzIGluIHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGluZyB0YXNrIGJlaW5nIHJldHVybmVkLgorICoKKyAqIEByZXR1cm4gVGhlIHByaW9yaXR5IG9mIHhUYXNrLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIHZvaWQgdkFGdW5jdGlvbiggdm9pZCApCisgeworIFRhc2tIYW5kbGVfdCB4SGFuZGxlOworCisJIC8vIENyZWF0ZSBhIHRhc2ssIHN0b3JpbmcgdGhlIGhhbmRsZS4KKwkgeFRhc2tDcmVhdGUoIHZUYXNrQ29kZSwgIk5BTUUiLCBTVEFDS19TSVpFLCBOVUxMLCB0c2tJRExFX1BSSU9SSVRZLCAmeEhhbmRsZSApOworCisJIC8vIC4uLgorCisJIC8vIFVzZSB0aGUgaGFuZGxlIHRvIG9idGFpbiB0aGUgcHJpb3JpdHkgb2YgdGhlIGNyZWF0ZWQgdGFzay4KKwkgLy8gSXQgd2FzIGNyZWF0ZWQgd2l0aCB0c2tJRExFX1BSSU9SSVRZLCBidXQgbWF5IGhhdmUgY2hhbmdlZAorCSAvLyBpdCBpdHNlbGYuCisJIGlmKCB1eFRhc2tQcmlvcml0eUdldCggeEhhbmRsZSApICE9IHRza0lETEVfUFJJT1JJVFkgKQorCSB7CisJCSAvLyBUaGUgdGFzayBoYXMgY2hhbmdlZCBpdCdzIHByaW9yaXR5LgorCSB9CisKKwkgLy8gLi4uCisKKwkgLy8gSXMgb3VyIHByaW9yaXR5IGhpZ2hlciB0aGFuIHRoZSBjcmVhdGVkIHRhc2s/CisJIGlmKCB1eFRhc2tQcmlvcml0eUdldCggeEhhbmRsZSApIDwgdXhUYXNrUHJpb3JpdHlHZXQoIE5VTEwgKSApCisJIHsKKwkJIC8vIE91ciBwcmlvcml0eSAob2J0YWluZWQgdXNpbmcgTlVMTCBoYW5kbGUpIGlzIGhpZ2hlci4KKwkgfQorIH0KKyAgIDwvcHJlPgorICogXGRlZmdyb3VwIHV4VGFza1ByaW9yaXR5R2V0IHV4VGFza1ByaW9yaXR5R2V0CisgKiBcaW5ncm91cCBUYXNrQ3RybAorICovCitVQmFzZVR5cGVfdCB1eFRhc2tQcmlvcml0eUdldCggVGFza0hhbmRsZV90IHhUYXNrICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8cHJlPlVCYXNlVHlwZV90IHV4VGFza1ByaW9yaXR5R2V0RnJvbUlTUiggVGFza0hhbmRsZV90IHhUYXNrICk7PC9wcmU+CisgKgorICogQSB2ZXJzaW9uIG9mIHV4VGFza1ByaW9yaXR5R2V0KCkgdGhhdCBjYW4gYmUgdXNlZCBmcm9tIGFuIElTUi4KKyAqLworVUJhc2VUeXBlX3QgdXhUYXNrUHJpb3JpdHlHZXRGcm9tSVNSKCBUYXNrSGFuZGxlX3QgeFRhc2sgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHRhc2suIGgKKyAqIDxwcmU+ZVRhc2tTdGF0ZSBlVGFza0dldFN0YXRlKCBUYXNrSGFuZGxlX3QgeFRhc2sgKTs8L3ByZT4KKyAqCisgKiBJTkNMVURFX2VUYXNrR2V0U3RhdGUgbXVzdCBiZSBkZWZpbmVkIGFzIDEgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlLgorICogU2VlIHRoZSBjb25maWd1cmF0aW9uIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogT2J0YWluIHRoZSBzdGF0ZSBvZiBhbnkgdGFzay4gIFN0YXRlcyBhcmUgZW5jb2RlZCBieSB0aGUgZVRhc2tTdGF0ZQorICogZW51bWVyYXRlZCB0eXBlLgorICoKKyAqIEBwYXJhbSB4VGFzayBIYW5kbGUgb2YgdGhlIHRhc2sgdG8gYmUgcXVlcmllZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBzdGF0ZSBvZiB4VGFzayBhdCB0aGUgdGltZSB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZC4gIE5vdGUgdGhlCisgKiBzdGF0ZSBvZiB0aGUgdGFzayBtaWdodCBjaGFuZ2UgYmV0d2VlbiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLCBhbmQgdGhlCisgKiBmdW5jdGlvbnMgcmV0dXJuIHZhbHVlIGJlaW5nIHRlc3RlZCBieSB0aGUgY2FsbGluZyB0YXNrLgorICovCitlVGFza1N0YXRlIGVUYXNrR2V0U3RhdGUoIFRhc2tIYW5kbGVfdCB4VGFzayApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogdGFzay4gaAorICogPHByZT52b2lkIHZUYXNrR2V0SW5mbyggVGFza0hhbmRsZV90IHhUYXNrLCBUYXNrU3RhdHVzX3QgKnB4VGFza1N0YXR1cywgQmFzZVR5cGVfdCB4R2V0RnJlZVN0YWNrU3BhY2UsIGVUYXNrU3RhdGUgZVN0YXRlICk7PC9wcmU+CisgKgorICogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZIG11c3QgYmUgZGVmaW5lZCBhcyAxIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlCisgKiBhdmFpbGFibGUuICBTZWUgdGhlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBQb3B1bGF0ZXMgYSBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgYSB0YXNrLgorICoKKyAqIEBwYXJhbSB4VGFzayBIYW5kbGUgb2YgdGhlIHRhc2sgYmVpbmcgcXVlcmllZC4gIElmIHhUYXNrIGlzIE5VTEwgdGhlbgorICogaW5mb3JtYXRpb24gd2lsbCBiZSByZXR1cm5lZCBhYm91dCB0aGUgY2FsbGluZyB0YXNrLgorICoKKyAqIEBwYXJhbSBweFRhc2tTdGF0dXMgQSBwb2ludGVyIHRvIHRoZSBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlIHRoYXQgd2lsbCBiZQorICogZmlsbGVkIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhc2sgcmVmZXJlbmNlZCBieSB0aGUgaGFuZGxlIHBhc3NlZCB1c2luZworICogdGhlIHhUYXNrIHBhcmFtZXRlci4KKyAqCisgKiBAeEdldEZyZWVTdGFja1NwYWNlIFRoZSBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlIGNvbnRhaW5zIGEgbWVtYmVyIHRvIHJlcG9ydAorICogdGhlIHN0YWNrIGhpZ2ggd2F0ZXIgbWFyayBvZiB0aGUgdGFzayBiZWluZyBxdWVyaWVkLiAgQ2FsY3VsYXRpbmcgdGhlIHN0YWNrCisgKiBoaWdoIHdhdGVyIG1hcmsgdGFrZXMgYSByZWxhdGl2ZWx5IGxvbmcgdGltZSwgYW5kIGNhbiBtYWtlIHRoZSBzeXN0ZW0KKyAqIHRlbXBvcmFyaWx5IHVucmVzcG9uc2l2ZSAtIHNvIHRoZSB4R2V0RnJlZVN0YWNrU3BhY2UgcGFyYW1ldGVyIGlzIHByb3ZpZGVkIHRvCisgKiBhbGxvdyB0aGUgaGlnaCB3YXRlciBtYXJrIGNoZWNraW5nIHRvIGJlIHNraXBwZWQuICBUaGUgaGlnaCB3YXRlcm1hcmsgdmFsdWUKKyAqIHdpbGwgb25seSBiZSB3cml0dGVuIHRvIHRoZSBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlIGlmIHhHZXRGcmVlU3RhY2tTcGFjZSBpcworICogbm90IHNldCB0byBwZEZBTFNFOworICoKKyAqIEBwYXJhbSBlU3RhdGUgVGhlIFRhc2tTdGF0dXNfdCBzdHJ1Y3R1cmUgY29udGFpbnMgYSBtZW1iZXIgdG8gcmVwb3J0IHRoZQorICogc3RhdGUgb2YgdGhlIHRhc2sgYmVpbmcgcXVlcmllZC4gIE9idGFpbmluZyB0aGUgdGFzayBzdGF0ZSBpcyBub3QgYXMgZmFzdCBhcworICogYSBzaW1wbGUgYXNzaWdubWVudCAtIHNvIHRoZSBlU3RhdGUgcGFyYW1ldGVyIGlzIHByb3ZpZGVkIHRvIGFsbG93IHRoZSBzdGF0ZQorICogaW5mb3JtYXRpb24gdG8gYmUgb21pdHRlZCBmcm9tIHRoZSBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlLiAgVG8gb2J0YWluIHN0YXRlCisgKiBpbmZvcm1hdGlvbiB0aGVuIHNldCBlU3RhdGUgdG8gZUludmFsaWQgLSBvdGhlcndpc2UgdGhlIHZhbHVlIHBhc3NlZCBpbgorICogZVN0YXRlIHdpbGwgYmUgcmVwb3J0ZWQgYXMgdGhlIHRhc2sgc3RhdGUgaW4gdGhlIFRhc2tTdGF0dXNfdCBzdHJ1Y3R1cmUuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+Cisgdm9pZCB2QUZ1bmN0aW9uKCB2b2lkICkKKyB7CisgVGFza0hhbmRsZV90IHhIYW5kbGU7CisgVGFza1N0YXR1c190IHhUYXNrRGV0YWlsczsKKworICAgIC8vIE9idGFpbiB0aGUgaGFuZGxlIG9mIGEgdGFzayBmcm9tIGl0cyBuYW1lLgorICAgIHhIYW5kbGUgPSB4VGFza0dldEhhbmRsZSggIlRhc2tfTmFtZSIgKTsKKworICAgIC8vIENoZWNrIHRoZSBoYW5kbGUgaXMgbm90IE5VTEwuCisgICAgY29uZmlnQVNTRVJUKCB4SGFuZGxlICk7CisKKyAgICAvLyBVc2UgdGhlIGhhbmRsZSB0byBvYnRhaW4gZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFzay4KKyAgICB2VGFza0dldEluZm8oIHhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAmeFRhc2tEZXRhaWxzLAorICAgICAgICAgICAgICAgICAgcGRUUlVFLCAvLyBJbmNsdWRlIHRoZSBoaWdoIHdhdGVyIG1hcmsgaW4geFRhc2tEZXRhaWxzLgorICAgICAgICAgICAgICAgICAgZUludmFsaWQgKTsgLy8gSW5jbHVkZSB0aGUgdGFzayBzdGF0ZSBpbiB4VGFza0RldGFpbHMuCisgfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgdlRhc2tHZXRJbmZvIHZUYXNrR2V0SW5mbworICogXGluZ3JvdXAgVGFza0N0cmwKKyAqLwordm9pZCB2VGFza0dldEluZm8oIFRhc2tIYW5kbGVfdCB4VGFzaywgVGFza1N0YXR1c190ICpweFRhc2tTdGF0dXMsIEJhc2VUeXBlX3QgeEdldEZyZWVTdGFja1NwYWNlLCBlVGFza1N0YXRlIGVTdGF0ZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogdGFzay4gaAorICogPHByZT52b2lkIHZUYXNrUHJpb3JpdHlTZXQoIFRhc2tIYW5kbGVfdCB4VGFzaywgVUJhc2VUeXBlX3QgdXhOZXdQcmlvcml0eSApOzwvcHJlPgorICoKKyAqIElOQ0xVREVfdlRhc2tQcmlvcml0eVNldCBtdXN0IGJlIGRlZmluZWQgYXMgMSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUuCisgKiBTZWUgdGhlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBTZXQgdGhlIHByaW9yaXR5IG9mIGFueSB0YXNrLgorICoKKyAqIEEgY29udGV4dCBzd2l0Y2ggd2lsbCBvY2N1ciBiZWZvcmUgdGhlIGZ1bmN0aW9uIHJldHVybnMgaWYgdGhlIHByaW9yaXR5CisgKiBiZWluZyBzZXQgaXMgaGlnaGVyIHRoYW4gdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzay4KKyAqCisgKiBAcGFyYW0geFRhc2sgSGFuZGxlIHRvIHRoZSB0YXNrIGZvciB3aGljaCB0aGUgcHJpb3JpdHkgaXMgYmVpbmcgc2V0LgorICogUGFzc2luZyBhIE5VTEwgaGFuZGxlIHJlc3VsdHMgaW4gdGhlIHByaW9yaXR5IG9mIHRoZSBjYWxsaW5nIHRhc2sgYmVpbmcgc2V0LgorICoKKyAqIEBwYXJhbSB1eE5ld1ByaW9yaXR5IFRoZSBwcmlvcml0eSB0byB3aGljaCB0aGUgdGFzayB3aWxsIGJlIHNldC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKyB2b2lkIHZBRnVuY3Rpb24oIHZvaWQgKQorIHsKKyBUYXNrSGFuZGxlX3QgeEhhbmRsZTsKKworCSAvLyBDcmVhdGUgYSB0YXNrLCBzdG9yaW5nIHRoZSBoYW5kbGUuCisJIHhUYXNrQ3JlYXRlKCB2VGFza0NvZGUsICJOQU1FIiwgU1RBQ0tfU0laRSwgTlVMTCwgdHNrSURMRV9QUklPUklUWSwgJnhIYW5kbGUgKTsKKworCSAvLyAuLi4KKworCSAvLyBVc2UgdGhlIGhhbmRsZSB0byByYWlzZSB0aGUgcHJpb3JpdHkgb2YgdGhlIGNyZWF0ZWQgdGFzay4KKwkgdlRhc2tQcmlvcml0eVNldCggeEhhbmRsZSwgdHNrSURMRV9QUklPUklUWSArIDEgKTsKKworCSAvLyAuLi4KKworCSAvLyBVc2UgYSBOVUxMIGhhbmRsZSB0byByYWlzZSBvdXIgcHJpb3JpdHkgdG8gdGhlIHNhbWUgdmFsdWUuCisJIHZUYXNrUHJpb3JpdHlTZXQoIE5VTEwsIHRza0lETEVfUFJJT1JJVFkgKyAxICk7CisgfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgdlRhc2tQcmlvcml0eVNldCB2VGFza1ByaW9yaXR5U2V0CisgKiBcaW5ncm91cCBUYXNrQ3RybAorICovCit2b2lkIHZUYXNrUHJpb3JpdHlTZXQoIFRhc2tIYW5kbGVfdCB4VGFzaywgVUJhc2VUeXBlX3QgdXhOZXdQcmlvcml0eSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogdGFzay4gaAorICogPHByZT52b2lkIHZUYXNrU3VzcGVuZCggVGFza0hhbmRsZV90IHhUYXNrVG9TdXNwZW5kICk7PC9wcmU+CisgKgorICogSU5DTFVERV92VGFza1N1c3BlbmQgbXVzdCBiZSBkZWZpbmVkIGFzIDEgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlLgorICogU2VlIHRoZSBjb25maWd1cmF0aW9uIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogU3VzcGVuZCBhbnkgdGFzay4gIFdoZW4gc3VzcGVuZGVkIGEgdGFzayB3aWxsIG5ldmVyIGdldCBhbnkgbWljcm9jb250cm9sbGVyCisgKiBwcm9jZXNzaW5nIHRpbWUsIG5vIG1hdHRlciB3aGF0IGl0cyBwcmlvcml0eS4KKyAqCisgKiBDYWxscyB0byB2VGFza1N1c3BlbmQgYXJlIG5vdCBhY2N1bXVsYXRpdmUgLQorICogaS5lLiBjYWxsaW5nIHZUYXNrU3VzcGVuZCAoKSB0d2ljZSBvbiB0aGUgc2FtZSB0YXNrIHN0aWxsIG9ubHkgcmVxdWlyZXMgb25lCisgKiBjYWxsIHRvIHZUYXNrUmVzdW1lICgpIHRvIHJlYWR5IHRoZSBzdXNwZW5kZWQgdGFzay4KKyAqCisgKiBAcGFyYW0geFRhc2tUb1N1c3BlbmQgSGFuZGxlIHRvIHRoZSB0YXNrIGJlaW5nIHN1c3BlbmRlZC4gIFBhc3NpbmcgYSBOVUxMCisgKiBoYW5kbGUgd2lsbCBjYXVzZSB0aGUgY2FsbGluZyB0YXNrIHRvIGJlIHN1c3BlbmRlZC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICAgPHByZT4KKyB2b2lkIHZBRnVuY3Rpb24oIHZvaWQgKQorIHsKKyBUYXNrSGFuZGxlX3QgeEhhbmRsZTsKKworCSAvLyBDcmVhdGUgYSB0YXNrLCBzdG9yaW5nIHRoZSBoYW5kbGUuCisJIHhUYXNrQ3JlYXRlKCB2VGFza0NvZGUsICJOQU1FIiwgU1RBQ0tfU0laRSwgTlVMTCwgdHNrSURMRV9QUklPUklUWSwgJnhIYW5kbGUgKTsKKworCSAvLyAuLi4KKworCSAvLyBVc2UgdGhlIGhhbmRsZSB0byBzdXNwZW5kIHRoZSBjcmVhdGVkIHRhc2suCisJIHZUYXNrU3VzcGVuZCggeEhhbmRsZSApOworCisJIC8vIC4uLgorCisJIC8vIFRoZSBjcmVhdGVkIHRhc2sgd2lsbCBub3QgcnVuIGR1cmluZyB0aGlzIHBlcmlvZCwgdW5sZXNzCisJIC8vIGFub3RoZXIgdGFzayBjYWxscyB2VGFza1Jlc3VtZSggeEhhbmRsZSApLgorCisJIC8vLi4uCisKKworCSAvLyBTdXNwZW5kIG91cnNlbHZlcy4KKwkgdlRhc2tTdXNwZW5kKCBOVUxMICk7CisKKwkgLy8gV2UgY2Fubm90IGdldCBoZXJlIHVubGVzcyBhbm90aGVyIHRhc2sgY2FsbHMgdlRhc2tSZXN1bWUKKwkgLy8gd2l0aCBvdXIgaGFuZGxlIGFzIHRoZSBwYXJhbWV0ZXIuCisgfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgdlRhc2tTdXNwZW5kIHZUYXNrU3VzcGVuZAorICogXGluZ3JvdXAgVGFza0N0cmwKKyAqLwordm9pZCB2VGFza1N1c3BlbmQoIFRhc2tIYW5kbGVfdCB4VGFza1RvU3VzcGVuZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogdGFzay4gaAorICogPHByZT52b2lkIHZUYXNrUmVzdW1lKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1Jlc3VtZSApOzwvcHJlPgorICoKKyAqIElOQ0xVREVfdlRhc2tTdXNwZW5kIG11c3QgYmUgZGVmaW5lZCBhcyAxIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGF2YWlsYWJsZS4KKyAqIFNlZSB0aGUgY29uZmlndXJhdGlvbiBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFJlc3VtZXMgYSBzdXNwZW5kZWQgdGFzay4KKyAqCisgKiBBIHRhc2sgdGhhdCBoYXMgYmVlbiBzdXNwZW5kZWQgYnkgb25lIG9yIG1vcmUgY2FsbHMgdG8gdlRhc2tTdXNwZW5kICgpCisgKiB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGZvciBydW5uaW5nIGFnYWluIGJ5IGEgc2luZ2xlIGNhbGwgdG8KKyAqIHZUYXNrUmVzdW1lICgpLgorICoKKyAqIEBwYXJhbSB4VGFza1RvUmVzdW1lIEhhbmRsZSB0byB0aGUgdGFzayBiZWluZyByZWFkaWVkLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIHZvaWQgdkFGdW5jdGlvbiggdm9pZCApCisgeworIFRhc2tIYW5kbGVfdCB4SGFuZGxlOworCisJIC8vIENyZWF0ZSBhIHRhc2ssIHN0b3JpbmcgdGhlIGhhbmRsZS4KKwkgeFRhc2tDcmVhdGUoIHZUYXNrQ29kZSwgIk5BTUUiLCBTVEFDS19TSVpFLCBOVUxMLCB0c2tJRExFX1BSSU9SSVRZLCAmeEhhbmRsZSApOworCisJIC8vIC4uLgorCisJIC8vIFVzZSB0aGUgaGFuZGxlIHRvIHN1c3BlbmQgdGhlIGNyZWF0ZWQgdGFzay4KKwkgdlRhc2tTdXNwZW5kKCB4SGFuZGxlICk7CisKKwkgLy8gLi4uCisKKwkgLy8gVGhlIGNyZWF0ZWQgdGFzayB3aWxsIG5vdCBydW4gZHVyaW5nIHRoaXMgcGVyaW9kLCB1bmxlc3MKKwkgLy8gYW5vdGhlciB0YXNrIGNhbGxzIHZUYXNrUmVzdW1lKCB4SGFuZGxlICkuCisKKwkgLy8uLi4KKworCisJIC8vIFJlc3VtZSB0aGUgc3VzcGVuZGVkIHRhc2sgb3Vyc2VsdmVzLgorCSB2VGFza1Jlc3VtZSggeEhhbmRsZSApOworCisJIC8vIFRoZSBjcmVhdGVkIHRhc2sgd2lsbCBvbmNlIGFnYWluIGdldCBtaWNyb2NvbnRyb2xsZXIgcHJvY2Vzc2luZworCSAvLyB0aW1lIGluIGFjY29yZGFuY2Ugd2l0aCBpdHMgcHJpb3JpdHkgd2l0aGluIHRoZSBzeXN0ZW0uCisgfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgdlRhc2tSZXN1bWUgdlRhc2tSZXN1bWUKKyAqIFxpbmdyb3VwIFRhc2tDdHJsCisgKi8KK3ZvaWQgdlRhc2tSZXN1bWUoIFRhc2tIYW5kbGVfdCB4VGFza1RvUmVzdW1lICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8cHJlPnZvaWQgeFRhc2tSZXN1bWVGcm9tSVNSKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1Jlc3VtZSApOzwvcHJlPgorICoKKyAqIElOQ0xVREVfeFRhc2tSZXN1bWVGcm9tSVNSIG11c3QgYmUgZGVmaW5lZCBhcyAxIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlCisgKiBhdmFpbGFibGUuICBTZWUgdGhlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB2VGFza1Jlc3VtZSgpIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBJU1IuCisgKgorICogQSB0YXNrIHRoYXQgaGFzIGJlZW4gc3VzcGVuZGVkIGJ5IG9uZSBvciBtb3JlIGNhbGxzIHRvIHZUYXNrU3VzcGVuZCAoKQorICogd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBmb3IgcnVubmluZyBhZ2FpbiBieSBhIHNpbmdsZSBjYWxsIHRvCisgKiB4VGFza1Jlc3VtZUZyb21JU1IgKCkuCisgKgorICogeFRhc2tSZXN1bWVGcm9tSVNSKCkgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIHN5bmNocm9uaXNlIGEgdGFzayB3aXRoIGFuCisgKiBpbnRlcnJ1cHQgaWYgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCB0aGUgaW50ZXJydXB0IGNvdWxkIGFycml2ZSBwcmlvciB0byB0aGUKKyAqIHRhc2sgYmVpbmcgc3VzcGVuZGVkIC0gYXMgdGhpcyBjYW4gbGVhZCB0byBpbnRlcnJ1cHRzIGJlaW5nIG1pc3NlZC4gVXNlIG9mIGEKKyAqIHNlbWFwaG9yZSBhcyBhIHN5bmNocm9uaXNhdGlvbiBtZWNoYW5pc20gd291bGQgYXZvaWQgdGhpcyBldmVudHVhbGl0eS4KKyAqCisgKiBAcGFyYW0geFRhc2tUb1Jlc3VtZSBIYW5kbGUgdG8gdGhlIHRhc2sgYmVpbmcgcmVhZGllZC4KKyAqCisgKiBAcmV0dXJuIHBkVFJVRSBpZiByZXN1bWluZyB0aGUgdGFzayBzaG91bGQgcmVzdWx0IGluIGEgY29udGV4dCBzd2l0Y2gsCisgKiBvdGhlcndpc2UgcGRGQUxTRS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBJU1IgdG8gZGV0ZXJtaW5lIGlmIGEgY29udGV4dCBzd2l0Y2gKKyAqIG1heSBiZSByZXF1aXJlZCBmb2xsb3dpbmcgdGhlIElTUi4KKyAqCisgKiBcZGVmZ3JvdXAgdlRhc2tSZXN1bWVGcm9tSVNSIHZUYXNrUmVzdW1lRnJvbUlTUgorICogXGluZ3JvdXAgVGFza0N0cmwKKyAqLworQmFzZVR5cGVfdCB4VGFza1Jlc3VtZUZyb21JU1IoIFRhc2tIYW5kbGVfdCB4VGFza1RvUmVzdW1lICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU0NIRURVTEVSIENPTlRST0wKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogdGFzay4gaAorICogPHByZT52b2lkIHZUYXNrU3RhcnRTY2hlZHVsZXIoIHZvaWQgKTs8L3ByZT4KKyAqCisgKiBTdGFydHMgdGhlIHJlYWwgdGltZSBrZXJuZWwgdGljayBwcm9jZXNzaW5nLiAgQWZ0ZXIgY2FsbGluZyB0aGUga2VybmVsCisgKiBoYXMgY29udHJvbCBvdmVyIHdoaWNoIHRhc2tzIGFyZSBleGVjdXRlZCBhbmQgd2hlbi4KKyAqCisgKiBTZWUgdGhlIGRlbW8gYXBwbGljYXRpb24gZmlsZSBtYWluLmMgZm9yIGFuIGV4YW1wbGUgb2YgY3JlYXRpbmcKKyAqIHRhc2tzIGFuZCBzdGFydGluZyB0aGUga2VybmVsLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIHZvaWQgdkFGdW5jdGlvbiggdm9pZCApCisgeworCSAvLyBDcmVhdGUgYXQgbGVhc3Qgb25lIHRhc2sgYmVmb3JlIHN0YXJ0aW5nIHRoZSBrZXJuZWwuCisJIHhUYXNrQ3JlYXRlKCB2VGFza0NvZGUsICJOQU1FIiwgU1RBQ0tfU0laRSwgTlVMTCwgdHNrSURMRV9QUklPUklUWSwgTlVMTCApOworCisJIC8vIFN0YXJ0IHRoZSByZWFsIHRpbWUga2VybmVsIHdpdGggcHJlZW1wdGlvbi4KKwkgdlRhc2tTdGFydFNjaGVkdWxlciAoKTsKKworCSAvLyBXaWxsIG5vdCBnZXQgaGVyZSB1bmxlc3MgYSB0YXNrIGNhbGxzIHZUYXNrRW5kU2NoZWR1bGVyICgpCisgfQorICAgPC9wcmU+CisgKgorICogXGRlZmdyb3VwIHZUYXNrU3RhcnRTY2hlZHVsZXIgdlRhc2tTdGFydFNjaGVkdWxlcgorICogXGluZ3JvdXAgU2NoZWR1bGVyQ29udHJvbAorICovCit2b2lkIHZUYXNrU3RhcnRTY2hlZHVsZXIoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHRhc2suIGgKKyAqIDxwcmU+dm9pZCB2VGFza0VuZFNjaGVkdWxlciggdm9pZCApOzwvcHJlPgorICoKKyAqIE5PVEU6ICBBdCB0aGUgdGltZSBvZiB3cml0aW5nIG9ubHkgdGhlIHg4NiByZWFsIG1vZGUgcG9ydCwgd2hpY2ggcnVucyBvbiBhIFBDCisgKiBpbiBwbGFjZSBvZiBET1MsIGltcGxlbWVudHMgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBTdG9wcyB0aGUgcmVhbCB0aW1lIGtlcm5lbCB0aWNrLiAgQWxsIGNyZWF0ZWQgdGFza3Mgd2lsbCBiZSBhdXRvbWF0aWNhbGx5CisgKiBkZWxldGVkIGFuZCBtdWx0aXRhc2tpbmcgKGVpdGhlciBwcmVlbXB0aXZlIG9yIGNvb3BlcmF0aXZlKSB3aWxsCisgKiBzdG9wLiAgRXhlY3V0aW9uIHRoZW4gcmVzdW1lcyBmcm9tIHRoZSBwb2ludCB3aGVyZSB2VGFza1N0YXJ0U2NoZWR1bGVyICgpCisgKiB3YXMgY2FsbGVkLCBhcyBpZiB2VGFza1N0YXJ0U2NoZWR1bGVyICgpIGhhZCBqdXN0IHJldHVybmVkLgorICoKKyAqIFNlZSB0aGUgZGVtbyBhcHBsaWNhdGlvbiBmaWxlIG1haW4uIGMgaW4gdGhlIGRlbW8vUEMgZGlyZWN0b3J5IGZvciBhbgorICogZXhhbXBsZSB0aGF0IHVzZXMgdlRhc2tFbmRTY2hlZHVsZXIgKCkuCisgKgorICogdlRhc2tFbmRTY2hlZHVsZXIgKCkgcmVxdWlyZXMgYW4gZXhpdCBmdW5jdGlvbiB0byBiZSBkZWZpbmVkIHdpdGhpbiB0aGUKKyAqIHBvcnRhYmxlIGxheWVyIChzZWUgdlBvcnRFbmRTY2hlZHVsZXIgKCkgaW4gcG9ydC4gYyBmb3IgdGhlIFBDIHBvcnQpLiAgVGhpcworICogcGVyZm9ybXMgaGFyZHdhcmUgc3BlY2lmaWMgb3BlcmF0aW9ucyBzdWNoIGFzIHN0b3BwaW5nIHRoZSBrZXJuZWwgdGljay4KKyAqCisgKiB2VGFza0VuZFNjaGVkdWxlciAoKSB3aWxsIGNhdXNlIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUKKyAqIGtlcm5lbCB0byBiZSBmcmVlZCAtIGJ1dCB3aWxsIG5vdCBmcmVlIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgYXBwbGljYXRpb24KKyAqIHRhc2tzLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorIHZvaWQgdlRhc2tDb2RlKCB2b2lkICogcHZQYXJhbWV0ZXJzICkKKyB7CisJIGZvciggOzsgKQorCSB7CisJCSAvLyBUYXNrIGNvZGUgZ29lcyBoZXJlLgorCisJCSAvLyBBdCBzb21lIHBvaW50IHdlIHdhbnQgdG8gZW5kIHRoZSByZWFsIHRpbWUga2VybmVsIHByb2Nlc3NpbmcKKwkJIC8vIHNvIGNhbGwgLi4uCisJCSB2VGFza0VuZFNjaGVkdWxlciAoKTsKKwkgfQorIH0KKworIHZvaWQgdkFGdW5jdGlvbiggdm9pZCApCisgeworCSAvLyBDcmVhdGUgYXQgbGVhc3Qgb25lIHRhc2sgYmVmb3JlIHN0YXJ0aW5nIHRoZSBrZXJuZWwuCisJIHhUYXNrQ3JlYXRlKCB2VGFza0NvZGUsICJOQU1FIiwgU1RBQ0tfU0laRSwgTlVMTCwgdHNrSURMRV9QUklPUklUWSwgTlVMTCApOworCisJIC8vIFN0YXJ0IHRoZSByZWFsIHRpbWUga2VybmVsIHdpdGggcHJlZW1wdGlvbi4KKwkgdlRhc2tTdGFydFNjaGVkdWxlciAoKTsKKworCSAvLyBXaWxsIG9ubHkgZ2V0IGhlcmUgd2hlbiB0aGUgdlRhc2tDb2RlICgpIHRhc2sgaGFzIGNhbGxlZAorCSAvLyB2VGFza0VuZFNjaGVkdWxlciAoKS4gIFdoZW4gd2UgZ2V0IGhlcmUgd2UgYXJlIGJhY2sgdG8gc2luZ2xlIHRhc2sKKwkgLy8gZXhlY3V0aW9uLgorIH0KKyAgIDwvcHJlPgorICoKKyAqIFxkZWZncm91cCB2VGFza0VuZFNjaGVkdWxlciB2VGFza0VuZFNjaGVkdWxlcgorICogXGluZ3JvdXAgU2NoZWR1bGVyQ29udHJvbAorICovCit2b2lkIHZUYXNrRW5kU2NoZWR1bGVyKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8cHJlPnZvaWQgdlRhc2tTdXNwZW5kQWxsKCB2b2lkICk7PC9wcmU+CisgKgorICogU3VzcGVuZHMgdGhlIHNjaGVkdWxlciB3aXRob3V0IGRpc2FibGluZyBpbnRlcnJ1cHRzLiAgQ29udGV4dCBzd2l0Y2hlcyB3aWxsCisgKiBub3Qgb2NjdXIgd2hpbGUgdGhlIHNjaGVkdWxlciBpcyBzdXNwZW5kZWQuCisgKgorICogQWZ0ZXIgY2FsbGluZyB2VGFza1N1c3BlbmRBbGwgKCkgdGhlIGNhbGxpbmcgdGFzayB3aWxsIGNvbnRpbnVlIHRvIGV4ZWN1dGUKKyAqIHdpdGhvdXQgcmlzayBvZiBiZWluZyBzd2FwcGVkIG91dCB1bnRpbCBhIGNhbGwgdG8geFRhc2tSZXN1bWVBbGwgKCkgaGFzIGJlZW4KKyAqIG1hZGUuCisgKgorICogQVBJIGZ1bmN0aW9ucyB0aGF0IGhhdmUgdGhlIHBvdGVudGlhbCB0byBjYXVzZSBhIGNvbnRleHQgc3dpdGNoIChmb3IgZXhhbXBsZSwKKyAqIHZUYXNrRGVsYXlVbnRpbCgpLCB4UXVldWVTZW5kKCksIGV0Yy4pIG11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZSB0aGUgc2NoZWR1bGVyCisgKiBpcyBzdXNwZW5kZWQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+Cisgdm9pZCB2VGFzazEoIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorIHsKKwkgZm9yKCA7OyApCisJIHsKKwkJIC8vIFRhc2sgY29kZSBnb2VzIGhlcmUuCisKKwkJIC8vIC4uLgorCisJCSAvLyBBdCBzb21lIHBvaW50IHRoZSB0YXNrIHdhbnRzIHRvIHBlcmZvcm0gYSBsb25nIG9wZXJhdGlvbiBkdXJpbmcKKwkJIC8vIHdoaWNoIGl0IGRvZXMgbm90IHdhbnQgdG8gZ2V0IHN3YXBwZWQgb3V0LiAgSXQgY2Fubm90IHVzZQorCQkgLy8gdGFza0VOVEVSX0NSSVRJQ0FMICgpL3Rhc2tFWElUX0NSSVRJQ0FMICgpIGFzIHRoZSBsZW5ndGggb2YgdGhlCisJCSAvLyBvcGVyYXRpb24gbWF5IGNhdXNlIGludGVycnVwdHMgdG8gYmUgbWlzc2VkIC0gaW5jbHVkaW5nIHRoZQorCQkgLy8gdGlja3MuCisKKwkJIC8vIFByZXZlbnQgdGhlIHJlYWwgdGltZSBrZXJuZWwgc3dhcHBpbmcgb3V0IHRoZSB0YXNrLgorCQkgdlRhc2tTdXNwZW5kQWxsICgpOworCisJCSAvLyBQZXJmb3JtIHRoZSBvcGVyYXRpb24gaGVyZS4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGNyaXRpY2FsCisJCSAvLyBzZWN0aW9ucyBhcyB3ZSBoYXZlIGFsbCB0aGUgbWljcm9jb250cm9sbGVyIHByb2Nlc3NpbmcgdGltZS4KKwkJIC8vIER1cmluZyB0aGlzIHRpbWUgaW50ZXJydXB0cyB3aWxsIHN0aWxsIG9wZXJhdGUgYW5kIHRoZSBrZXJuZWwKKwkJIC8vIHRpY2sgY291bnQgd2lsbCBiZSBtYWludGFpbmVkLgorCisJCSAvLyAuLi4KKworCQkgLy8gVGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gIFJlc3RhcnQgdGhlIGtlcm5lbC4KKwkJIHhUYXNrUmVzdW1lQWxsICgpOworCSB9CisgfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgdlRhc2tTdXNwZW5kQWxsIHZUYXNrU3VzcGVuZEFsbAorICogXGluZ3JvdXAgU2NoZWR1bGVyQ29udHJvbAorICovCit2b2lkIHZUYXNrU3VzcGVuZEFsbCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogdGFzay4gaAorICogPHByZT5CYXNlVHlwZV90IHhUYXNrUmVzdW1lQWxsKCB2b2lkICk7PC9wcmU+CisgKgorICogUmVzdW1lcyBzY2hlZHVsZXIgYWN0aXZpdHkgYWZ0ZXIgaXQgd2FzIHN1c3BlbmRlZCBieSBhIGNhbGwgdG8KKyAqIHZUYXNrU3VzcGVuZEFsbCgpLgorICoKKyAqIHhUYXNrUmVzdW1lQWxsKCkgb25seSByZXN1bWVzIHRoZSBzY2hlZHVsZXIuICBJdCBkb2VzIG5vdCB1bnN1c3BlbmQgdGFza3MKKyAqIHRoYXQgd2VyZSBwcmV2aW91c2x5IHN1c3BlbmRlZCBieSBhIGNhbGwgdG8gdlRhc2tTdXNwZW5kKCkuCisgKgorICogQHJldHVybiBJZiByZXN1bWluZyB0aGUgc2NoZWR1bGVyIGNhdXNlZCBhIGNvbnRleHQgc3dpdGNoIHRoZW4gcGRUUlVFIGlzCisgKgkJICByZXR1cm5lZCwgb3RoZXJ3aXNlIHBkRkFMU0UgaXMgcmV0dXJuZWQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAgIDxwcmU+Cisgdm9pZCB2VGFzazEoIHZvaWQgKiBwdlBhcmFtZXRlcnMgKQorIHsKKwkgZm9yKCA7OyApCisJIHsKKwkJIC8vIFRhc2sgY29kZSBnb2VzIGhlcmUuCisKKwkJIC8vIC4uLgorCisJCSAvLyBBdCBzb21lIHBvaW50IHRoZSB0YXNrIHdhbnRzIHRvIHBlcmZvcm0gYSBsb25nIG9wZXJhdGlvbiBkdXJpbmcKKwkJIC8vIHdoaWNoIGl0IGRvZXMgbm90IHdhbnQgdG8gZ2V0IHN3YXBwZWQgb3V0LiAgSXQgY2Fubm90IHVzZQorCQkgLy8gdGFza0VOVEVSX0NSSVRJQ0FMICgpL3Rhc2tFWElUX0NSSVRJQ0FMICgpIGFzIHRoZSBsZW5ndGggb2YgdGhlCisJCSAvLyBvcGVyYXRpb24gbWF5IGNhdXNlIGludGVycnVwdHMgdG8gYmUgbWlzc2VkIC0gaW5jbHVkaW5nIHRoZQorCQkgLy8gdGlja3MuCisKKwkJIC8vIFByZXZlbnQgdGhlIHJlYWwgdGltZSBrZXJuZWwgc3dhcHBpbmcgb3V0IHRoZSB0YXNrLgorCQkgdlRhc2tTdXNwZW5kQWxsICgpOworCisJCSAvLyBQZXJmb3JtIHRoZSBvcGVyYXRpb24gaGVyZS4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGNyaXRpY2FsCisJCSAvLyBzZWN0aW9ucyBhcyB3ZSBoYXZlIGFsbCB0aGUgbWljcm9jb250cm9sbGVyIHByb2Nlc3NpbmcgdGltZS4KKwkJIC8vIER1cmluZyB0aGlzIHRpbWUgaW50ZXJydXB0cyB3aWxsIHN0aWxsIG9wZXJhdGUgYW5kIHRoZSByZWFsCisJCSAvLyB0aW1lIGtlcm5lbCB0aWNrIGNvdW50IHdpbGwgYmUgbWFpbnRhaW5lZC4KKworCQkgLy8gLi4uCisKKwkJIC8vIFRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuICBSZXN0YXJ0IHRoZSBrZXJuZWwuICBXZSB3YW50IHRvIGZvcmNlCisJCSAvLyBhIGNvbnRleHQgc3dpdGNoIC0gYnV0IHRoZXJlIGlzIG5vIHBvaW50IGlmIHJlc3VtaW5nIHRoZSBzY2hlZHVsZXIKKwkJIC8vIGNhdXNlZCBhIGNvbnRleHQgc3dpdGNoIGFscmVhZHkuCisJCSBpZiggIXhUYXNrUmVzdW1lQWxsICgpICkKKwkJIHsKKwkJCSAgdGFza1lJRUxEICgpOworCQkgfQorCSB9CisgfQorICAgPC9wcmU+CisgKiBcZGVmZ3JvdXAgeFRhc2tSZXN1bWVBbGwgeFRhc2tSZXN1bWVBbGwKKyAqIFxpbmdyb3VwIFNjaGVkdWxlckNvbnRyb2wKKyAqLworQmFzZVR5cGVfdCB4VGFza1Jlc3VtZUFsbCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRBU0sgVVRJTElUSUVTCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIHRhc2suIGgKKyAqIDxQUkU+VGlja1R5cGVfdCB4VGFza0dldFRpY2tDb3VudCggdm9pZCApOzwvUFJFPgorICoKKyAqIEByZXR1cm4gVGhlIGNvdW50IG9mIHRpY2tzIHNpbmNlIHZUYXNrU3RhcnRTY2hlZHVsZXIgd2FzIGNhbGxlZC4KKyAqCisgKiBcZGVmZ3JvdXAgeFRhc2tHZXRUaWNrQ291bnQgeFRhc2tHZXRUaWNrQ291bnQKKyAqIFxpbmdyb3VwIFRhc2tVdGlscworICovCitUaWNrVHlwZV90IHhUYXNrR2V0VGlja0NvdW50KCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8UFJFPlRpY2tUeXBlX3QgeFRhc2tHZXRUaWNrQ291bnRGcm9tSVNSKCB2b2lkICk7PC9QUkU+CisgKgorICogQHJldHVybiBUaGUgY291bnQgb2YgdGlja3Mgc2luY2UgdlRhc2tTdGFydFNjaGVkdWxlciB3YXMgY2FsbGVkLgorICoKKyAqIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIHhUYXNrR2V0VGlja0NvdW50KCkgdGhhdCBpcyBzYWZlIHRvIGJlIGNhbGxlZCBmcm9tIGFuCisgKiBJU1IgLSBwcm92aWRlZCB0aGF0IFRpY2tUeXBlX3QgaXMgdGhlIG5hdHVyYWwgd29yZCBzaXplIG9mIHRoZQorICogbWljcm9jb250cm9sbGVyIGJlaW5nIHVzZWQgb3IgaW50ZXJydXB0IG5lc3RpbmcgaXMgZWl0aGVyIG5vdCBzdXBwb3J0ZWQgb3IKKyAqIG5vdCBiZWluZyB1c2VkLgorICoKKyAqIFxkZWZncm91cCB4VGFza0dldFRpY2tDb3VudEZyb21JU1IgeFRhc2tHZXRUaWNrQ291bnRGcm9tSVNSCisgKiBcaW5ncm91cCBUYXNrVXRpbHMKKyAqLworVGlja1R5cGVfdCB4VGFza0dldFRpY2tDb3VudEZyb21JU1IoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHRhc2suIGgKKyAqIDxQUkU+dWludDE2X3QgdXhUYXNrR2V0TnVtYmVyT2ZUYXNrcyggdm9pZCApOzwvUFJFPgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0YXNrcyB0aGF0IHRoZSByZWFsIHRpbWUga2VybmVsIGlzIGN1cnJlbnRseSBtYW5hZ2luZy4KKyAqIFRoaXMgaW5jbHVkZXMgYWxsIHJlYWR5LCBibG9ja2VkIGFuZCBzdXNwZW5kZWQgdGFza3MuICBBIHRhc2sgdGhhdAorICogaGFzIGJlZW4gZGVsZXRlZCBidXQgbm90IHlldCBmcmVlZCBieSB0aGUgaWRsZSB0YXNrIHdpbGwgYWxzbyBiZQorICogaW5jbHVkZWQgaW4gdGhlIGNvdW50LgorICoKKyAqIFxkZWZncm91cCB1eFRhc2tHZXROdW1iZXJPZlRhc2tzIHV4VGFza0dldE51bWJlck9mVGFza3MKKyAqIFxpbmdyb3VwIFRhc2tVdGlscworICovCitVQmFzZVR5cGVfdCB1eFRhc2tHZXROdW1iZXJPZlRhc2tzKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8UFJFPmNoYXIgKnBjVGFza0dldE5hbWUoIFRhc2tIYW5kbGVfdCB4VGFza1RvUXVlcnkgKTs8L1BSRT4KKyAqCisgKiBAcmV0dXJuIFRoZSB0ZXh0IChodW1hbiByZWFkYWJsZSkgbmFtZSBvZiB0aGUgdGFzayByZWZlcmVuY2VkIGJ5IHRoZSBoYW5kbGUKKyAqIHhUYXNrVG9RdWVyeS4gIEEgdGFzayBjYW4gcXVlcnkgaXRzIG93biBuYW1lIGJ5IGVpdGhlciBwYXNzaW5nIGluIGl0cyBvd24KKyAqIGhhbmRsZSwgb3IgYnkgc2V0dGluZyB4VGFza1RvUXVlcnkgdG8gTlVMTC4KKyAqCisgKiBcZGVmZ3JvdXAgcGNUYXNrR2V0TmFtZSBwY1Rhc2tHZXROYW1lCisgKiBcaW5ncm91cCBUYXNrVXRpbHMKKyAqLworY2hhciAqcGNUYXNrR2V0TmFtZSggVGFza0hhbmRsZV90IHhUYXNrVG9RdWVyeSApIFBSSVZJTEVHRURfRlVOQ1RJT047IC8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworCisvKioKKyAqIHRhc2suIGgKKyAqIDxQUkU+VGFza0hhbmRsZV90IHhUYXNrR2V0SGFuZGxlKCBjb25zdCBjaGFyICpwY05hbWVUb1F1ZXJ5ICk7PC9QUkU+CisgKgorICogTk9URTogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSByZWxhdGl2ZWx5IGxvbmcgdGltZSB0byBjb21wbGV0ZSBhbmQgc2hvdWxkIGJlCisgKiB1c2VkIHNwYXJpbmdseS4KKyAqCisgKiBAcmV0dXJuIFRoZSBoYW5kbGUgb2YgdGhlIHRhc2sgdGhhdCBoYXMgdGhlIGh1bWFuIHJlYWRhYmxlIG5hbWUgcGNOYW1lVG9RdWVyeS4KKyAqIE5VTEwgaXMgcmV0dXJuZWQgaWYgbm8gbWF0Y2hpbmcgbmFtZSBpcyBmb3VuZC4gIElOQ0xVREVfeFRhc2tHZXRIYW5kbGUKKyAqIG11c3QgYmUgc2V0IHRvIDEgaW4gRnJlZVJUT1NDb25maWcuaCBmb3IgcGNUYXNrR2V0SGFuZGxlKCkgdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIFxkZWZncm91cCBwY1Rhc2tHZXRIYW5kbGUgcGNUYXNrR2V0SGFuZGxlCisgKiBcaW5ncm91cCBUYXNrVXRpbHMKKyAqLworVGFza0hhbmRsZV90IHhUYXNrR2V0SGFuZGxlKCBjb25zdCBjaGFyICpwY05hbWVUb1F1ZXJ5ICkgUFJJVklMRUdFRF9GVU5DVElPTjsgLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisKKy8qKgorICogdGFzay5oCisgKiA8UFJFPlVCYXNlVHlwZV90IHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayggVGFza0hhbmRsZV90IHhUYXNrICk7PC9QUkU+CisgKgorICogSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgbXVzdCBiZSBzZXQgdG8gMSBpbiBGcmVlUlRPU0NvbmZpZy5oIGZvcgorICogdGhpcyBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUuCisgKgorICogUmV0dXJucyB0aGUgaGlnaCB3YXRlciBtYXJrIG9mIHRoZSBzdGFjayBhc3NvY2lhdGVkIHdpdGggeFRhc2suICBUaGF0IGlzLAorICogdGhlIG1pbmltdW0gZnJlZSBzdGFjayBzcGFjZSB0aGVyZSBoYXMgYmVlbiAoaW4gd29yZHMsIHNvIG9uIGEgMzIgYml0IG1hY2hpbmUKKyAqIGEgdmFsdWUgb2YgMSBtZWFucyA0IGJ5dGVzKSBzaW5jZSB0aGUgdGFzayBzdGFydGVkLiAgVGhlIHNtYWxsZXIgdGhlIHJldHVybmVkCisgKiBudW1iZXIgdGhlIGNsb3NlciB0aGUgdGFzayBoYXMgY29tZSB0byBvdmVyZmxvd2luZyBpdHMgc3RhY2suCisgKgorICogQHBhcmFtIHhUYXNrIEhhbmRsZSBvZiB0aGUgdGFzayBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YWNrIHRvIGJlIGNoZWNrZWQuCisgKiBTZXQgeFRhc2sgdG8gTlVMTCB0byBjaGVjayB0aGUgc3RhY2sgb2YgdGhlIGNhbGxpbmcgdGFzay4KKyAqCisgKiBAcmV0dXJuIFRoZSBzbWFsbGVzdCBhbW91bnQgb2YgZnJlZSBzdGFjayBzcGFjZSB0aGVyZSBoYXMgYmVlbiAoaW4gd29yZHMsIHNvCisgKiBhY3R1YWwgc3BhY2VzIG9uIHRoZSBzdGFjayByYXRoZXIgdGhhbiBieXRlcykgc2luY2UgdGhlIHRhc2sgcmVmZXJlbmNlZCBieQorICogeFRhc2sgd2FzIGNyZWF0ZWQuCisgKi8KK1VCYXNlVHlwZV90IHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayggVGFza0hhbmRsZV90IHhUYXNrICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyogV2hlbiB1c2luZyB0cmFjZSBtYWNyb3MgaXQgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byBpbmNsdWRlIHRhc2suaCBiZWZvcmUKK0ZyZWVSVE9TLmguICBXaGVuIHRoaXMgaXMgZG9uZSBUYXNrSG9va0Z1bmN0aW9uX3Qgd2lsbCBub3QgeWV0IGhhdmUgYmVlbiBkZWZpbmVkLAorc28gdGhlIGZvbGxvd2luZyB0d28gcHJvdG90eXBlcyB3aWxsIGNhdXNlIGEgY29tcGlsYXRpb24gZXJyb3IuICBUaGlzIGNhbiBiZQorZml4ZWQgYnkgc2ltcGx5IGd1YXJkaW5nIGFnYWluc3QgdGhlIGluY2x1c2lvbiBvZiB0aGVzZSB0d28gcHJvdG90eXBlcyB1bmxlc3MKK3RoZXkgYXJlIGV4cGxpY2l0bHkgcmVxdWlyZWQgYnkgdGhlIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyBjb25maWd1cmF0aW9uCitjb25zdGFudC4gKi8KKyNpZmRlZiBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcKKwkjaWYgY29uZmlnVVNFX0FQUExJQ0FUSU9OX1RBU0tfVEFHID09IDEKKwkJLyoqCisJCSAqIHRhc2suaAorCQkgKiA8cHJlPnZvaWQgdlRhc2tTZXRBcHBsaWNhdGlvblRhc2tUYWcoIFRhc2tIYW5kbGVfdCB4VGFzaywgVGFza0hvb2tGdW5jdGlvbl90IHB4SG9va0Z1bmN0aW9uICk7PC9wcmU+CisJCSAqCisJCSAqIFNldHMgcHhIb29rRnVuY3Rpb24gdG8gYmUgdGhlIHRhc2sgaG9vayBmdW5jdGlvbiB1c2VkIGJ5IHRoZSB0YXNrIHhUYXNrLgorCQkgKiBQYXNzaW5nIHhUYXNrIGFzIE5VTEwgaGFzIHRoZSBlZmZlY3Qgb2Ygc2V0dGluZyB0aGUgY2FsbGluZyB0YXNrcyBob29rCisJCSAqIGZ1bmN0aW9uLgorCQkgKi8KKwkJdm9pZCB2VGFza1NldEFwcGxpY2F0aW9uVGFza1RhZyggVGFza0hhbmRsZV90IHhUYXNrLCBUYXNrSG9va0Z1bmN0aW9uX3QgcHhIb29rRnVuY3Rpb24gKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisJCS8qKgorCQkgKiB0YXNrLmgKKwkJICogPHByZT52b2lkIHhUYXNrR2V0QXBwbGljYXRpb25UYXNrVGFnKCBUYXNrSGFuZGxlX3QgeFRhc2sgKTs8L3ByZT4KKwkJICoKKwkJICogUmV0dXJucyB0aGUgcHhIb29rRnVuY3Rpb24gdmFsdWUgYXNzaWduZWQgdG8gdGhlIHRhc2sgeFRhc2suCisJCSAqLworCQlUYXNrSG9va0Z1bmN0aW9uX3QgeFRhc2tHZXRBcHBsaWNhdGlvblRhc2tUYWcoIFRhc2tIYW5kbGVfdCB4VGFzayApIFBSSVZJTEVHRURfRlVOQ1RJT047CisJI2VuZGlmIC8qIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyA9PTEgKi8KKyNlbmRpZiAvKiBpZmRlZiBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgKi8KKworI2lmKCBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgPiAwICkKKworCS8qIEVhY2ggdGFzayBjb250YWlucyBhbiBhcnJheSBvZiBwb2ludGVycyB0aGF0IGlzIGRpbWVuc2lvbmVkIGJ5IHRoZQorCWNvbmZpZ05VTV9USFJFQURfTE9DQUxfU1RPUkFHRV9QT0lOVEVSUyBzZXR0aW5nIGluIEZyZWVSVE9TQ29uZmlnLmguICBUaGUKKwlrZXJuZWwgZG9lcyBub3QgdXNlIHRoZSBwb2ludGVycyBpdHNlbGYsIHNvIHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgY2FuIHVzZQorCXRoZSBwb2ludGVycyBmb3IgYW55IHB1cnBvc2UgdGhleSB3aXNoLiAgVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZQorCXVzZWQgdG8gc2V0IGFuZCBxdWVyeSBhIHBvaW50ZXIgcmVzcGVjdGl2ZWx5LiAqLworCXZvaWQgdlRhc2tTZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1NldCwgQmFzZVR5cGVfdCB4SW5kZXgsIHZvaWQgKnB2VmFsdWUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCXZvaWQgKnB2VGFza0dldFRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXIoIFRhc2tIYW5kbGVfdCB4VGFza1RvUXVlcnksIEJhc2VUeXBlX3QgeEluZGV4ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworI2VuZGlmCisKKy8qKgorICogdGFzay5oCisgKiA8cHJlPkJhc2VUeXBlX3QgeFRhc2tDYWxsQXBwbGljYXRpb25UYXNrSG9vayggVGFza0hhbmRsZV90IHhUYXNrLCB2b2lkICpwdlBhcmFtZXRlciApOzwvcHJlPgorICoKKyAqIENhbGxzIHRoZSBob29rIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB4VGFzay4gIFBhc3NpbmcgeFRhc2sgYXMgTlVMTCBoYXMKKyAqIHRoZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGUgUnVubmluZyB0YXNrcyAodGhlIGNhbGxpbmcgdGFzaykgaG9vayBmdW5jdGlvbi4KKyAqCisgKiBwdlBhcmFtZXRlciBpcyBwYXNzZWQgdG8gdGhlIGhvb2sgZnVuY3Rpb24gZm9yIHRoZSB0YXNrIHRvIGludGVycHJldCBhcyBpdAorICogd2FudHMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgdGFzayBob29rIGZ1bmN0aW9uCisgKiByZWdpc3RlcmVkIGJ5IHRoZSB1c2VyLgorICovCitCYXNlVHlwZV90IHhUYXNrQ2FsbEFwcGxpY2F0aW9uVGFza0hvb2soIFRhc2tIYW5kbGVfdCB4VGFzaywgdm9pZCAqcHZQYXJhbWV0ZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHhUYXNrR2V0SWRsZVRhc2tIYW5kbGUoKSBpcyBvbmx5IGF2YWlsYWJsZSBpZgorICogSU5DTFVERV94VGFza0dldElkbGVUYXNrSGFuZGxlIGlzIHNldCB0byAxIGluIEZyZWVSVE9TQ29uZmlnLmguCisgKgorICogU2ltcGx5IHJldHVybnMgdGhlIGhhbmRsZSBvZiB0aGUgaWRsZSB0YXNrLiAgSXQgaXMgbm90IHZhbGlkIHRvIGNhbGwKKyAqIHhUYXNrR2V0SWRsZVRhc2tIYW5kbGUoKSBiZWZvcmUgdGhlIHNjaGVkdWxlciBoYXMgYmVlbiBzdGFydGVkLgorICovCitUYXNrSGFuZGxlX3QgeFRhc2tHZXRJZGxlVGFza0hhbmRsZSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZIG11c3QgYmUgZGVmaW5lZCBhcyAxIGluIEZyZWVSVE9TQ29uZmlnLmggZm9yCisgKiB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpIHRvIGJlIGF2YWlsYWJsZS4KKyAqCisgKiB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpIHBvcHVsYXRlcyBhbiBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlIGZvciBlYWNoIHRhc2sgaW4KKyAqIHRoZSBzeXN0ZW0uICBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlcyBjb250YWluLCBhbW9uZyBvdGhlciB0aGluZ3MsIG1lbWJlcnMKKyAqIGZvciB0aGUgdGFzayBoYW5kbGUsIHRhc2sgbmFtZSwgdGFzayBwcmlvcml0eSwgdGFzayBzdGF0ZSwgYW5kIHRvdGFsIGFtb3VudAorICogb2YgcnVuIHRpbWUgY29uc3VtZWQgYnkgdGhlIHRhc2suICBTZWUgdGhlIFRhc2tTdGF0dXNfdCBzdHJ1Y3R1cmUKKyAqIGRlZmluaXRpb24gaW4gdGhpcyBmaWxlIGZvciB0aGUgZnVsbCBtZW1iZXIgbGlzdC4KKyAqCisgKiBOT1RFOiAgVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgZGVidWdnaW5nIHVzZSBvbmx5IGFzIGl0cyB1c2UgcmVzdWx0cyBpbgorICogdGhlIHNjaGVkdWxlciByZW1haW5pbmcgc3VzcGVuZGVkIGZvciBhbiBleHRlbmRlZCBwZXJpb2QuCisgKgorICogQHBhcmFtIHB4VGFza1N0YXR1c0FycmF5IEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlcy4KKyAqIFRoZSBhcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIFRhc2tTdGF0dXNfdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggdGFzaworICogdGhhdCBpcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgUlRPUy4gIFRoZSBudW1iZXIgb2YgdGFza3MgdW5kZXIgdGhlIGNvbnRyb2wKKyAqIG9mIHRoZSBSVE9TIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSB1eFRhc2tHZXROdW1iZXJPZlRhc2tzKCkgQVBJIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB1eEFycmF5U2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSB0aGUgcHhUYXNrU3RhdHVzQXJyYXkKKyAqIHBhcmFtZXRlci4gIFRoZSBzaXplIGlzIHNwZWNpZmllZCBhcyB0aGUgbnVtYmVyIG9mIGluZGV4ZXMgaW4gdGhlIGFycmF5LCBvcgorICogdGhlIG51bWJlciBvZiBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlcyBjb250YWluZWQgaW4gdGhlIGFycmF5LCBub3QgYnkgdGhlCisgKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5LgorICoKKyAqIEBwYXJhbSBwdWxUb3RhbFJ1blRpbWUgSWYgY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgaXMgc2V0IHRvIDEgaW4KKyAqIEZyZWVSVE9TQ29uZmlnLmggdGhlbiAqcHVsVG90YWxSdW5UaW1lIGlzIHNldCBieSB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpIHRvIHRoZQorICogdG90YWwgcnVuIHRpbWUgKGFzIGRlZmluZWQgYnkgdGhlIHJ1biB0aW1lIHN0YXRzIGNsb2NrLCBzZWUKKyAqIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL3J0b3MtcnVuLXRpbWUtc3RhdHMuaHRtbCkgc2luY2UgdGhlIHRhcmdldCBib290ZWQuCisgKiBwdWxUb3RhbFJ1blRpbWUgY2FuIGJlIHNldCB0byBOVUxMIHRvIG9taXQgdGhlIHRvdGFsIHJ1biB0aW1lIGluZm9ybWF0aW9uLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlcyB0aGF0IHdlcmUgcG9wdWxhdGVkIGJ5CisgKiB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpLiAgVGhpcyBzaG91bGQgZXF1YWwgdGhlIG51bWJlciByZXR1cm5lZCBieSB0aGUKKyAqIHV4VGFza0dldE51bWJlck9mVGFza3MoKSBBUEkgZnVuY3Rpb24sIGJ1dCB3aWxsIGJlIHplcm8gaWYgdGhlIHZhbHVlIHBhc3NlZAorICogaW4gdGhlIHV4QXJyYXlTaXplIHBhcmFtZXRlciB3YXMgdG9vIHNtYWxsLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgICA8cHJlPgorICAgIC8vIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IGEgaHVtYW4gcmVhZGFibGUgdGFibGUgb2YgcnVuIHRpbWUgc3RhdHMKKwkvLyBpbmZvcm1hdGlvbiBpcyBnZW5lcmF0ZWQgZnJvbSByYXcgZGF0YSBwcm92aWRlZCBieSB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpLgorCS8vIFRoZSBodW1hbiByZWFkYWJsZSB0YWJsZSBpcyB3cml0dGVuIHRvIHBjV3JpdGVCdWZmZXIKKwl2b2lkIHZUYXNrR2V0UnVuVGltZVN0YXRzKCBjaGFyICpwY1dyaXRlQnVmZmVyICkKKwl7CisJVGFza1N0YXR1c190ICpweFRhc2tTdGF0dXNBcnJheTsKKwl2b2xhdGlsZSBVQmFzZVR5cGVfdCB1eEFycmF5U2l6ZSwgeDsKKwl1aW50MzJfdCB1bFRvdGFsUnVuVGltZSwgdWxTdGF0c0FzUGVyY2VudGFnZTsKKworCQkvLyBNYWtlIHN1cmUgdGhlIHdyaXRlIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgc3RyaW5nLgorCQkqcGNXcml0ZUJ1ZmZlciA9IDB4MDA7CisKKwkJLy8gVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBudW1iZXIgb2YgdGFza3MgaW4gY2FzZSBpdCBjaGFuZ2VzIHdoaWxlIHRoaXMKKwkJLy8gZnVuY3Rpb24gaXMgZXhlY3V0aW5nLgorCQl1eEFycmF5U2l6ZSA9IHV4VGFza0dldE51bWJlck9mVGFza3MoKTsKKworCQkvLyBBbGxvY2F0ZSBhIFRhc2tTdGF0dXNfdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggdGFzay4gIEFuIGFycmF5IGNvdWxkIGJlCisJCS8vIGFsbG9jYXRlZCBzdGF0aWNhbGx5IGF0IGNvbXBpbGUgdGltZS4KKwkJcHhUYXNrU3RhdHVzQXJyYXkgPSBwdlBvcnRNYWxsb2MoIHV4QXJyYXlTaXplICogc2l6ZW9mKCBUYXNrU3RhdHVzX3QgKSApOworCisJCWlmKCBweFRhc2tTdGF0dXNBcnJheSAhPSBOVUxMICkKKwkJeworCQkJLy8gR2VuZXJhdGUgcmF3IHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHRhc2suCisJCQl1eEFycmF5U2l6ZSA9IHV4VGFza0dldFN5c3RlbVN0YXRlKCBweFRhc2tTdGF0dXNBcnJheSwgdXhBcnJheVNpemUsICZ1bFRvdGFsUnVuVGltZSApOworCisJCQkvLyBGb3IgcGVyY2VudGFnZSBjYWxjdWxhdGlvbnMuCisJCQl1bFRvdGFsUnVuVGltZSAvPSAxMDBVTDsKKworCQkJLy8gQXZvaWQgZGl2aWRlIGJ5IHplcm8gZXJyb3JzLgorCQkJaWYoIHVsVG90YWxSdW5UaW1lID4gMCApCisJCQl7CisJCQkJLy8gRm9yIGVhY2ggcG9wdWxhdGVkIHBvc2l0aW9uIGluIHRoZSBweFRhc2tTdGF0dXNBcnJheSBhcnJheSwKKwkJCQkvLyBmb3JtYXQgdGhlIHJhdyBkYXRhIGFzIGh1bWFuIHJlYWRhYmxlIEFTQ0lJIGRhdGEKKwkJCQlmb3IoIHggPSAwOyB4IDwgdXhBcnJheVNpemU7IHgrKyApCisJCQkJeworCQkJCQkvLyBXaGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHJ1biB0aW1lIGhhcyB0aGUgdGFzayB1c2VkPworCQkJCQkvLyBUaGlzIHdpbGwgYWx3YXlzIGJlIHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLgorCQkJCQkvLyB1bFRvdGFsUnVuVGltZURpdjEwMCBoYXMgYWxyZWFkeSBiZWVuIGRpdmlkZWQgYnkgMTAwLgorCQkJCQl1bFN0YXRzQXNQZXJjZW50YWdlID0gcHhUYXNrU3RhdHVzQXJyYXlbIHggXS51bFJ1blRpbWVDb3VudGVyIC8gdWxUb3RhbFJ1blRpbWU7CisKKwkJCQkJaWYoIHVsU3RhdHNBc1BlcmNlbnRhZ2UgPiAwVUwgKQorCQkJCQl7CisJCQkJCQlzcHJpbnRmKCBwY1dyaXRlQnVmZmVyLCAiJXNcdFx0JWx1XHRcdCVsdSUlXHJcbiIsIHB4VGFza1N0YXR1c0FycmF5WyB4IF0ucGNUYXNrTmFtZSwgcHhUYXNrU3RhdHVzQXJyYXlbIHggXS51bFJ1blRpbWVDb3VudGVyLCB1bFN0YXRzQXNQZXJjZW50YWdlICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvLyBJZiB0aGUgcGVyY2VudGFnZSBpcyB6ZXJvIGhlcmUgdGhlbiB0aGUgdGFzayBoYXMKKwkJCQkJCS8vIGNvbnN1bWVkIGxlc3MgdGhhbiAxJSBvZiB0aGUgdG90YWwgcnVuIHRpbWUuCisJCQkJCQlzcHJpbnRmKCBwY1dyaXRlQnVmZmVyLCAiJXNcdFx0JWx1XHRcdDwxJSVcclxuIiwgcHhUYXNrU3RhdHVzQXJyYXlbIHggXS5wY1Rhc2tOYW1lLCBweFRhc2tTdGF0dXNBcnJheVsgeCBdLnVsUnVuVGltZUNvdW50ZXIgKTsKKwkJCQkJfQorCisJCQkJCXBjV3JpdGVCdWZmZXIgKz0gc3RybGVuKCAoIGNoYXIgKiApIHBjV3JpdGVCdWZmZXIgKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFRoZSBhcnJheSBpcyBubyBsb25nZXIgbmVlZGVkLCBmcmVlIHRoZSBtZW1vcnkgaXQgY29uc3VtZXMuCisJCQl2UG9ydEZyZWUoIHB4VGFza1N0YXR1c0FycmF5ICk7CisJCX0KKwl9CisJPC9wcmU+CisgKi8KK1VCYXNlVHlwZV90IHV4VGFza0dldFN5c3RlbVN0YXRlKCBUYXNrU3RhdHVzX3QgKiBjb25zdCBweFRhc2tTdGF0dXNBcnJheSwgY29uc3QgVUJhc2VUeXBlX3QgdXhBcnJheVNpemUsIHVpbnQzMl90ICogY29uc3QgcHVsVG90YWxSdW5UaW1lICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8UFJFPnZvaWQgdlRhc2tMaXN0KCBjaGFyICpwY1dyaXRlQnVmZmVyICk7PC9QUkU+CisgKgorICogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZIGFuZCBjb25maWdVU0VfU1RBVFNfRk9STUFUVElOR19GVU5DVElPTlMgbXVzdAorICogYm90aCBiZSBkZWZpbmVkIGFzIDEgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlLiAgU2VlIHRoZQorICogY29uZmlndXJhdGlvbiBzZWN0aW9uIG9mIHRoZSBGcmVlUlRPUy5vcmcgd2Vic2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBOT1RFIDE6IFRoaXMgZnVuY3Rpb24gd2lsbCBkaXNhYmxlIGludGVycnVwdHMgZm9yIGl0cyBkdXJhdGlvbi4gIEl0IGlzCisgKiBub3QgaW50ZW5kZWQgZm9yIG5vcm1hbCBhcHBsaWNhdGlvbiBydW50aW1lIHVzZSBidXQgYXMgYSBkZWJ1ZyBhaWQuCisgKgorICogTGlzdHMgYWxsIHRoZSBjdXJyZW50IHRhc2tzLCBhbG9uZyB3aXRoIHRoZWlyIGN1cnJlbnQgc3RhdGUgYW5kIHN0YWNrCisgKiB1c2FnZSBoaWdoIHdhdGVyIG1hcmsuCisgKgorICogVGFza3MgYXJlIHJlcG9ydGVkIGFzIGJsb2NrZWQgKCdCJyksIHJlYWR5ICgnUicpLCBkZWxldGVkICgnRCcpIG9yCisgKiBzdXNwZW5kZWQgKCdTJykuCisgKgorICogUExFQVNFIE5PVEU6CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2Ugb25seSwgYW5kIGlzIHVzZWQgYnkgbWFueSBvZiB0aGUKKyAqIGRlbW8gYXBwbGljYXRpb25zLiAgRG8gbm90IGNvbnNpZGVyIGl0IHRvIGJlIHBhcnQgb2YgdGhlIHNjaGVkdWxlci4KKyAqCisgKiB2VGFza0xpc3QoKSBjYWxscyB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpLCB0aGVuIGZvcm1hdHMgcGFydCBvZiB0aGUKKyAqIHV4VGFza0dldFN5c3RlbVN0YXRlKCkgb3V0cHV0IGludG8gYSBodW1hbiByZWFkYWJsZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRhc2sKKyAqIG5hbWVzLCBzdGF0ZXMgYW5kIHN0YWNrIHVzYWdlLgorICoKKyAqIHZUYXNrTGlzdCgpIGhhcyBhIGRlcGVuZGVuY3kgb24gdGhlIHNwcmludGYoKSBDIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBtaWdodAorICogYmxvYXQgdGhlIGNvZGUgc2l6ZSwgdXNlIGEgbG90IG9mIHN0YWNrLCBhbmQgcHJvdmlkZSBkaWZmZXJlbnQgcmVzdWx0cyBvbgorICogZGlmZmVyZW50IHBsYXRmb3Jtcy4gIEFuIGFsdGVybmF0aXZlLCB0aW55LCB0aGlyZCBwYXJ0eSwgYW5kIGxpbWl0ZWQKKyAqIGZ1bmN0aW9uYWxpdHkgaW1wbGVtZW50YXRpb24gb2Ygc3ByaW50ZigpIGlzIHByb3ZpZGVkIGluIG1hbnkgb2YgdGhlCisgKiBGcmVlUlRPUy9EZW1vIHN1Yi1kaXJlY3RvcmllcyBpbiBhIGZpbGUgY2FsbGVkIHByaW50Zi1zdGRhcmcuYyAobm90ZQorICogcHJpbnRmLXN0ZGFyZy5jIGRvZXMgbm90IHByb3ZpZGUgYSBmdWxsIHNucHJpbnRmKCkgaW1wbGVtZW50YXRpb24hKS4KKyAqCisgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHByb2R1Y3Rpb24gc3lzdGVtcyBjYWxsIHV4VGFza0dldFN5c3RlbVN0YXRlKCkKKyAqIGRpcmVjdGx5IHRvIGdldCBhY2Nlc3MgdG8gcmF3IHN0YXRzIGRhdGEsIHJhdGhlciB0aGFuIGluZGlyZWN0bHkgdGhyb3VnaCBhCisgKiBjYWxsIHRvIHZUYXNrTGlzdCgpLgorICoKKyAqIEBwYXJhbSBwY1dyaXRlQnVmZmVyIEEgYnVmZmVyIGludG8gd2hpY2ggdGhlIGFib3ZlIG1lbnRpb25lZCBkZXRhaWxzCisgKiB3aWxsIGJlIHdyaXR0ZW4sIGluIEFTQ0lJIGZvcm0uICBUaGlzIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGJlIGxhcmdlCisgKiBlbm91Z2ggdG8gY29udGFpbiB0aGUgZ2VuZXJhdGVkIHJlcG9ydC4gIEFwcHJveGltYXRlbHkgNDAgYnl0ZXMgcGVyCisgKiB0YXNrIHNob3VsZCBiZSBzdWZmaWNpZW50LgorICoKKyAqIFxkZWZncm91cCB2VGFza0xpc3QgdlRhc2tMaXN0CisgKiBcaW5ncm91cCBUYXNrVXRpbHMKKyAqLwordm9pZCB2VGFza0xpc3QoIGNoYXIgKiBwY1dyaXRlQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsgLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisKKy8qKgorICogdGFzay4gaAorICogPFBSRT52b2lkIHZUYXNrR2V0UnVuVGltZVN0YXRzKCBjaGFyICpwY1dyaXRlQnVmZmVyICk7PC9QUkU+CisgKgorICogY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgYW5kIGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUworICogbXVzdCBib3RoIGJlIGRlZmluZWQgYXMgMSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUuICBUaGUgYXBwbGljYXRpb24KKyAqIG11c3QgYWxzbyB0aGVuIHByb3ZpZGUgZGVmaW5pdGlvbnMgZm9yCisgKiBwb3J0Q09ORklHVVJFX1RJTUVSX0ZPUl9SVU5fVElNRV9TVEFUUygpIGFuZCBwb3J0R0VUX1JVTl9USU1FX0NPVU5URVJfVkFMVUUoKQorICogdG8gY29uZmlndXJlIGEgcGVyaXBoZXJhbCB0aW1lci9jb3VudGVyIGFuZCByZXR1cm4gdGhlIHRpbWVycyBjdXJyZW50IGNvdW50CisgKiB2YWx1ZSByZXNwZWN0aXZlbHkuICBUaGUgY291bnRlciBzaG91bGQgYmUgYXQgbGVhc3QgMTAgdGltZXMgdGhlIGZyZXF1ZW5jeSBvZgorICogdGhlIHRpY2sgY291bnQuCisgKgorICogTk9URSAxOiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciBpdHMgZHVyYXRpb24uICBJdCBpcworICogbm90IGludGVuZGVkIGZvciBub3JtYWwgYXBwbGljYXRpb24gcnVudGltZSB1c2UgYnV0IGFzIGEgZGVidWcgYWlkLgorICoKKyAqIFNldHRpbmcgY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgdG8gMSB3aWxsIHJlc3VsdCBpbiBhIHRvdGFsCisgKiBhY2N1bXVsYXRlZCBleGVjdXRpb24gdGltZSBiZWluZyBzdG9yZWQgZm9yIGVhY2ggdGFzay4gIFRoZSByZXNvbHV0aW9uCisgKiBvZiB0aGUgYWNjdW11bGF0ZWQgdGltZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRpbWVyCisgKiBjb25maWd1cmVkIGJ5IHRoZSBwb3J0Q09ORklHVVJFX1RJTUVSX0ZPUl9SVU5fVElNRV9TVEFUUygpIG1hY3JvLgorICogQ2FsbGluZyB2VGFza0dldFJ1blRpbWVTdGF0cygpIHdyaXRlcyB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgb2YgZWFjaAorICogdGFzayBpbnRvIGEgYnVmZmVyLCBib3RoIGFzIGFuIGFic29sdXRlIGNvdW50IHZhbHVlIGFuZCBhcyBhIHBlcmNlbnRhZ2UKKyAqIG9mIHRoZSB0b3RhbCBzeXN0ZW0gZXhlY3V0aW9uIHRpbWUuCisgKgorICogTk9URSAyOgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlIG9ubHksIGFuZCBpcyB1c2VkIGJ5IG1hbnkgb2YgdGhlCisgKiBkZW1vIGFwcGxpY2F0aW9ucy4gIERvIG5vdCBjb25zaWRlciBpdCB0byBiZSBwYXJ0IG9mIHRoZSBzY2hlZHVsZXIuCisgKgorICogdlRhc2tHZXRSdW5UaW1lU3RhdHMoKSBjYWxscyB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpLCB0aGVuIGZvcm1hdHMgcGFydCBvZiB0aGUKKyAqIHV4VGFza0dldFN5c3RlbVN0YXRlKCkgb3V0cHV0IGludG8gYSBodW1hbiByZWFkYWJsZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRoZQorICogYW1vdW50IG9mIHRpbWUgZWFjaCB0YXNrIGhhcyBzcGVudCBpbiB0aGUgUnVubmluZyBzdGF0ZSBpbiBib3RoIGFic29sdXRlIGFuZAorICogcGVyY2VudGFnZSB0ZXJtcy4KKyAqCisgKiB2VGFza0dldFJ1blRpbWVTdGF0cygpIGhhcyBhIGRlcGVuZGVuY3kgb24gdGhlIHNwcmludGYoKSBDIGxpYnJhcnkgZnVuY3Rpb24KKyAqIHRoYXQgbWlnaHQgYmxvYXQgdGhlIGNvZGUgc2l6ZSwgdXNlIGEgbG90IG9mIHN0YWNrLCBhbmQgcHJvdmlkZSBkaWZmZXJlbnQKKyAqIHJlc3VsdHMgb24gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIEFuIGFsdGVybmF0aXZlLCB0aW55LCB0aGlyZCBwYXJ0eSwgYW5kCisgKiBsaW1pdGVkIGZ1bmN0aW9uYWxpdHkgaW1wbGVtZW50YXRpb24gb2Ygc3ByaW50ZigpIGlzIHByb3ZpZGVkIGluIG1hbnkgb2YgdGhlCisgKiBGcmVlUlRPUy9EZW1vIHN1Yi1kaXJlY3RvcmllcyBpbiBhIGZpbGUgY2FsbGVkIHByaW50Zi1zdGRhcmcuYyAobm90ZQorICogcHJpbnRmLXN0ZGFyZy5jIGRvZXMgbm90IHByb3ZpZGUgYSBmdWxsIHNucHJpbnRmKCkgaW1wbGVtZW50YXRpb24hKS4KKyAqCisgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHByb2R1Y3Rpb24gc3lzdGVtcyBjYWxsIHV4VGFza0dldFN5c3RlbVN0YXRlKCkgZGlyZWN0bHkKKyAqIHRvIGdldCBhY2Nlc3MgdG8gcmF3IHN0YXRzIGRhdGEsIHJhdGhlciB0aGFuIGluZGlyZWN0bHkgdGhyb3VnaCBhIGNhbGwgdG8KKyAqIHZUYXNrR2V0UnVuVGltZVN0YXRzKCkuCisgKgorICogQHBhcmFtIHBjV3JpdGVCdWZmZXIgQSBidWZmZXIgaW50byB3aGljaCB0aGUgZXhlY3V0aW9uIHRpbWVzIHdpbGwgYmUKKyAqIHdyaXR0ZW4sIGluIEFTQ0lJIGZvcm0uICBUaGlzIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGJlIGxhcmdlIGVub3VnaCB0bworICogY29udGFpbiB0aGUgZ2VuZXJhdGVkIHJlcG9ydC4gIEFwcHJveGltYXRlbHkgNDAgYnl0ZXMgcGVyIHRhc2sgc2hvdWxkCisgKiBiZSBzdWZmaWNpZW50LgorICoKKyAqIFxkZWZncm91cCB2VGFza0dldFJ1blRpbWVTdGF0cyB2VGFza0dldFJ1blRpbWVTdGF0cworICogXGluZ3JvdXAgVGFza1V0aWxzCisgKi8KK3ZvaWQgdlRhc2tHZXRSdW5UaW1lU3RhdHMoIGNoYXIgKnBjV3JpdGVCdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOyAvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KKworLyoqCisgKiB0YXNrLiBoCisgKiA8UFJFPkJhc2VUeXBlX3QgeFRhc2tOb3RpZnkoIFRhc2tIYW5kbGVfdCB4VGFza1RvTm90aWZ5LCB1aW50MzJfdCB1bFZhbHVlLCBlTm90aWZ5QWN0aW9uIGVBY3Rpb24gKTs8L1BSRT4KKyAqCisgKiBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TIG11c3QgYmUgdW5kZWZpbmVkIG9yIGRlZmluZWQgYXMgMSBmb3IgdGhpcworICogZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIFdoZW4gY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyBpcyBzZXQgdG8gb25lIGVhY2ggdGFzayBoYXMgaXRzIG93biBwcml2YXRlCisgKiAibm90aWZpY2F0aW9uIHZhbHVlIiwgd2hpY2ggaXMgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciAodWludDMyX3QpLgorICoKKyAqIEV2ZW50cyBjYW4gYmUgc2VudCB0byBhIHRhc2sgdXNpbmcgYW4gaW50ZXJtZWRpYXJ5IG9iamVjdC4gIEV4YW1wbGVzIG9mIHN1Y2gKKyAqIG9iamVjdHMgYXJlIHF1ZXVlcywgc2VtYXBob3JlcywgbXV0ZXhlcyBhbmQgZXZlbnQgZ3JvdXBzLiAgVGFzayBub3RpZmljYXRpb25zCisgKiBhcmUgYSBtZXRob2Qgb2Ygc2VuZGluZyBhbiBldmVudCBkaXJlY3RseSB0byBhIHRhc2sgd2l0aG91dCB0aGUgbmVlZCBmb3Igc3VjaAorICogYW4gaW50ZXJtZWRpYXJ5IG9iamVjdC4KKyAqCisgKiBBIG5vdGlmaWNhdGlvbiBzZW50IHRvIGEgdGFzayBjYW4gb3B0aW9uYWxseSBwZXJmb3JtIGFuIGFjdGlvbiwgc3VjaCBhcworICogdXBkYXRlLCBvdmVyd3JpdGUgb3IgaW5jcmVtZW50IHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlLiAgSW4gdGhhdCB3YXkKKyAqIHRhc2sgbm90aWZpY2F0aW9ucyBjYW4gYmUgdXNlZCB0byBzZW5kIGRhdGEgdG8gYSB0YXNrLCBvciBiZSB1c2VkIGFzIGxpZ2h0CisgKiB3ZWlnaHQgYW5kIGZhc3QgYmluYXJ5IG9yIGNvdW50aW5nIHNlbWFwaG9yZXMuCisgKgorICogQSBub3RpZmljYXRpb24gc2VudCB0byBhIHRhc2sgd2lsbCByZW1haW4gcGVuZGluZyB1bnRpbCBpdCBpcyBjbGVhcmVkIGJ5IHRoZQorICogdGFzayBjYWxsaW5nIHhUYXNrTm90aWZ5V2FpdCgpIG9yIHVsVGFza05vdGlmeVRha2UoKS4gIElmIHRoZSB0YXNrIHdhcworICogYWxyZWFkeSBpbiB0aGUgQmxvY2tlZCBzdGF0ZSB0byB3YWl0IGZvciBhIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBub3RpZmljYXRpb24KKyAqIGFycml2ZXMgdGhlbiB0aGUgdGFzayB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZCBmcm9tIHRoZSBCbG9ja2VkIHN0YXRlCisgKiAodW5ibG9ja2VkKSBhbmQgdGhlIG5vdGlmaWNhdGlvbiBjbGVhcmVkLgorICoKKyAqIEEgdGFzayBjYW4gdXNlIHhUYXNrTm90aWZ5V2FpdCgpIHRvIFtvcHRpb25hbGx5XSBibG9jayB0byB3YWl0IGZvciBhCisgKiBub3RpZmljYXRpb24gdG8gYmUgcGVuZGluZywgb3IgdWxUYXNrTm90aWZ5VGFrZSgpIHRvIFtvcHRpb25hbGx5XSBibG9jaworICogdG8gd2FpdCBmb3IgaXRzIG5vdGlmaWNhdGlvbiB2YWx1ZSB0byBoYXZlIGEgbm9uLXplcm8gdmFsdWUuICBUaGUgdGFzayBkb2VzCisgKiBub3QgY29uc3VtZSBhbnkgQ1BVIHRpbWUgd2hpbGUgaXQgaXMgaW4gdGhlIEJsb2NrZWQgc3RhdGUuCisgKgorICogU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtdGFzay1ub3RpZmljYXRpb25zLmh0bWwgZm9yIGRldGFpbHMuCisgKgorICogQHBhcmFtIHhUYXNrVG9Ob3RpZnkgVGhlIGhhbmRsZSBvZiB0aGUgdGFzayBiZWluZyBub3RpZmllZC4gIFRoZSBoYW5kbGUgdG8gYQorICogdGFzayBjYW4gYmUgcmV0dXJuZWQgZnJvbSB0aGUgeFRhc2tDcmVhdGUoKSBBUEkgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgdGhlCisgKiB0YXNrLCBhbmQgdGhlIGhhbmRsZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzayBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZworICogeFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSgpLgorICoKKyAqIEBwYXJhbSB1bFZhbHVlIERhdGEgdGhhdCBjYW4gYmUgc2VudCB3aXRoIHRoZSBub3RpZmljYXRpb24uICBIb3cgdGhlIGRhdGEgaXMKKyAqIHVzZWQgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgdGhlIGVBY3Rpb24gcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBlQWN0aW9uIFNwZWNpZmllcyBob3cgdGhlIG5vdGlmaWNhdGlvbiB1cGRhdGVzIHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uCisgKiB2YWx1ZSwgaWYgYXQgYWxsLiAgVmFsaWQgdmFsdWVzIGZvciBlQWN0aW9uIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqIGVTZXRCaXRzIC0KKyAqIFRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIGlzIGJpdHdpc2UgT1JlZCB3aXRoIHVsVmFsdWUuICB4VGFza05vZmlmeSgpCisgKiBhbHdheXMgcmV0dXJucyBwZFBBU1MgaW4gdGhpcyBjYXNlLgorICoKKyAqIGVJbmNyZW1lbnQgLQorICogVGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgaXMgaW5jcmVtZW50ZWQuICB1bFZhbHVlIGlzIG5vdCB1c2VkIGFuZAorICogeFRhc2tOb3RpZnkoKSBhbHdheXMgcmV0dXJucyBwZFBBU1MgaW4gdGhpcyBjYXNlLgorICoKKyAqIGVTZXRWYWx1ZVdpdGhPdmVyd3JpdGUgLQorICogVGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgaXMgc2V0IHRvIHRoZSB2YWx1ZSBvZiB1bFZhbHVlLCBldmVuIGlmIHRoZQorICogdGFzayBiZWluZyBub3RpZmllZCBoYWQgbm90IHlldCBwcm9jZXNzZWQgdGhlIHByZXZpb3VzIG5vdGlmaWNhdGlvbiAodGhlCisgKiB0YXNrIGFscmVhZHkgaGFkIGEgbm90aWZpY2F0aW9uIHBlbmRpbmcpLiAgeFRhc2tOb3RpZnkoKSBhbHdheXMgcmV0dXJucworICogcGRQQVNTIGluIHRoaXMgY2FzZS4KKyAqCisgKiBlU2V0VmFsdWVXaXRob3V0T3ZlcndyaXRlIC0KKyAqIElmIHRoZSB0YXNrIGJlaW5nIG5vdGlmaWVkIGRpZCBub3QgYWxyZWFkeSBoYXZlIGEgbm90aWZpY2F0aW9uIHBlbmRpbmcgdGhlbgorICogdGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgaXMgc2V0IHRvIHVsVmFsdWUgYW5kIHhUYXNrTm90aWZ5KCkgd2lsbAorICogcmV0dXJuIHBkUEFTUy4gIElmIHRoZSB0YXNrIGJlaW5nIG5vdGlmaWVkIGFscmVhZHkgaGFkIGEgbm90aWZpY2F0aW9uCisgKiBwZW5kaW5nIHRoZW4gbm8gYWN0aW9uIGlzIHBlcmZvcm1lZCBhbmQgcGRGQUlMIGlzIHJldHVybmVkLgorICoKKyAqIGVOb0FjdGlvbiAtCisgKiBUaGUgdGFzayByZWNlaXZlcyBhIG5vdGlmaWNhdGlvbiB3aXRob3V0IGl0cyBub3RpZmljYXRpb24gdmFsdWUgYmVpbmcKKyAqIHVwZGF0ZWQuICB1bFZhbHVlIGlzIG5vdCB1c2VkIGFuZCB4VGFza05vdGlmeSgpIGFsd2F5cyByZXR1cm5zIHBkUEFTUyBpbgorICogdGhpcyBjYXNlLgorICoKKyAqICBwdWxQcmV2aW91c05vdGlmaWNhdGlvblZhbHVlIC0KKyAqICBDYW4gYmUgdXNlZCB0byBwYXNzIG91dCB0aGUgc3ViamVjdCB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIGJlZm9yZSBhbnkKKyAqICBiaXRzIGFyZSBtb2RpZmllZCBieSB0aGUgbm90aWZ5IGZ1bmN0aW9uLgorICoKKyAqIEByZXR1cm4gRGVwZW5kZW50IG9uIHRoZSB2YWx1ZSBvZiBlQWN0aW9uLiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAqIGVBY3Rpb24gcGFyYW1ldGVyLgorICoKKyAqIFxkZWZncm91cCB4VGFza05vdGlmeSB4VGFza05vdGlmeQorICogXGluZ3JvdXAgVGFza05vdGlmaWNhdGlvbnMKKyAqLworQmFzZVR5cGVfdCB4VGFza0dlbmVyaWNOb3RpZnkoIFRhc2tIYW5kbGVfdCB4VGFza1RvTm90aWZ5LCB1aW50MzJfdCB1bFZhbHVlLCBlTm90aWZ5QWN0aW9uIGVBY3Rpb24sIHVpbnQzMl90ICpwdWxQcmV2aW91c05vdGlmaWNhdGlvblZhbHVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNkZWZpbmUgeFRhc2tOb3RpZnkoIHhUYXNrVG9Ob3RpZnksIHVsVmFsdWUsIGVBY3Rpb24gKSB4VGFza0dlbmVyaWNOb3RpZnkoICggeFRhc2tUb05vdGlmeSApLCAoIHVsVmFsdWUgKSwgKCBlQWN0aW9uICksIE5VTEwgKQorI2RlZmluZSB4VGFza05vdGlmeUFuZFF1ZXJ5KCB4VGFza1RvTm90aWZ5LCB1bFZhbHVlLCBlQWN0aW9uLCBwdWxQcmV2aW91c05vdGlmeVZhbHVlICkgeFRhc2tHZW5lcmljTm90aWZ5KCAoIHhUYXNrVG9Ob3RpZnkgKSwgKCB1bFZhbHVlICksICggZUFjdGlvbiApLCAoIHB1bFByZXZpb3VzTm90aWZ5VmFsdWUgKSApCisKKy8qKgorICogdGFzay4gaAorICogPFBSRT5CYXNlVHlwZV90IHhUYXNrTm90aWZ5RnJvbUlTUiggVGFza0hhbmRsZV90IHhUYXNrVG9Ob3RpZnksIHVpbnQzMl90IHVsVmFsdWUsIGVOb3RpZnlBY3Rpb24gZUFjdGlvbiwgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOzwvUFJFPgorICoKKyAqIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgbXVzdCBiZSB1bmRlZmluZWQgb3IgZGVmaW5lZCBhcyAxIGZvciB0aGlzCisgKiBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUuCisgKgorICogV2hlbiBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TIGlzIHNldCB0byBvbmUgZWFjaCB0YXNrIGhhcyBpdHMgb3duIHByaXZhdGUKKyAqICJub3RpZmljYXRpb24gdmFsdWUiLCB3aGljaCBpcyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyICh1aW50MzJfdCkuCisgKgorICogQSB2ZXJzaW9uIG9mIHhUYXNrTm90aWZ5KCkgdGhhdCBjYW4gYmUgdXNlZCBmcm9tIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKyAqIChJU1IpLgorICoKKyAqIEV2ZW50cyBjYW4gYmUgc2VudCB0byBhIHRhc2sgdXNpbmcgYW4gaW50ZXJtZWRpYXJ5IG9iamVjdC4gIEV4YW1wbGVzIG9mIHN1Y2gKKyAqIG9iamVjdHMgYXJlIHF1ZXVlcywgc2VtYXBob3JlcywgbXV0ZXhlcyBhbmQgZXZlbnQgZ3JvdXBzLiAgVGFzayBub3RpZmljYXRpb25zCisgKiBhcmUgYSBtZXRob2Qgb2Ygc2VuZGluZyBhbiBldmVudCBkaXJlY3RseSB0byBhIHRhc2sgd2l0aG91dCB0aGUgbmVlZCBmb3Igc3VjaAorICogYW4gaW50ZXJtZWRpYXJ5IG9iamVjdC4KKyAqCisgKiBBIG5vdGlmaWNhdGlvbiBzZW50IHRvIGEgdGFzayBjYW4gb3B0aW9uYWxseSBwZXJmb3JtIGFuIGFjdGlvbiwgc3VjaCBhcworICogdXBkYXRlLCBvdmVyd3JpdGUgb3IgaW5jcmVtZW50IHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlLiAgSW4gdGhhdCB3YXkKKyAqIHRhc2sgbm90aWZpY2F0aW9ucyBjYW4gYmUgdXNlZCB0byBzZW5kIGRhdGEgdG8gYSB0YXNrLCBvciBiZSB1c2VkIGFzIGxpZ2h0CisgKiB3ZWlnaHQgYW5kIGZhc3QgYmluYXJ5IG9yIGNvdW50aW5nIHNlbWFwaG9yZXMuCisgKgorICogQSBub3RpZmljYXRpb24gc2VudCB0byBhIHRhc2sgd2lsbCByZW1haW4gcGVuZGluZyB1bnRpbCBpdCBpcyBjbGVhcmVkIGJ5IHRoZQorICogdGFzayBjYWxsaW5nIHhUYXNrTm90aWZ5V2FpdCgpIG9yIHVsVGFza05vdGlmeVRha2UoKS4gIElmIHRoZSB0YXNrIHdhcworICogYWxyZWFkeSBpbiB0aGUgQmxvY2tlZCBzdGF0ZSB0byB3YWl0IGZvciBhIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBub3RpZmljYXRpb24KKyAqIGFycml2ZXMgdGhlbiB0aGUgdGFzayB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZCBmcm9tIHRoZSBCbG9ja2VkIHN0YXRlCisgKiAodW5ibG9ja2VkKSBhbmQgdGhlIG5vdGlmaWNhdGlvbiBjbGVhcmVkLgorICoKKyAqIEEgdGFzayBjYW4gdXNlIHhUYXNrTm90aWZ5V2FpdCgpIHRvIFtvcHRpb25hbGx5XSBibG9jayB0byB3YWl0IGZvciBhCisgKiBub3RpZmljYXRpb24gdG8gYmUgcGVuZGluZywgb3IgdWxUYXNrTm90aWZ5VGFrZSgpIHRvIFtvcHRpb25hbGx5XSBibG9jaworICogdG8gd2FpdCBmb3IgaXRzIG5vdGlmaWNhdGlvbiB2YWx1ZSB0byBoYXZlIGEgbm9uLXplcm8gdmFsdWUuICBUaGUgdGFzayBkb2VzCisgKiBub3QgY29uc3VtZSBhbnkgQ1BVIHRpbWUgd2hpbGUgaXQgaXMgaW4gdGhlIEJsb2NrZWQgc3RhdGUuCisgKgorICogU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtdGFzay1ub3RpZmljYXRpb25zLmh0bWwgZm9yIGRldGFpbHMuCisgKgorICogQHBhcmFtIHhUYXNrVG9Ob3RpZnkgVGhlIGhhbmRsZSBvZiB0aGUgdGFzayBiZWluZyBub3RpZmllZC4gIFRoZSBoYW5kbGUgdG8gYQorICogdGFzayBjYW4gYmUgcmV0dXJuZWQgZnJvbSB0aGUgeFRhc2tDcmVhdGUoKSBBUEkgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgdGhlCisgKiB0YXNrLCBhbmQgdGhlIGhhbmRsZSBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzayBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZworICogeFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSgpLgorICoKKyAqIEBwYXJhbSB1bFZhbHVlIERhdGEgdGhhdCBjYW4gYmUgc2VudCB3aXRoIHRoZSBub3RpZmljYXRpb24uICBIb3cgdGhlIGRhdGEgaXMKKyAqIHVzZWQgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgdGhlIGVBY3Rpb24gcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBlQWN0aW9uIFNwZWNpZmllcyBob3cgdGhlIG5vdGlmaWNhdGlvbiB1cGRhdGVzIHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uCisgKiB2YWx1ZSwgaWYgYXQgYWxsLiAgVmFsaWQgdmFsdWVzIGZvciBlQWN0aW9uIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqIGVTZXRCaXRzIC0KKyAqIFRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIGlzIGJpdHdpc2UgT1JlZCB3aXRoIHVsVmFsdWUuICB4VGFza05vZmlmeSgpCisgKiBhbHdheXMgcmV0dXJucyBwZFBBU1MgaW4gdGhpcyBjYXNlLgorICoKKyAqIGVJbmNyZW1lbnQgLQorICogVGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgaXMgaW5jcmVtZW50ZWQuICB1bFZhbHVlIGlzIG5vdCB1c2VkIGFuZAorICogeFRhc2tOb3RpZnkoKSBhbHdheXMgcmV0dXJucyBwZFBBU1MgaW4gdGhpcyBjYXNlLgorICoKKyAqIGVTZXRWYWx1ZVdpdGhPdmVyd3JpdGUgLQorICogVGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgaXMgc2V0IHRvIHRoZSB2YWx1ZSBvZiB1bFZhbHVlLCBldmVuIGlmIHRoZQorICogdGFzayBiZWluZyBub3RpZmllZCBoYWQgbm90IHlldCBwcm9jZXNzZWQgdGhlIHByZXZpb3VzIG5vdGlmaWNhdGlvbiAodGhlCisgKiB0YXNrIGFscmVhZHkgaGFkIGEgbm90aWZpY2F0aW9uIHBlbmRpbmcpLiAgeFRhc2tOb3RpZnkoKSBhbHdheXMgcmV0dXJucworICogcGRQQVNTIGluIHRoaXMgY2FzZS4KKyAqCisgKiBlU2V0VmFsdWVXaXRob3V0T3ZlcndyaXRlIC0KKyAqIElmIHRoZSB0YXNrIGJlaW5nIG5vdGlmaWVkIGRpZCBub3QgYWxyZWFkeSBoYXZlIGEgbm90aWZpY2F0aW9uIHBlbmRpbmcgdGhlbgorICogdGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgaXMgc2V0IHRvIHVsVmFsdWUgYW5kIHhUYXNrTm90aWZ5KCkgd2lsbAorICogcmV0dXJuIHBkUEFTUy4gIElmIHRoZSB0YXNrIGJlaW5nIG5vdGlmaWVkIGFscmVhZHkgaGFkIGEgbm90aWZpY2F0aW9uCisgKiBwZW5kaW5nIHRoZW4gbm8gYWN0aW9uIGlzIHBlcmZvcm1lZCBhbmQgcGRGQUlMIGlzIHJldHVybmVkLgorICoKKyAqIGVOb0FjdGlvbiAtCisgKiBUaGUgdGFzayByZWNlaXZlcyBhIG5vdGlmaWNhdGlvbiB3aXRob3V0IGl0cyBub3RpZmljYXRpb24gdmFsdWUgYmVpbmcKKyAqIHVwZGF0ZWQuICB1bFZhbHVlIGlzIG5vdCB1c2VkIGFuZCB4VGFza05vdGlmeSgpIGFsd2F5cyByZXR1cm5zIHBkUEFTUyBpbgorICogdGhpcyBjYXNlLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICB4VGFza05vdGlmeUZyb21JU1IoKSB3aWxsIHNldAorICogKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gdG8gcGRUUlVFIGlmIHNlbmRpbmcgdGhlIG5vdGlmaWNhdGlvbiBjYXVzZWQgdGhlCisgKiB0YXNrIHRvIHdoaWNoIHRoZSBub3RpZmljYXRpb24gd2FzIHNlbnQgdG8gbGVhdmUgdGhlIEJsb2NrZWQgc3RhdGUsIGFuZCB0aGUKKyAqIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrLiAgSWYKKyAqIHhUYXNrTm90aWZ5RnJvbUlTUigpIHNldHMgdGhpcyB2YWx1ZSB0byBwZFRSVUUgdGhlbiBhIGNvbnRleHQgc3dpdGNoIHNob3VsZAorICogYmUgcmVxdWVzdGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIGV4aXRlZC4gIEhvdyBhIGNvbnRleHQgc3dpdGNoIGlzCisgKiByZXF1ZXN0ZWQgZnJvbSBhbiBJU1IgaXMgZGVwZW5kZW50IG9uIHRoZSBwb3J0IC0gc2VlIHRoZSBkb2N1bWVudGF0aW9uIHBhZ2UKKyAqIGZvciB0aGUgcG9ydCBpbiB1c2UuCisgKgorICogQHJldHVybiBEZXBlbmRlbnQgb24gdGhlIHZhbHVlIG9mIGVBY3Rpb24uICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZQorICogZUFjdGlvbiBwYXJhbWV0ZXIuCisgKgorICogXGRlZmdyb3VwIHhUYXNrTm90aWZ5IHhUYXNrTm90aWZ5CisgKiBcaW5ncm91cCBUYXNrTm90aWZpY2F0aW9ucworICovCitCYXNlVHlwZV90IHhUYXNrR2VuZXJpY05vdGlmeUZyb21JU1IoIFRhc2tIYW5kbGVfdCB4VGFza1RvTm90aWZ5LCB1aW50MzJfdCB1bFZhbHVlLCBlTm90aWZ5QWN0aW9uIGVBY3Rpb24sIHVpbnQzMl90ICpwdWxQcmV2aW91c05vdGlmaWNhdGlvblZhbHVlLCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNkZWZpbmUgeFRhc2tOb3RpZnlGcm9tSVNSKCB4VGFza1RvTm90aWZ5LCB1bFZhbHVlLCBlQWN0aW9uLCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgeFRhc2tHZW5lcmljTm90aWZ5RnJvbUlTUiggKCB4VGFza1RvTm90aWZ5ICksICggdWxWYWx1ZSApLCAoIGVBY3Rpb24gKSwgTlVMTCwgKCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgKQorI2RlZmluZSB4VGFza05vdGlmeUFuZFF1ZXJ5RnJvbUlTUiggeFRhc2tUb05vdGlmeSwgdWxWYWx1ZSwgZUFjdGlvbiwgcHVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZSwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApIHhUYXNrR2VuZXJpY05vdGlmeUZyb21JU1IoICggeFRhc2tUb05vdGlmeSApLCAoIHVsVmFsdWUgKSwgKCBlQWN0aW9uICksICggcHVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZSApLCAoIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSApCisKKy8qKgorICogdGFzay4gaAorICogPFBSRT5CYXNlVHlwZV90IHhUYXNrTm90aWZ5V2FpdCggdWludDMyX3QgdWxCaXRzVG9DbGVhck9uRW50cnksIHVpbnQzMl90IHVsQml0c1RvQ2xlYXJPbkV4aXQsIHVpbnQzMl90ICpwdWxOb3RpZmljYXRpb25WYWx1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTs8L3ByZT4KKyAqCisgKiBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TIG11c3QgYmUgdW5kZWZpbmVkIG9yIGRlZmluZWQgYXMgMSBmb3IgdGhpcworICogZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIFdoZW4gY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyBpcyBzZXQgdG8gb25lIGVhY2ggdGFzayBoYXMgaXRzIG93biBwcml2YXRlCisgKiAibm90aWZpY2F0aW9uIHZhbHVlIiwgd2hpY2ggaXMgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciAodWludDMyX3QpLgorICoKKyAqIEV2ZW50cyBjYW4gYmUgc2VudCB0byBhIHRhc2sgdXNpbmcgYW4gaW50ZXJtZWRpYXJ5IG9iamVjdC4gIEV4YW1wbGVzIG9mIHN1Y2gKKyAqIG9iamVjdHMgYXJlIHF1ZXVlcywgc2VtYXBob3JlcywgbXV0ZXhlcyBhbmQgZXZlbnQgZ3JvdXBzLiAgVGFzayBub3RpZmljYXRpb25zCisgKiBhcmUgYSBtZXRob2Qgb2Ygc2VuZGluZyBhbiBldmVudCBkaXJlY3RseSB0byBhIHRhc2sgd2l0aG91dCB0aGUgbmVlZCBmb3Igc3VjaAorICogYW4gaW50ZXJtZWRpYXJ5IG9iamVjdC4KKyAqCisgKiBBIG5vdGlmaWNhdGlvbiBzZW50IHRvIGEgdGFzayBjYW4gb3B0aW9uYWxseSBwZXJmb3JtIGFuIGFjdGlvbiwgc3VjaCBhcworICogdXBkYXRlLCBvdmVyd3JpdGUgb3IgaW5jcmVtZW50IHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlLiAgSW4gdGhhdCB3YXkKKyAqIHRhc2sgbm90aWZpY2F0aW9ucyBjYW4gYmUgdXNlZCB0byBzZW5kIGRhdGEgdG8gYSB0YXNrLCBvciBiZSB1c2VkIGFzIGxpZ2h0CisgKiB3ZWlnaHQgYW5kIGZhc3QgYmluYXJ5IG9yIGNvdW50aW5nIHNlbWFwaG9yZXMuCisgKgorICogQSBub3RpZmljYXRpb24gc2VudCB0byBhIHRhc2sgd2lsbCByZW1haW4gcGVuZGluZyB1bnRpbCBpdCBpcyBjbGVhcmVkIGJ5IHRoZQorICogdGFzayBjYWxsaW5nIHhUYXNrTm90aWZ5V2FpdCgpIG9yIHVsVGFza05vdGlmeVRha2UoKS4gIElmIHRoZSB0YXNrIHdhcworICogYWxyZWFkeSBpbiB0aGUgQmxvY2tlZCBzdGF0ZSB0byB3YWl0IGZvciBhIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBub3RpZmljYXRpb24KKyAqIGFycml2ZXMgdGhlbiB0aGUgdGFzayB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZCBmcm9tIHRoZSBCbG9ja2VkIHN0YXRlCisgKiAodW5ibG9ja2VkKSBhbmQgdGhlIG5vdGlmaWNhdGlvbiBjbGVhcmVkLgorICoKKyAqIEEgdGFzayBjYW4gdXNlIHhUYXNrTm90aWZ5V2FpdCgpIHRvIFtvcHRpb25hbGx5XSBibG9jayB0byB3YWl0IGZvciBhCisgKiBub3RpZmljYXRpb24gdG8gYmUgcGVuZGluZywgb3IgdWxUYXNrTm90aWZ5VGFrZSgpIHRvIFtvcHRpb25hbGx5XSBibG9jaworICogdG8gd2FpdCBmb3IgaXRzIG5vdGlmaWNhdGlvbiB2YWx1ZSB0byBoYXZlIGEgbm9uLXplcm8gdmFsdWUuICBUaGUgdGFzayBkb2VzCisgKiBub3QgY29uc3VtZSBhbnkgQ1BVIHRpbWUgd2hpbGUgaXQgaXMgaW4gdGhlIEJsb2NrZWQgc3RhdGUuCisgKgorICogU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtdGFzay1ub3RpZmljYXRpb25zLmh0bWwgZm9yIGRldGFpbHMuCisgKgorICogQHBhcmFtIHVsQml0c1RvQ2xlYXJPbkVudHJ5IEJpdHMgdGhhdCBhcmUgc2V0IGluIHVsQml0c1RvQ2xlYXJPbkVudHJ5IHZhbHVlCisgKiB3aWxsIGJlIGNsZWFyZWQgaW4gdGhlIGNhbGxpbmcgdGFzaydzIG5vdGlmaWNhdGlvbiB2YWx1ZSBiZWZvcmUgdGhlIHRhc2sKKyAqIGNoZWNrcyB0byBzZWUgaWYgYW55IG5vdGlmaWNhdGlvbnMgYXJlIHBlbmRpbmcsIGFuZCBvcHRpb25hbGx5IGJsb2NrcyBpZiBubworICogbm90aWZpY2F0aW9ucyBhcmUgcGVuZGluZy4gIFNldHRpbmcgdWxCaXRzVG9DbGVhck9uRW50cnkgdG8gVUxPTkdfTUFYIChpZgorICogbGltaXRzLmggaXMgaW5jbHVkZWQpIG9yIDB4ZmZmZmZmZmZVTCAoaWYgbGltaXRzLmggaXMgbm90IGluY2x1ZGVkKSB3aWxsIGhhdmUKKyAqIHRoZSBlZmZlY3Qgb2YgcmVzZXR0aW5nIHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIHRvIDAuICBTZXR0aW5nCisgKiB1bEJpdHNUb0NsZWFyT25FbnRyeSB0byAwIHdpbGwgbGVhdmUgdGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgdW5jaGFuZ2VkLgorICoKKyAqIEBwYXJhbSB1bEJpdHNUb0NsZWFyT25FeGl0IElmIGEgbm90aWZpY2F0aW9uIGlzIHBlbmRpbmcgb3IgcmVjZWl2ZWQgYmVmb3JlCisgKiB0aGUgY2FsbGluZyB0YXNrIGV4aXRzIHRoZSB4VGFza05vdGlmeVdhaXQoKSBmdW5jdGlvbiB0aGVuIHRoZSB0YXNrJ3MKKyAqIG5vdGlmaWNhdGlvbiB2YWx1ZSAoc2VlIHRoZSB4VGFza05vdGlmeSgpIEFQSSBmdW5jdGlvbikgaXMgcGFzc2VkIG91dCB1c2luZworICogdGhlIHB1bE5vdGlmaWNhdGlvblZhbHVlIHBhcmFtZXRlci4gIFRoZW4gYW55IGJpdHMgdGhhdCBhcmUgc2V0IGluCisgKiB1bEJpdHNUb0NsZWFyT25FeGl0IHdpbGwgYmUgY2xlYXJlZCBpbiB0aGUgdGFzaydzIG5vdGlmaWNhdGlvbiB2YWx1ZSAobm90ZQorICogKnB1bE5vdGlmaWNhdGlvblZhbHVlIGlzIHNldCBiZWZvcmUgYW55IGJpdHMgYXJlIGNsZWFyZWQpLiAgU2V0dGluZworICogdWxCaXRzVG9DbGVhck9uRXhpdCB0byBVTE9OR19NQVggKGlmIGxpbWl0cy5oIGlzIGluY2x1ZGVkKSBvciAweGZmZmZmZmZmVUwKKyAqIChpZiBsaW1pdHMuaCBpcyBub3QgaW5jbHVkZWQpIHdpbGwgaGF2ZSB0aGUgZWZmZWN0IG9mIHJlc2V0dGluZyB0aGUgdGFzaydzCisgKiBub3RpZmljYXRpb24gdmFsdWUgdG8gMCBiZWZvcmUgdGhlIGZ1bmN0aW9uIGV4aXRzLiAgU2V0dGluZworICogdWxCaXRzVG9DbGVhck9uRXhpdCB0byAwIHdpbGwgbGVhdmUgdGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgdW5jaGFuZ2VkCisgKiB3aGVuIHRoZSBmdW5jdGlvbiBleGl0cyAoaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgcGFzc2VkIG91dCBpbgorICogcHVsTm90aWZpY2F0aW9uVmFsdWUgd2lsbCBtYXRjaCB0aGUgdGFzaydzIG5vdGlmaWNhdGlvbiB2YWx1ZSkuCisgKgorICogQHBhcmFtIHB1bE5vdGlmaWNhdGlvblZhbHVlIFVzZWQgdG8gcGFzcyB0aGUgdGFzaydzIG5vdGlmaWNhdGlvbiB2YWx1ZSBvdXQKKyAqIG9mIHRoZSBmdW5jdGlvbi4gIE5vdGUgdGhlIHZhbHVlIHBhc3NlZCBvdXQgd2lsbCBub3QgYmUgZWZmZWN0ZWQgYnkgdGhlCisgKiBjbGVhcmluZyBvZiBhbnkgYml0cyBjYXVzZWQgYnkgdWxCaXRzVG9DbGVhck9uRXhpdCBiZWluZyBub24temVyby4KKyAqCisgKiBAcGFyYW0geFRpY2tzVG9XYWl0IFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIHRhc2sgc2hvdWxkIHdhaXQgaW4KKyAqIHRoZSBCbG9ja2VkIHN0YXRlIGZvciBhIG5vdGlmaWNhdGlvbiB0byBiZSByZWNlaXZlZCwgc2hvdWxkIGEgbm90aWZpY2F0aW9uCisgKiBub3QgYWxyZWFkeSBiZSBwZW5kaW5nIHdoZW4geFRhc2tOb3RpZnlXYWl0KCkgd2FzIGNhbGxlZC4gIFRoZSB0YXNrCisgKiB3aWxsIG5vdCBjb25zdW1lIGFueSBwcm9jZXNzaW5nIHRpbWUgd2hpbGUgaXQgaXMgaW4gdGhlIEJsb2NrZWQgc3RhdGUuICBUaGlzCisgKiBpcyBzcGVjaWZpZWQgaW4ga2VybmVsIHRpY2tzLCB0aGUgbWFjcm8gcGRNU19UT19USUNTSyggdmFsdWVfaW5fbXMgKSBjYW4gYmUKKyAqIHVzZWQgdG8gY29udmVydCBhIHRpbWUgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcyB0byBhIHRpbWUgc3BlY2lmaWVkIGluCisgKiB0aWNrcy4KKyAqCisgKiBAcmV0dXJuIElmIGEgbm90aWZpY2F0aW9uIHdhcyByZWNlaXZlZCAoaW5jbHVkaW5nIG5vdGlmaWNhdGlvbnMgdGhhdCB3ZXJlCisgKiBhbHJlYWR5IHBlbmRpbmcgd2hlbiB4VGFza05vdGlmeVdhaXQgd2FzIGNhbGxlZCkgdGhlbiBwZFBBU1MgaXMKKyAqIHJldHVybmVkLiAgT3RoZXJ3aXNlIHBkRkFJTCBpcyByZXR1cm5lZC4KKyAqCisgKiBcZGVmZ3JvdXAgeFRhc2tOb3RpZnlXYWl0IHhUYXNrTm90aWZ5V2FpdAorICogXGluZ3JvdXAgVGFza05vdGlmaWNhdGlvbnMKKyAqLworQmFzZVR5cGVfdCB4VGFza05vdGlmeVdhaXQoIHVpbnQzMl90IHVsQml0c1RvQ2xlYXJPbkVudHJ5LCB1aW50MzJfdCB1bEJpdHNUb0NsZWFyT25FeGl0LCB1aW50MzJfdCAqcHVsTm90aWZpY2F0aW9uVmFsdWUsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8UFJFPkJhc2VUeXBlX3QgeFRhc2tOb3RpZnlHaXZlKCBUYXNrSGFuZGxlX3QgeFRhc2tUb05vdGlmeSApOzwvUFJFPgorICoKKyAqIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgbXVzdCBiZSB1bmRlZmluZWQgb3IgZGVmaW5lZCBhcyAxIGZvciB0aGlzIG1hY3JvCisgKiB0byBiZSBhdmFpbGFibGUuCisgKgorICogV2hlbiBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TIGlzIHNldCB0byBvbmUgZWFjaCB0YXNrIGhhcyBpdHMgb3duIHByaXZhdGUKKyAqICJub3RpZmljYXRpb24gdmFsdWUiLCB3aGljaCBpcyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyICh1aW50MzJfdCkuCisgKgorICogRXZlbnRzIGNhbiBiZSBzZW50IHRvIGEgdGFzayB1c2luZyBhbiBpbnRlcm1lZGlhcnkgb2JqZWN0LiAgRXhhbXBsZXMgb2Ygc3VjaAorICogb2JqZWN0cyBhcmUgcXVldWVzLCBzZW1hcGhvcmVzLCBtdXRleGVzIGFuZCBldmVudCBncm91cHMuICBUYXNrIG5vdGlmaWNhdGlvbnMKKyAqIGFyZSBhIG1ldGhvZCBvZiBzZW5kaW5nIGFuIGV2ZW50IGRpcmVjdGx5IHRvIGEgdGFzayB3aXRob3V0IHRoZSBuZWVkIGZvciBzdWNoCisgKiBhbiBpbnRlcm1lZGlhcnkgb2JqZWN0LgorICoKKyAqIEEgbm90aWZpY2F0aW9uIHNlbnQgdG8gYSB0YXNrIGNhbiBvcHRpb25hbGx5IHBlcmZvcm0gYW4gYWN0aW9uLCBzdWNoIGFzCisgKiB1cGRhdGUsIG92ZXJ3cml0ZSBvciBpbmNyZW1lbnQgdGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUuICBJbiB0aGF0IHdheQorICogdGFzayBub3RpZmljYXRpb25zIGNhbiBiZSB1c2VkIHRvIHNlbmQgZGF0YSB0byBhIHRhc2ssIG9yIGJlIHVzZWQgYXMgbGlnaHQKKyAqIHdlaWdodCBhbmQgZmFzdCBiaW5hcnkgb3IgY291bnRpbmcgc2VtYXBob3Jlcy4KKyAqCisgKiB4VGFza05vdGlmeUdpdmUoKSBpcyBhIGhlbHBlciBtYWNybyBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gdGFzayBub3RpZmljYXRpb25zCisgKiBhcmUgdXNlZCBhcyBsaWdodCB3ZWlnaHQgYW5kIGZhc3RlciBiaW5hcnkgb3IgY291bnRpbmcgc2VtYXBob3JlIGVxdWl2YWxlbnRzLgorICogQWN0dWFsIEZyZWVSVE9TIHNlbWFwaG9yZXMgYXJlIGdpdmVuIHVzaW5nIHRoZSB4U2VtYXBob3JlR2l2ZSgpIEFQSSBmdW5jdGlvbiwKKyAqIHRoZSBlcXVpdmFsZW50IGFjdGlvbiB0aGF0IGluc3RlYWQgdXNlcyBhIHRhc2sgbm90aWZpY2F0aW9uIGlzCisgKiB4VGFza05vdGlmeUdpdmUoKS4KKyAqCisgKiBXaGVuIHRhc2sgbm90aWZpY2F0aW9ucyBhcmUgYmVpbmcgdXNlZCBhcyBhIGJpbmFyeSBvciBjb3VudGluZyBzZW1hcGhvcmUKKyAqIGVxdWl2YWxlbnQgdGhlbiB0aGUgdGFzayBiZWluZyBub3RpZmllZCBzaG91bGQgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbgorICogdXNpbmcgdGhlIHVsVGFza05vdGlmaWNhdGlvblRha2UoKSBBUEkgZnVuY3Rpb24gcmF0aGVyIHRoYW4gdGhlCisgKiB4VGFza05vdGlmeVdhaXQoKSBBUEkgZnVuY3Rpb24uCisgKgorICogU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtdGFzay1ub3RpZmljYXRpb25zLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0geFRhc2tUb05vdGlmeSBUaGUgaGFuZGxlIG9mIHRoZSB0YXNrIGJlaW5nIG5vdGlmaWVkLiAgVGhlIGhhbmRsZSB0byBhCisgKiB0YXNrIGNhbiBiZSByZXR1cm5lZCBmcm9tIHRoZSB4VGFza0NyZWF0ZSgpIEFQSSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSB0aGUKKyAqIHRhc2ssIGFuZCB0aGUgaGFuZGxlIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nCisgKiB4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCkuCisgKgorICogQHJldHVybiB4VGFza05vdGlmeUdpdmUoKSBpcyBhIG1hY3JvIHRoYXQgY2FsbHMgeFRhc2tOb3RpZnkoKSB3aXRoIHRoZQorICogZUFjdGlvbiBwYXJhbWV0ZXIgc2V0IHRvIGVJbmNyZW1lbnQgLSBzbyBwZFBBU1MgaXMgYWx3YXlzIHJldHVybmVkLgorICoKKyAqIFxkZWZncm91cCB4VGFza05vdGlmeUdpdmUgeFRhc2tOb3RpZnlHaXZlCisgKiBcaW5ncm91cCBUYXNrTm90aWZpY2F0aW9ucworICovCisjZGVmaW5lIHhUYXNrTm90aWZ5R2l2ZSggeFRhc2tUb05vdGlmeSApIHhUYXNrR2VuZXJpY05vdGlmeSggKCB4VGFza1RvTm90aWZ5ICksICggMCApLCBlSW5jcmVtZW50LCBOVUxMICkKKworLyoqCisgKiB0YXNrLiBoCisgKiA8UFJFPnZvaWQgdlRhc2tOb3RpZnlHaXZlRnJvbUlTUiggVGFza0hhbmRsZV90IHhUYXNrSGFuZGxlLCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisgKgorICogY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyBtdXN0IGJlIHVuZGVmaW5lZCBvciBkZWZpbmVkIGFzIDEgZm9yIHRoaXMgbWFjcm8KKyAqIHRvIGJlIGF2YWlsYWJsZS4KKyAqCisgKiBXaGVuIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgaXMgc2V0IHRvIG9uZSBlYWNoIHRhc2sgaGFzIGl0cyBvd24gcHJpdmF0ZQorICogIm5vdGlmaWNhdGlvbiB2YWx1ZSIsIHdoaWNoIGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKHVpbnQzMl90KS4KKyAqCisgKiBBIHZlcnNpb24gb2YgeFRhc2tOb3RpZnlHaXZlKCkgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IHNlcnZpY2UKKyAqIHJvdXRpbmUgKElTUikuCisgKgorICogRXZlbnRzIGNhbiBiZSBzZW50IHRvIGEgdGFzayB1c2luZyBhbiBpbnRlcm1lZGlhcnkgb2JqZWN0LiAgRXhhbXBsZXMgb2Ygc3VjaAorICogb2JqZWN0cyBhcmUgcXVldWVzLCBzZW1hcGhvcmVzLCBtdXRleGVzIGFuZCBldmVudCBncm91cHMuICBUYXNrIG5vdGlmaWNhdGlvbnMKKyAqIGFyZSBhIG1ldGhvZCBvZiBzZW5kaW5nIGFuIGV2ZW50IGRpcmVjdGx5IHRvIGEgdGFzayB3aXRob3V0IHRoZSBuZWVkIGZvciBzdWNoCisgKiBhbiBpbnRlcm1lZGlhcnkgb2JqZWN0LgorICoKKyAqIEEgbm90aWZpY2F0aW9uIHNlbnQgdG8gYSB0YXNrIGNhbiBvcHRpb25hbGx5IHBlcmZvcm0gYW4gYWN0aW9uLCBzdWNoIGFzCisgKiB1cGRhdGUsIG92ZXJ3cml0ZSBvciBpbmNyZW1lbnQgdGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUuICBJbiB0aGF0IHdheQorICogdGFzayBub3RpZmljYXRpb25zIGNhbiBiZSB1c2VkIHRvIHNlbmQgZGF0YSB0byBhIHRhc2ssIG9yIGJlIHVzZWQgYXMgbGlnaHQKKyAqIHdlaWdodCBhbmQgZmFzdCBiaW5hcnkgb3IgY291bnRpbmcgc2VtYXBob3Jlcy4KKyAqCisgKiB2VGFza05vdGlmeUdpdmVGcm9tSVNSKCkgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIHRhc2sgbm90aWZpY2F0aW9ucyBhcmUKKyAqIHVzZWQgYXMgbGlnaHQgd2VpZ2h0IGFuZCBmYXN0ZXIgYmluYXJ5IG9yIGNvdW50aW5nIHNlbWFwaG9yZSBlcXVpdmFsZW50cy4KKyAqIEFjdHVhbCBGcmVlUlRPUyBzZW1hcGhvcmVzIGFyZSBnaXZlbiBmcm9tIGFuIElTUiB1c2luZyB0aGUKKyAqIHhTZW1hcGhvcmVHaXZlRnJvbUlTUigpIEFQSSBmdW5jdGlvbiwgdGhlIGVxdWl2YWxlbnQgYWN0aW9uIHRoYXQgaW5zdGVhZCB1c2VzCisgKiBhIHRhc2sgbm90aWZpY2F0aW9uIGlzIHZUYXNrTm90aWZ5R2l2ZUZyb21JU1IoKS4KKyAqCisgKiBXaGVuIHRhc2sgbm90aWZpY2F0aW9ucyBhcmUgYmVpbmcgdXNlZCBhcyBhIGJpbmFyeSBvciBjb3VudGluZyBzZW1hcGhvcmUKKyAqIGVxdWl2YWxlbnQgdGhlbiB0aGUgdGFzayBiZWluZyBub3RpZmllZCBzaG91bGQgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbgorICogdXNpbmcgdGhlIHVsVGFza05vdGlmaWNhdGlvblRha2UoKSBBUEkgZnVuY3Rpb24gcmF0aGVyIHRoYW4gdGhlCisgKiB4VGFza05vdGlmeVdhaXQoKSBBUEkgZnVuY3Rpb24uCisgKgorICogU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtdGFzay1ub3RpZmljYXRpb25zLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0geFRhc2tUb05vdGlmeSBUaGUgaGFuZGxlIG9mIHRoZSB0YXNrIGJlaW5nIG5vdGlmaWVkLiAgVGhlIGhhbmRsZSB0byBhCisgKiB0YXNrIGNhbiBiZSByZXR1cm5lZCBmcm9tIHRoZSB4VGFza0NyZWF0ZSgpIEFQSSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSB0aGUKKyAqIHRhc2ssIGFuZCB0aGUgaGFuZGxlIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nCisgKiB4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCkuCisgKgorICogQHBhcmFtIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gIHZUYXNrTm90aWZ5R2l2ZUZyb21JU1IoKSB3aWxsIHNldAorICogKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gdG8gcGRUUlVFIGlmIHNlbmRpbmcgdGhlIG5vdGlmaWNhdGlvbiBjYXVzZWQgdGhlCisgKiB0YXNrIHRvIHdoaWNoIHRoZSBub3RpZmljYXRpb24gd2FzIHNlbnQgdG8gbGVhdmUgdGhlIEJsb2NrZWQgc3RhdGUsIGFuZCB0aGUKKyAqIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrLiAgSWYKKyAqIHZUYXNrTm90aWZ5R2l2ZUZyb21JU1IoKSBzZXRzIHRoaXMgdmFsdWUgdG8gcGRUUlVFIHRoZW4gYSBjb250ZXh0IHN3aXRjaAorICogc2hvdWxkIGJlIHJlcXVlc3RlZCBiZWZvcmUgdGhlIGludGVycnVwdCBpcyBleGl0ZWQuICBIb3cgYSBjb250ZXh0IHN3aXRjaCBpcworICogcmVxdWVzdGVkIGZyb20gYW4gSVNSIGlzIGRlcGVuZGVudCBvbiB0aGUgcG9ydCAtIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBwYWdlCisgKiBmb3IgdGhlIHBvcnQgaW4gdXNlLgorICoKKyAqIFxkZWZncm91cCB4VGFza05vdGlmeVdhaXQgeFRhc2tOb3RpZnlXYWl0CisgKiBcaW5ncm91cCBUYXNrTm90aWZpY2F0aW9ucworICovCit2b2lkIHZUYXNrTm90aWZ5R2l2ZUZyb21JU1IoIFRhc2tIYW5kbGVfdCB4VGFza1RvTm90aWZ5LCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB0YXNrLiBoCisgKiA8UFJFPnVpbnQzMl90IHVsVGFza05vdGlmeVRha2UoIEJhc2VUeXBlX3QgeENsZWFyQ291bnRPbkV4aXQsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7PC9wcmU+CisgKgorICogY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyBtdXN0IGJlIHVuZGVmaW5lZCBvciBkZWZpbmVkIGFzIDEgZm9yIHRoaXMKKyAqIGZ1bmN0aW9uIHRvIGJlIGF2YWlsYWJsZS4KKyAqCisgKiBXaGVuIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgaXMgc2V0IHRvIG9uZSBlYWNoIHRhc2sgaGFzIGl0cyBvd24gcHJpdmF0ZQorICogIm5vdGlmaWNhdGlvbiB2YWx1ZSIsIHdoaWNoIGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgKHVpbnQzMl90KS4KKyAqCisgKiBFdmVudHMgY2FuIGJlIHNlbnQgdG8gYSB0YXNrIHVzaW5nIGFuIGludGVybWVkaWFyeSBvYmplY3QuICBFeGFtcGxlcyBvZiBzdWNoCisgKiBvYmplY3RzIGFyZSBxdWV1ZXMsIHNlbWFwaG9yZXMsIG11dGV4ZXMgYW5kIGV2ZW50IGdyb3Vwcy4gIFRhc2sgbm90aWZpY2F0aW9ucworICogYXJlIGEgbWV0aG9kIG9mIHNlbmRpbmcgYW4gZXZlbnQgZGlyZWN0bHkgdG8gYSB0YXNrIHdpdGhvdXQgdGhlIG5lZWQgZm9yIHN1Y2gKKyAqIGFuIGludGVybWVkaWFyeSBvYmplY3QuCisgKgorICogQSBub3RpZmljYXRpb24gc2VudCB0byBhIHRhc2sgY2FuIG9wdGlvbmFsbHkgcGVyZm9ybSBhbiBhY3Rpb24sIHN1Y2ggYXMKKyAqIHVwZGF0ZSwgb3ZlcndyaXRlIG9yIGluY3JlbWVudCB0aGUgdGFzaydzIG5vdGlmaWNhdGlvbiB2YWx1ZS4gIEluIHRoYXQgd2F5CisgKiB0YXNrIG5vdGlmaWNhdGlvbnMgY2FuIGJlIHVzZWQgdG8gc2VuZCBkYXRhIHRvIGEgdGFzaywgb3IgYmUgdXNlZCBhcyBsaWdodAorICogd2VpZ2h0IGFuZCBmYXN0IGJpbmFyeSBvciBjb3VudGluZyBzZW1hcGhvcmVzLgorICoKKyAqIHVsVGFza05vdGlmeVRha2UoKSBpcyBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gYSB0YXNrIG5vdGlmaWNhdGlvbiBpcyB1c2VkIGFzIGEKKyAqIGZhc3RlciBhbmQgbGlnaHRlciB3ZWlnaHQgYmluYXJ5IG9yIGNvdW50aW5nIHNlbWFwaG9yZSBhbHRlcm5hdGl2ZS4gIEFjdHVhbAorICogRnJlZVJUT1Mgc2VtYXBob3JlcyBhcmUgdGFrZW4gdXNpbmcgdGhlIHhTZW1hcGhvcmVUYWtlKCkgQVBJIGZ1bmN0aW9uLCB0aGUKKyAqIGVxdWl2YWxlbnQgYWN0aW9uIHRoYXQgaW5zdGVhZCB1c2VzIGEgdGFzayBub3RpZmljYXRpb24gaXMKKyAqIHVsVGFza05vdGlmeVRha2UoKS4KKyAqCisgKiBXaGVuIGEgdGFzayBpcyB1c2luZyBpdHMgbm90aWZpY2F0aW9uIHZhbHVlIGFzIGEgYmluYXJ5IG9yIGNvdW50aW5nIHNlbWFwaG9yZQorICogb3RoZXIgdGFza3Mgc2hvdWxkIHNlbmQgbm90aWZpY2F0aW9ucyB0byBpdCB1c2luZyB0aGUgeFRhc2tOb3RpZnlHaXZlKCkKKyAqIG1hY3JvLCBvciB4VGFza05vdGlmeSgpIGZ1bmN0aW9uIHdpdGggdGhlIGVBY3Rpb24gcGFyYW1ldGVyIHNldCB0bworICogZUluY3JlbWVudC4KKyAqCisgKiB1bFRhc2tOb3RpZnlUYWtlKCkgY2FuIGVpdGhlciBjbGVhciB0aGUgdGFzaydzIG5vdGlmaWNhdGlvbiB2YWx1ZSB0bworICogemVybyBvbiBleGl0LCBpbiB3aGljaCBjYXNlIHRoZSBub3RpZmljYXRpb24gdmFsdWUgYWN0cyBsaWtlIGEgYmluYXJ5CisgKiBzZW1hcGhvcmUsIG9yIGRlY3JlbWVudCB0aGUgdGFzaydzIG5vdGlmaWNhdGlvbiB2YWx1ZSBvbiBleGl0LCBpbiB3aGljaCBjYXNlCisgKiB0aGUgbm90aWZpY2F0aW9uIHZhbHVlIGFjdHMgbGlrZSBhIGNvdW50aW5nIHNlbWFwaG9yZS4KKyAqCisgKiBBIHRhc2sgY2FuIHVzZSB1bFRhc2tOb3RpZnlUYWtlKCkgdG8gW29wdGlvbmFsbHldIGJsb2NrIHRvIHdhaXQgZm9yIGEKKyAqIHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIHRvIGJlIG5vbi16ZXJvLiAgVGhlIHRhc2sgZG9lcyBub3QgY29uc3VtZSBhbnkKKyAqIENQVSB0aW1lIHdoaWxlIGl0IGlzIGluIHRoZSBCbG9ja2VkIHN0YXRlLgorICoKKyAqIFdoZXJlIGFzIHhUYXNrTm90aWZ5V2FpdCgpIHdpbGwgcmV0dXJuIHdoZW4gYSBub3RpZmljYXRpb24gaXMgcGVuZGluZywKKyAqIHVsVGFza05vdGlmeVRha2UoKSB3aWxsIHJldHVybiB3aGVuIHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIGlzCisgKiBub3QgemVyby4KKyAqCisgKiBTZWUgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvUlRPUy10YXNrLW5vdGlmaWNhdGlvbnMuaHRtbCBmb3IgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0geENsZWFyQ291bnRPbkV4aXQgaWYgeENsZWFyQ291bnRPbkV4aXQgaXMgcGRGQUxTRSB0aGVuIHRoZSB0YXNrJ3MKKyAqIG5vdGlmaWNhdGlvbiB2YWx1ZSBpcyBkZWNyZW1lbnRlZCB3aGVuIHRoZSBmdW5jdGlvbiBleGl0cy4gIEluIHRoaXMgd2F5IHRoZQorICogbm90aWZpY2F0aW9uIHZhbHVlIGFjdHMgbGlrZSBhIGNvdW50aW5nIHNlbWFwaG9yZS4gIElmIHhDbGVhckNvdW50T25FeGl0IGlzCisgKiBub3QgcGRGQUxTRSB0aGVuIHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIGlzIGNsZWFyZWQgdG8gemVybyB3aGVuIHRoZQorICogZnVuY3Rpb24gZXhpdHMuICBJbiB0aGlzIHdheSB0aGUgbm90aWZpY2F0aW9uIHZhbHVlIGFjdHMgbGlrZSBhIGJpbmFyeQorICogc2VtYXBob3JlLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgdGFzayBzaG91bGQgd2FpdCBpbgorICogdGhlIEJsb2NrZWQgc3RhdGUgZm9yIHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLAorICogc2hvdWxkIHRoZSBjb3VudCBub3QgYWxyZWFkeSBiZSBncmVhdGVyIHRoYW4gemVybyB3aGVuCisgKiB1bFRhc2tOb3RpZnlUYWtlKCkgd2FzIGNhbGxlZC4gIFRoZSB0YXNrIHdpbGwgbm90IGNvbnN1bWUgYW55IHByb2Nlc3NpbmcKKyAqIHRpbWUgd2hpbGUgaXQgaXMgaW4gdGhlIEJsb2NrZWQgc3RhdGUuICBUaGlzIGlzIHNwZWNpZmllZCBpbiBrZXJuZWwgdGlja3MsCisgKiB0aGUgbWFjcm8gcGRNU19UT19USUNTSyggdmFsdWVfaW5fbXMgKSBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGEgdGltZQorICogc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcyB0byBhIHRpbWUgc3BlY2lmaWVkIGluIHRpY2tzLgorICoKKyAqIEByZXR1cm4gVGhlIHRhc2sncyBub3RpZmljYXRpb24gY291bnQgYmVmb3JlIGl0IGlzIGVpdGhlciBjbGVhcmVkIHRvIHplcm8gb3IKKyAqIGRlY3JlbWVudGVkIChzZWUgdGhlIHhDbGVhckNvdW50T25FeGl0IHBhcmFtZXRlcikuCisgKgorICogXGRlZmdyb3VwIHVsVGFza05vdGlmeVRha2UgdWxUYXNrTm90aWZ5VGFrZQorICogXGluZ3JvdXAgVGFza05vdGlmaWNhdGlvbnMKKyAqLwordWludDMyX3QgdWxUYXNrTm90aWZ5VGFrZSggQmFzZVR5cGVfdCB4Q2xlYXJDb3VudE9uRXhpdCwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIHRhc2suIGgKKyAqIDxQUkU+QmFzZVR5cGVfdCB4VGFza05vdGlmeVN0YXRlQ2xlYXIoIFRhc2tIYW5kbGVfdCB4VGFzayApOzwvcHJlPgorICoKKyAqIElmIHRoZSBub3RpZmljYXRpb24gc3RhdGUgb2YgdGhlIHRhc2sgcmVmZXJlbmNlZCBieSB0aGUgaGFuZGxlIHhUYXNrIGlzCisgKiBlTm90aWZpZWQsIHRoZW4gc2V0IHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHN0YXRlIHRvIGVOb3RXYWl0aW5nTm90aWZpY2F0aW9uLgorICogVGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgaXMgbm90IGFsdGVyZWQuICBTZXQgeFRhc2sgdG8gTlVMTCB0byBjbGVhciB0aGUKKyAqIG5vdGlmaWNhdGlvbiBzdGF0ZSBvZiB0aGUgY2FsbGluZyB0YXNrLgorICoKKyAqIEByZXR1cm4gcGRUUlVFIGlmIHRoZSB0YXNrJ3Mgbm90aWZpY2F0aW9uIHN0YXRlIHdhcyBzZXQgdG8KKyAqIGVOb3RXYWl0aW5nTm90aWZpY2F0aW9uLCBvdGhlcndpc2UgcGRGQUxTRS4KKyAqIFxkZWZncm91cCB4VGFza05vdGlmeVN0YXRlQ2xlYXIgeFRhc2tOb3RpZnlTdGF0ZUNsZWFyCisgKiBcaW5ncm91cCBUYXNrTm90aWZpY2F0aW9ucworICovCitCYXNlVHlwZV90IHhUYXNrTm90aWZ5U3RhdGVDbGVhciggVGFza0hhbmRsZV90IHhUYXNrICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNDSEVEVUxFUiBJTlRFUk5BTFMgQVZBSUxBQkxFIEZPUiBQT1JUSU5HIFBVUlBPU0VTCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVEhJUyBGVU5DVElPTiBNVVNUIE5PVCBCRSBVU0VEIEZST00gQVBQTElDQVRJT04gQ09ERS4gIElUIElTIE9OTFkKKyAqIElOVEVOREVEIEZPUiBVU0UgV0hFTiBJTVBMRU1FTlRJTkcgQSBQT1JUIE9GIFRIRSBTQ0hFRFVMRVIgQU5EIElTCisgKiBBTiBJTlRFUkZBQ0UgV0hJQ0ggSVMgRk9SIFRIRSBFWENMVVNJVkUgVVNFIE9GIFRIRSBTQ0hFRFVMRVIuCisgKgorICogQ2FsbGVkIGZyb20gdGhlIHJlYWwgdGltZSBrZXJuZWwgdGljayAoZWl0aGVyIHByZWVtcHRpdmUgb3IgY29vcGVyYXRpdmUpLAorICogdGhpcyBpbmNyZW1lbnRzIHRoZSB0aWNrIGNvdW50IGFuZCBjaGVja3MgaWYgYW55IHRhc2tzIHRoYXQgYXJlIGJsb2NrZWQKKyAqIGZvciBhIGZpbml0ZSBwZXJpb2QgcmVxdWlyZWQgcmVtb3ZpbmcgZnJvbSBhIGJsb2NrZWQgbGlzdCBhbmQgcGxhY2luZyBvbgorICogYSByZWFkeSBsaXN0LiAgSWYgYSBub24temVybyB2YWx1ZSBpcyByZXR1cm5lZCB0aGVuIGEgY29udGV4dCBzd2l0Y2ggaXMKKyAqIHJlcXVpcmVkIGJlY2F1c2UgZWl0aGVyOgorICogICArIEEgdGFzayB3YXMgcmVtb3ZlZCBmcm9tIGEgYmxvY2tlZCBsaXN0IGJlY2F1c2UgaXRzIHRpbWVvdXQgaGFkIGV4cGlyZWQsCisgKiAgICAgb3IKKyAqICAgKyBUaW1lIHNsaWNpbmcgaXMgaW4gdXNlIGFuZCB0aGVyZSBpcyBhIHRhc2sgb2YgZXF1YWwgcHJpb3JpdHkgdG8gdGhlCisgKiAgICAgY3VycmVudGx5IHJ1bm5pbmcgdGFzay4KKyAqLworQmFzZVR5cGVfdCB4VGFza0luY3JlbWVudFRpY2soIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogVEhJUyBGVU5DVElPTiBNVVNUIE5PVCBCRSBVU0VEIEZST00gQVBQTElDQVRJT04gQ09ERS4gIElUIElTIEFOCisgKiBJTlRFUkZBQ0UgV0hJQ0ggSVMgRk9SIFRIRSBFWENMVVNJVkUgVVNFIE9GIFRIRSBTQ0hFRFVMRVIuCisgKgorICogVEhJUyBGVU5DVElPTiBNVVNUIEJFIENBTExFRCBXSVRIIElOVEVSUlVQVFMgRElTQUJMRUQuCisgKgorICogUmVtb3ZlcyB0aGUgY2FsbGluZyB0YXNrIGZyb20gdGhlIHJlYWR5IGxpc3QgYW5kIHBsYWNlcyBpdCBib3RoCisgKiBvbiB0aGUgbGlzdCBvZiB0YXNrcyB3YWl0aW5nIGZvciBhIHBhcnRpY3VsYXIgZXZlbnQsIGFuZCB0aGUKKyAqIGxpc3Qgb2YgZGVsYXllZCB0YXNrcy4gIFRoZSB0YXNrIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGJvdGggbGlzdHMKKyAqIGFuZCByZXBsYWNlZCBvbiB0aGUgcmVhZHkgbGlzdCBzaG91bGQgZWl0aGVyIHRoZSBldmVudCBvY2N1ciAoYW5kCisgKiB0aGVyZSBiZSBubyBoaWdoZXIgcHJpb3JpdHkgdGFza3Mgd2FpdGluZyBvbiB0aGUgc2FtZSBldmVudCkgb3IKKyAqIHRoZSBkZWxheSBwZXJpb2QgZXhwaXJlcy4KKyAqCisgKiBUaGUgJ3Vub3JkZXJlZCcgdmVyc2lvbiByZXBsYWNlcyB0aGUgZXZlbnQgbGlzdCBpdGVtIHZhbHVlIHdpdGggdGhlCisgKiB4SXRlbVZhbHVlIHZhbHVlLCBhbmQgaW5zZXJ0cyB0aGUgbGlzdCBpdGVtIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgKgorICogVGhlICdvcmRlcmVkJyB2ZXJzaW9uIHVzZXMgdGhlIGV4aXN0aW5nIGV2ZW50IGxpc3QgaXRlbSB2YWx1ZSAod2hpY2ggaXMgdGhlCisgKiBvd25pbmcgdGFza3MgcHJpb3JpdHkpIHRvIGluc2VydCB0aGUgbGlzdCBpdGVtIGludG8gdGhlIGV2ZW50IGxpc3QgaXMgdGFzaworICogcHJpb3JpdHkgb3JkZXIuCisgKgorICogQHBhcmFtIHB4RXZlbnRMaXN0IFRoZSBsaXN0IGNvbnRhaW5pbmcgdGFza3MgdGhhdCBhcmUgYmxvY2tlZCB3YWl0aW5nCisgKiBmb3IgdGhlIGV2ZW50IHRvIG9jY3VyLgorICoKKyAqIEBwYXJhbSB4SXRlbVZhbHVlIFRoZSBpdGVtIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGV2ZW50IGxpc3QgaXRlbSB3aGVuIHRoZQorICogZXZlbnQgbGlzdCBpcyBub3Qgb3JkZXJlZCBieSB0YXNrIHByaW9yaXR5LgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgdGFzayBzaG91bGQgd2FpdAorICogZm9yIHRoZSBldmVudCB0byBvY2N1ci4gIFRoaXMgaXMgc3BlY2lmaWVkIGluIGtlcm5lbCB0aWNrcyx0aGUgY29uc3RhbnQKKyAqIHBvcnRUSUNLX1BFUklPRF9NUyBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGtlcm5lbCB0aWNrcyBpbnRvIGEgcmVhbCB0aW1lCisgKiBwZXJpb2QuCisgKi8KK3ZvaWQgdlRhc2tQbGFjZU9uRXZlbnRMaXN0KCBMaXN0X3QgKiBjb25zdCBweEV2ZW50TGlzdCwgY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwordm9pZCB2VGFza1BsYWNlT25Vbm9yZGVyZWRFdmVudExpc3QoIExpc3RfdCAqIHB4RXZlbnRMaXN0LCBjb25zdCBUaWNrVHlwZV90IHhJdGVtVmFsdWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFRISVMgRlVOQ1RJT04gTVVTVCBOT1QgQkUgVVNFRCBGUk9NIEFQUExJQ0FUSU9OIENPREUuICBJVCBJUyBBTgorICogSU5URVJGQUNFIFdISUNIIElTIEZPUiBUSEUgRVhDTFVTSVZFIFVTRSBPRiBUSEUgU0NIRURVTEVSLgorICoKKyAqIFRISVMgRlVOQ1RJT04gTVVTVCBCRSBDQUxMRUQgV0lUSCBJTlRFUlJVUFRTIERJU0FCTEVELgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbmVhcmx5IHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHZUYXNrUGxhY2VPbkV2ZW50TGlzdCgpLgorICogVGhlIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcm1pdCB0YXNrcyB0byBibG9jaworICogaW5kZWZpbml0ZWx5LCB3aGVyZWFzIHZUYXNrUGxhY2VPbkV2ZW50TGlzdCgpIGRvZXMuCisgKgorICovCit2b2lkIHZUYXNrUGxhY2VPbkV2ZW50TGlzdFJlc3RyaWN0ZWQoIExpc3RfdCAqIGNvbnN0IHB4RXZlbnRMaXN0LCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCwgY29uc3QgQmFzZVR5cGVfdCB4V2FpdEluZGVmaW5pdGVseSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBUSElTIEZVTkNUSU9OIE1VU1QgTk9UIEJFIFVTRUQgRlJPTSBBUFBMSUNBVElPTiBDT0RFLiAgSVQgSVMgQU4KKyAqIElOVEVSRkFDRSBXSElDSCBJUyBGT1IgVEhFIEVYQ0xVU0lWRSBVU0UgT0YgVEhFIFNDSEVEVUxFUi4KKyAqCisgKiBUSElTIEZVTkNUSU9OIE1VU1QgQkUgQ0FMTEVEIFdJVEggSU5URVJSVVBUUyBESVNBQkxFRC4KKyAqCisgKiBSZW1vdmVzIGEgdGFzayBmcm9tIGJvdGggdGhlIHNwZWNpZmllZCBldmVudCBsaXN0IGFuZCB0aGUgbGlzdCBvZiBibG9ja2VkCisgKiB0YXNrcywgYW5kIHBsYWNlcyBpdCBvbiBhIHJlYWR5IHF1ZXVlLgorICoKKyAqIHhUYXNrUmVtb3ZlRnJvbUV2ZW50TGlzdCgpL3ZUYXNrUmVtb3ZlRnJvbVVub3JkZXJlZEV2ZW50TGlzdCgpIHdpbGwgYmUgY2FsbGVkCisgKiBpZiBlaXRoZXIgYW4gZXZlbnQgb2NjdXJzIHRvIHVuYmxvY2sgYSB0YXNrLCBvciB0aGUgYmxvY2sgdGltZW91dCBwZXJpb2QKKyAqIGV4cGlyZXMuCisgKgorICogeFRhc2tSZW1vdmVGcm9tRXZlbnRMaXN0KCkgaXMgdXNlZCB3aGVuIHRoZSBldmVudCBsaXN0IGlzIGluIHRhc2sgcHJpb3JpdHkKKyAqIG9yZGVyLiAgSXQgcmVtb3ZlcyB0aGUgbGlzdCBpdGVtIGZyb20gdGhlIGhlYWQgb2YgdGhlIGV2ZW50IGxpc3QgYXMgdGhhdCB3aWxsCisgKiBoYXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5IG93bmluZyB0YXNrIG9mIGFsbCB0aGUgdGFza3Mgb24gdGhlIGV2ZW50IGxpc3QuCisgKiB2VGFza1JlbW92ZUZyb21Vbm9yZGVyZWRFdmVudExpc3QoKSBpcyB1c2VkIHdoZW4gdGhlIGV2ZW50IGxpc3QgaXMgbm90CisgKiBvcmRlcmVkIGFuZCB0aGUgZXZlbnQgbGlzdCBpdGVtcyBob2xkIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBvd25pbmcgdGFza3MKKyAqIHByaW9yaXR5LiAgSW4gdGhpcyBjYXNlIHRoZSBldmVudCBsaXN0IGl0ZW0gdmFsdWUgaXMgdXBkYXRlZCB0byB0aGUgdmFsdWUKKyAqIHBhc3NlZCBpbiB0aGUgeEl0ZW1WYWx1ZSBwYXJhbWV0ZXIuCisgKgorICogQHJldHVybiBwZFRSVUUgaWYgdGhlIHRhc2sgYmVpbmcgcmVtb3ZlZCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgdGFzaworICogbWFraW5nIHRoZSBjYWxsLCBvdGhlcndpc2UgcGRGQUxTRS4KKyAqLworQmFzZVR5cGVfdCB4VGFza1JlbW92ZUZyb21FdmVudExpc3QoIGNvbnN0IExpc3RfdCAqIGNvbnN0IHB4RXZlbnRMaXN0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK3ZvaWQgdlRhc2tSZW1vdmVGcm9tVW5vcmRlcmVkRXZlbnRMaXN0KCBMaXN0SXRlbV90ICogcHhFdmVudExpc3RJdGVtLCBjb25zdCBUaWNrVHlwZV90IHhJdGVtVmFsdWUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogVEhJUyBGVU5DVElPTiBNVVNUIE5PVCBCRSBVU0VEIEZST00gQVBQTElDQVRJT04gQ09ERS4gIElUIElTIE9OTFkKKyAqIElOVEVOREVEIEZPUiBVU0UgV0hFTiBJTVBMRU1FTlRJTkcgQSBQT1JUIE9GIFRIRSBTQ0hFRFVMRVIgQU5EIElTCisgKiBBTiBJTlRFUkZBQ0UgV0hJQ0ggSVMgRk9SIFRIRSBFWENMVVNJVkUgVVNFIE9GIFRIRSBTQ0hFRFVMRVIuCisgKgorICogU2V0cyB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBUQ0IgdG8gdGhlIFRDQiBvZiB0aGUgaGlnaGVzdCBwcmlvcml0eSB0YXNrCisgKiB0aGF0IGlzIHJlYWR5IHRvIHJ1bi4KKyAqLwordm9pZCB2VGFza1N3aXRjaENvbnRleHQoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogVEhFU0UgRlVOQ1RJT05TIE1VU1QgTk9UIEJFIFVTRUQgRlJPTSBBUFBMSUNBVElPTiBDT0RFLiAgVEhFWSBBUkUgVVNFRCBCWQorICogVEhFIEVWRU5UIEJJVFMgTU9EVUxFLgorICovCitUaWNrVHlwZV90IHV4VGFza1Jlc2V0RXZlbnRJdGVtVmFsdWUoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogUmV0dXJuIHRoZSBoYW5kbGUgb2YgdGhlIGNhbGxpbmcgdGFzay4KKyAqLworVGFza0hhbmRsZV90IHhUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogQ2FwdHVyZSB0aGUgY3VycmVudCB0aW1lIHN0YXR1cyBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KKyAqLwordm9pZCB2VGFza1NldFRpbWVPdXRTdGF0ZSggVGltZU91dF90ICogY29uc3QgcHhUaW1lT3V0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIENvbXBhcmUgdGhlIHRpbWUgc3RhdHVzIG5vdyB3aXRoIHRoYXQgcHJldmlvdXNseSBjYXB0dXJlZCB0byBzZWUgaWYgdGhlCisgKiB0aW1lb3V0IGhhcyBleHBpcmVkLgorICovCitCYXNlVHlwZV90IHhUYXNrQ2hlY2tGb3JUaW1lT3V0KCBUaW1lT3V0X3QgKiBjb25zdCBweFRpbWVPdXQsIFRpY2tUeXBlX3QgKiBjb25zdCBweFRpY2tzVG9XYWl0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFNob3J0Y3V0IHVzZWQgYnkgdGhlIHF1ZXVlIGltcGxlbWVudGF0aW9uIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgY2FsbCB0bworICogdGFza1lJRUxEKCk7CisgKi8KK3ZvaWQgdlRhc2tNaXNzZWRZaWVsZCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBSZXR1cm5zIHRoZSBzY2hlZHVsZXIgc3RhdGUgYXMgdGFza1NDSEVEVUxFUl9SVU5OSU5HLAorICogdGFza1NDSEVEVUxFUl9OT1RfU1RBUlRFRCBvciB0YXNrU0NIRURVTEVSX1NVU1BFTkRFRC4KKyAqLworQmFzZVR5cGVfdCB4VGFza0dldFNjaGVkdWxlclN0YXRlKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFJhaXNlcyB0aGUgcHJpb3JpdHkgb2YgdGhlIG11dGV4IGhvbGRlciB0byB0aGF0IG9mIHRoZSBjYWxsaW5nIHRhc2sgc2hvdWxkCisgKiB0aGUgbXV0ZXggaG9sZGVyIGhhdmUgYSBwcmlvcml0eSBsZXNzIHRoYW4gdGhlIGNhbGxpbmcgdGFzay4KKyAqLworQmFzZVR5cGVfdCB4VGFza1ByaW9yaXR5SW5oZXJpdCggVGFza0hhbmRsZV90IGNvbnN0IHB4TXV0ZXhIb2xkZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogU2V0IHRoZSBwcmlvcml0eSBvZiBhIHRhc2sgYmFjayB0byBpdHMgcHJvcGVyIHByaW9yaXR5IGluIHRoZSBjYXNlIHRoYXQgaXQKKyAqIGluaGVyaXRlZCBhIGhpZ2hlciBwcmlvcml0eSB3aGlsZSBpdCB3YXMgaG9sZGluZyBhIHNlbWFwaG9yZS4KKyAqLworQmFzZVR5cGVfdCB4VGFza1ByaW9yaXR5RGlzaW5oZXJpdCggVGFza0hhbmRsZV90IGNvbnN0IHB4TXV0ZXhIb2xkZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogSWYgYSBoaWdoZXIgcHJpb3JpdHkgdGFzayBhdHRlbXB0aW5nIHRvIG9idGFpbiBhIG11dGV4IGNhdXNlZCBhIGxvd2VyCisgKiBwcmlvcml0eSB0YXNrIHRvIGluaGVyaXQgdGhlIGhpZ2hlciBwcmlvcml0eSB0YXNrJ3MgcHJpb3JpdHkgLSBidXQgdGhlIGhpZ2hlcgorICogcHJpb3JpdHkgdGFzayB0aGVuIHRpbWVkIG91dCB3aXRob3V0IG9idGFpbmluZyB0aGUgbXV0ZXgsIHRoZW4gdGhlIGxvd2VyCisgKiBwcmlvcml0eSB0YXNrIHdpbGwgZGlzaW5oZXJpdCB0aGUgcHJpb3JpdHkgYWdhaW4gLSBidXQgb25seSBkb3duIGFzIGZhciBhcworICogdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdGFzayB0aGF0IGlzIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBtdXRleCAoaWYgdGhlcmUgd2VyZQorICogbW9yZSB0aGFuIG9uZSB0YXNrIHdhaXRpbmcgZm9yIHRoZSBtdXRleCkuCisgKi8KK3ZvaWQgdlRhc2tQcmlvcml0eURpc2luaGVyaXRBZnRlclRpbWVvdXQoIFRhc2tIYW5kbGVfdCBjb25zdCBweE11dGV4SG9sZGVyLCBVQmFzZVR5cGVfdCB1eEhpZ2hlc3RQcmlvcml0eVdhaXRpbmdUYXNrICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIEdldCB0aGUgdXhUQ0JOdW1iZXIgYXNzaWduZWQgdG8gdGhlIHRhc2sgcmVmZXJlbmNlZCBieSB0aGUgeFRhc2sgcGFyYW1ldGVyLgorICovCitVQmFzZVR5cGVfdCB1eFRhc2tHZXRUYXNrTnVtYmVyKCBUYXNrSGFuZGxlX3QgeFRhc2sgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogU2V0IHRoZSB1eFRhc2tOdW1iZXIgb2YgdGhlIHRhc2sgcmVmZXJlbmNlZCBieSB0aGUgeFRhc2sgcGFyYW1ldGVyIHRvCisgKiB1eEhhbmRsZS4KKyAqLwordm9pZCB2VGFza1NldFRhc2tOdW1iZXIoIFRhc2tIYW5kbGVfdCB4VGFzaywgY29uc3QgVUJhc2VUeXBlX3QgdXhIYW5kbGUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogT25seSBhdmFpbGFibGUgd2hlbiBjb25maWdVU0VfVElDS0xFU1NfSURMRSBpcyBzZXQgdG8gMS4KKyAqIElmIHRpY2tsZXNzIG1vZGUgaXMgYmVpbmcgdXNlZCwgb3IgYSBsb3cgcG93ZXIgbW9kZSBpcyBpbXBsZW1lbnRlZCwgdGhlbgorICogdGhlIHRpY2sgaW50ZXJydXB0IHdpbGwgbm90IGV4ZWN1dGUgZHVyaW5nIGlkbGUgcGVyaW9kcy4gIFdoZW4gdGhpcyBpcyB0aGUKKyAqIGNhc2UsIHRoZSB0aWNrIGNvdW50IHZhbHVlIG1haW50YWluZWQgYnkgdGhlIHNjaGVkdWxlciBuZWVkcyB0byBiZSBrZXB0IHVwCisgKiB0byBkYXRlIHdpdGggdGhlIGFjdHVhbCBleGVjdXRpb24gdGltZSBieSBiZWluZyBza2lwcGVkIGZvcndhcmQgYnkgYSB0aW1lCisgKiBlcXVhbCB0byB0aGUgaWRsZSBwZXJpb2QuCisgKi8KK3ZvaWQgdlRhc2tTdGVwVGljayggY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb0p1bXAgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogT25seSBhdmlsYWJsZSB3aGVuIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFIGlzIHNldCB0byAxLgorICogUHJvdmlkZWQgZm9yIHVzZSB3aXRoaW4gcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCgpIHRvIGFsbG93IHRoZSBwb3J0CisgKiBzcGVjaWZpYyBzbGVlcCBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgaXQgaXMgb2sgdG8gcHJvY2VlZCB3aXRoIHRoZSBzbGVlcCwKKyAqIGFuZCBpZiBpdCBpcyBvayB0byBwcm9jZWVkLCBpZiBpdCBpcyBvayB0byBzbGVlcCBpbmRlZmluaXRlbHkuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBwb3J0U1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQKCkgaXMgb25seQorICogY2FsbGVkIHdpdGggdGhlIHNjaGVkdWxlciBzdXNwZW5kZWQsIG5vdCBmcm9tIHdpdGhpbiBhIGNyaXRpY2FsIHNlY3Rpb24uICBJdAorICogaXMgdGhlcmVmb3JlIHBvc3NpYmxlIGZvciBhbiBpbnRlcnJ1cHQgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoIGJldHdlZW4KKyAqIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAoKSBhbmQgdGhlIGxvdyBwb3dlciBtb2RlIGFjdHVhbGx5IGJlaW5nCisgKiBlbnRlcmVkLiAgZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGEgc2hvcnQKKyAqIGNyaXRpY2FsIHNlY3Rpb24gYmV0d2VlbiB0aGUgdGltZXIgYmVpbmcgc3RvcHBlZCBhbmQgdGhlIHNsZWVwIG1vZGUgYmVpbmcKKyAqIGVudGVyZWQgdG8gZW5zdXJlIGl0IGlzIG9rIHRvIHByb2NlZWQgaW50byB0aGUgc2xlZXAgbW9kZS4KKyAqLworZVNsZWVwTW9kZVN0YXR1cyBlVGFza0NvbmZpcm1TbGVlcE1vZGVTdGF0dXMoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogRm9yIGludGVybmFsIHVzZSBvbmx5LiAgSW5jcmVtZW50IHRoZSBtdXRleCBoZWxkIGNvdW50IHdoZW4gYSBtdXRleCBpcworICogdGFrZW4gYW5kIHJldHVybiB0aGUgaGFuZGxlIG9mIHRoZSB0YXNrIHRoYXQgaGFzIHRha2VuIHRoZSBtdXRleC4KKyAqLwordm9pZCAqcHZUYXNrSW5jcmVtZW50TXV0ZXhIZWxkQ291bnQoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogRm9yIGludGVybmFsIHVzZSBvbmx5LiAgU2FtZSBhcyB2VGFza1NldFRpbWVPdXRTdGF0ZSgpLCBidXQgd2l0aG91dCBhIGNyaXRpYWwKKyAqIHNlY3Rpb24uCisgKi8KK3ZvaWQgdlRhc2tJbnRlcm5hbFNldFRpbWVPdXRTdGF0ZSggVGltZU91dF90ICogY29uc3QgcHhUaW1lT3V0ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIElOQ19UQVNLX0ggKi8KKworCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL3RpbWVycy5oIGIvU291cmNlL2luY2x1ZGUvdGltZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlYjkwZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9pbmNsdWRlL3RpbWVycy5oCkBAIC0wLDAgKzEsMTI3NyBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKworI2lmbmRlZiBUSU1FUlNfSAorI2RlZmluZSBUSU1FUlNfSAorCisjaWZuZGVmIElOQ19GUkVFUlRPU19ICisJI2Vycm9yICJpbmNsdWRlIEZyZWVSVE9TLmggbXVzdCBhcHBlYXIgaW4gc291cmNlIGZpbGVzIGJlZm9yZSBpbmNsdWRlIHRpbWVycy5oIgorI2VuZGlmCisKKy8qbGludCAtc2F2ZSAtZTUzNyBUaGlzIGhlYWRlcnMgYXJlIG9ubHkgbXVsdGlwbHkgaW5jbHVkZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGNvZGUKK2hhcHBlbnMgdG8gYWxzbyBiZSBpbmNsdWRpbmcgdGFzay5oLiAqLworI2luY2x1ZGUgInRhc2suaCIKKy8qbGludCAtcmVzdG9yZSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1BQ1JPUyBBTkQgREVGSU5JVElPTlMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIElEcyBmb3IgY29tbWFuZHMgdGhhdCBjYW4gYmUgc2VudC9yZWNlaXZlZCBvbiB0aGUgdGltZXIgcXVldWUuICBUaGVzZSBhcmUgdG8KK2JlIHVzZWQgc29sZWx5IHRocm91Z2ggdGhlIG1hY3JvcyB0aGF0IG1ha2UgdXAgdGhlIHB1YmxpYyBzb2Z0d2FyZSB0aW1lciBBUEksCithcyBkZWZpbmVkIGJlbG93LiAgVGhlIGNvbW1hbmRzIHRoYXQgYXJlIHNlbnQgZnJvbSBpbnRlcnJ1cHRzIG11c3QgdXNlIHRoZQoraGlnaGVzdCBudW1iZXJzIGFzIHRtckZJUlNUX0ZST01fSVNSX0NPTU1BTkQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHRhc2sKK29yIGludGVycnVwdCB2ZXJzaW9uIG9mIHRoZSBxdWV1ZSBzZW5kIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkLiAqLworI2RlZmluZSB0bXJDT01NQU5EX0VYRUNVVEVfQ0FMTEJBQ0tfRlJPTV9JU1IgCSggKCBCYXNlVHlwZV90ICkgLTIgKQorI2RlZmluZSB0bXJDT01NQU5EX0VYRUNVVEVfQ0FMTEJBQ0sJCQkJKCAoIEJhc2VUeXBlX3QgKSAtMSApCisjZGVmaW5lIHRtckNPTU1BTkRfU1RBUlRfRE9OVF9UUkFDRQkJCQkoICggQmFzZVR5cGVfdCApIDAgKQorI2RlZmluZSB0bXJDT01NQU5EX1NUQVJUCQkJCQkgICAgKCAoIEJhc2VUeXBlX3QgKSAxICkKKyNkZWZpbmUgdG1yQ09NTUFORF9SRVNFVAkJCQkJCSggKCBCYXNlVHlwZV90ICkgMiApCisjZGVmaW5lIHRtckNPTU1BTkRfU1RPUAkJCQkJCQkoICggQmFzZVR5cGVfdCApIDMgKQorI2RlZmluZSB0bXJDT01NQU5EX0NIQU5HRV9QRVJJT0QJCQkJKCAoIEJhc2VUeXBlX3QgKSA0ICkKKyNkZWZpbmUgdG1yQ09NTUFORF9ERUxFVEUJCQkJCQkoICggQmFzZVR5cGVfdCApIDUgKQorCisjZGVmaW5lIHRtckZJUlNUX0ZST01fSVNSX0NPTU1BTkQJCQkJKCAoIEJhc2VUeXBlX3QgKSA2ICkKKyNkZWZpbmUgdG1yQ09NTUFORF9TVEFSVF9GUk9NX0lTUgkJCQkoICggQmFzZVR5cGVfdCApIDYgKQorI2RlZmluZSB0bXJDT01NQU5EX1JFU0VUX0ZST01fSVNSCQkJCSggKCBCYXNlVHlwZV90ICkgNyApCisjZGVmaW5lIHRtckNPTU1BTkRfU1RPUF9GUk9NX0lTUgkJCQkoICggQmFzZVR5cGVfdCApIDggKQorI2RlZmluZSB0bXJDT01NQU5EX0NIQU5HRV9QRVJJT0RfRlJPTV9JU1IJCSggKCBCYXNlVHlwZV90ICkgOSApCisKKworLyoqCisgKiBUeXBlIGJ5IHdoaWNoIHNvZnR3YXJlIHRpbWVycyBhcmUgcmVmZXJlbmNlZC4gIEZvciBleGFtcGxlLCBhIGNhbGwgdG8KKyAqIHhUaW1lckNyZWF0ZSgpIHJldHVybnMgYW4gVGltZXJIYW5kbGVfdCB2YXJpYWJsZSB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgdG8KKyAqIHJlZmVyZW5jZSB0aGUgc3ViamVjdCB0aW1lciBpbiBjYWxscyB0byBvdGhlciBzb2Z0d2FyZSB0aW1lciBBUEkgZnVuY3Rpb25zCisgKiAoZm9yIGV4YW1wbGUsIHhUaW1lclN0YXJ0KCksIHhUaW1lclJlc2V0KCksIGV0Yy4pLgorICovCit0eXBlZGVmIHZvaWQgKiBUaW1lckhhbmRsZV90OworCisvKgorICogRGVmaW5lcyB0aGUgcHJvdG90eXBlIHRvIHdoaWNoIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9ucyBtdXN0IGNvbmZvcm0uCisgKi8KK3R5cGVkZWYgdm9pZCAoKlRpbWVyQ2FsbGJhY2tGdW5jdGlvbl90KSggVGltZXJIYW5kbGVfdCB4VGltZXIgKTsKKworLyoKKyAqIERlZmluZXMgdGhlIHByb3RvdHlwZSB0byB3aGljaCBmdW5jdGlvbnMgdXNlZCB3aXRoIHRoZQorICogeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbEZyb21JU1IoKSBmdW5jdGlvbiBtdXN0IGNvbmZvcm0uCisgKi8KK3R5cGVkZWYgdm9pZCAoKlBlbmRlZEZ1bmN0aW9uX3QpKCB2b2lkICosIHVpbnQzMl90ICk7CisKKy8qKgorICogVGltZXJIYW5kbGVfdCB4VGltZXJDcmVhdGUoIAljb25zdCBjaGFyICogY29uc3QgcGNUaW1lck5hbWUsCisgKiAJCQkJCQkJCVRpY2tUeXBlX3QgeFRpbWVyUGVyaW9kSW5UaWNrcywKKyAqIAkJCQkJCQkJVUJhc2VUeXBlX3QgdXhBdXRvUmVsb2FkLAorICogCQkJCQkJCQl2b2lkICogcHZUaW1lcklELAorICogCQkJCQkJCQlUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCBweENhbGxiYWNrRnVuY3Rpb24gKTsKKyAqCisgKiBDcmVhdGVzIGEgbmV3IHNvZnR3YXJlIHRpbWVyIGluc3RhbmNlLCBhbmQgcmV0dXJucyBhIGhhbmRsZSBieSB3aGljaCB0aGUKKyAqIGNyZWF0ZWQgc29mdHdhcmUgdGltZXIgY2FuIGJlIHJlZmVyZW5jZWQuCisgKgorICogSW50ZXJuYWxseSwgd2l0aGluIHRoZSBGcmVlUlRPUyBpbXBsZW1lbnRhdGlvbiwgc29mdHdhcmUgdGltZXJzIHVzZSBhIGJsb2NrCisgKiBvZiBtZW1vcnksIGluIHdoaWNoIHRoZSB0aW1lciBkYXRhIHN0cnVjdHVyZSBpcyBzdG9yZWQuICBJZiBhIHNvZnR3YXJlIHRpbWVyCisgKiBpcyBjcmVhdGVkIHVzaW5nIHhUaW1lckNyZWF0ZSgpIHRoZW4gdGhlIHJlcXVpcmVkIG1lbW9yeSBpcyBhdXRvbWF0aWNhbGx5CisgKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgaW5zaWRlIHRoZSB4VGltZXJDcmVhdGUoKSBmdW5jdGlvbi4gIChzZWUKKyAqIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExMS5odG1sKS4gIElmIGEgc29mdHdhcmUgdGltZXIgaXMgY3JlYXRlZCB1c2luZworICogeFRpbWVyQ3JlYXRlU3RhdGljKCkgdGhlbiB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG11c3QgcHJvdmlkZSB0aGUgbWVtb3J5IHRoYXQKKyAqIHdpbGwgZ2V0IHVzZWQgYnkgdGhlIHNvZnR3YXJlIHRpbWVyLiAgeFRpbWVyQ3JlYXRlU3RhdGljKCkgdGhlcmVmb3JlIGFsbG93cyBhCisgKiBzb2Z0d2FyZSB0aW1lciB0byBiZSBjcmVhdGVkIHdpdGhvdXQgdXNpbmcgYW55IGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogVGltZXJzIGFyZSBjcmVhdGVkIGluIHRoZSBkb3JtYW50IHN0YXRlLiAgVGhlIHhUaW1lclN0YXJ0KCksIHhUaW1lclJlc2V0KCksCisgKiB4VGltZXJTdGFydEZyb21JU1IoKSwgeFRpbWVyUmVzZXRGcm9tSVNSKCksIHhUaW1lckNoYW5nZVBlcmlvZCgpIGFuZAorICogeFRpbWVyQ2hhbmdlUGVyaW9kRnJvbUlTUigpIEFQSSBmdW5jdGlvbnMgY2FuIGFsbCBiZSB1c2VkIHRvIHRyYW5zaXRpb24gYQorICogdGltZXIgaW50byB0aGUgYWN0aXZlIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwY1RpbWVyTmFtZSBBIHRleHQgbmFtZSB0aGF0IGlzIGFzc2lnbmVkIHRvIHRoZSB0aW1lci4gIFRoaXMgaXMgZG9uZQorICogcHVyZWx5IHRvIGFzc2lzdCBkZWJ1Z2dpbmcuICBUaGUga2VybmVsIGl0c2VsZiBvbmx5IGV2ZXIgcmVmZXJlbmNlcyBhIHRpbWVyCisgKiBieSBpdHMgaGFuZGxlLCBhbmQgbmV2ZXIgYnkgaXRzIG5hbWUuCisgKgorICogQHBhcmFtIHhUaW1lclBlcmlvZEluVGlja3MgVGhlIHRpbWVyIHBlcmlvZC4gIFRoZSB0aW1lIGlzIGRlZmluZWQgaW4gdGljaworICogcGVyaW9kcyBzbyB0aGUgY29uc3RhbnQgcG9ydFRJQ0tfUEVSSU9EX01TIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSB0aW1lIHRoYXQKKyAqIGhhcyBiZWVuIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRpbWVyIG11c3QgZXhwaXJlCisgKiBhZnRlciAxMDAgdGlja3MsIHRoZW4geFRpbWVyUGVyaW9kSW5UaWNrcyBzaG91bGQgYmUgc2V0IHRvIDEwMC4KKyAqIEFsdGVybmF0aXZlbHksIGlmIHRoZSB0aW1lciBtdXN0IGV4cGlyZSBhZnRlciA1MDBtcywgdGhlbiB4UGVyaW9kIGNhbiBiZSBzZXQKKyAqIHRvICggNTAwIC8gcG9ydFRJQ0tfUEVSSU9EX01TICkgcHJvdmlkZWQgY29uZmlnVElDS19SQVRFX0haIGlzIGxlc3MgdGhhbiBvcgorICogZXF1YWwgdG8gMTAwMC4KKyAqCisgKiBAcGFyYW0gdXhBdXRvUmVsb2FkIElmIHV4QXV0b1JlbG9hZCBpcyBzZXQgdG8gcGRUUlVFIHRoZW4gdGhlIHRpbWVyIHdpbGwKKyAqIGV4cGlyZSByZXBlYXRlZGx5IHdpdGggYSBmcmVxdWVuY3kgc2V0IGJ5IHRoZSB4VGltZXJQZXJpb2RJblRpY2tzIHBhcmFtZXRlci4KKyAqIElmIHV4QXV0b1JlbG9hZCBpcyBzZXQgdG8gcGRGQUxTRSB0aGVuIHRoZSB0aW1lciB3aWxsIGJlIGEgb25lLXNob3QgdGltZXIgYW5kCisgKiBlbnRlciB0aGUgZG9ybWFudCBzdGF0ZSBhZnRlciBpdCBleHBpcmVzLgorICoKKyAqIEBwYXJhbSBwdlRpbWVySUQgQW4gaWRlbnRpZmllciB0aGF0IGlzIGFzc2lnbmVkIHRvIHRoZSB0aW1lciBiZWluZyBjcmVhdGVkLgorICogVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgdXNlZCBpbiB0aGUgdGltZXIgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaWRlbnRpZnkgd2hpY2gKKyAqIHRpbWVyIGV4cGlyZWQgd2hlbiB0aGUgc2FtZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBhc3NpZ25lZCB0byBtb3JlIHRoYW4gb25lCisgKiB0aW1lci4KKyAqCisgKiBAcGFyYW0gcHhDYWxsYmFja0Z1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuCisgKiBDYWxsYmFjayBmdW5jdGlvbnMgbXVzdCBoYXZlIHRoZSBwcm90b3R5cGUgZGVmaW5lZCBieSBUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCwKKyAqIHdoaWNoIGlzCSJ2b2lkIHZDYWxsYmFja0Z1bmN0aW9uKCBUaW1lckhhbmRsZV90IHhUaW1lciApOyIuCisgKgorICogQHJldHVybiBJZiB0aGUgdGltZXIgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgdGhlbiBhIGhhbmRsZSB0byB0aGUgbmV3bHkKKyAqIGNyZWF0ZWQgdGltZXIgaXMgcmV0dXJuZWQuICBJZiB0aGUgdGltZXIgY2Fubm90IGJlIGNyZWF0ZWQgKGJlY2F1c2UgZWl0aGVyCisgKiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgRnJlZVJUT1MgaGVhcCByZW1haW5pbmcgdG8gYWxsb2NhdGUgdGhlIHRpbWVyCisgKiBzdHJ1Y3R1cmVzLCBvciB0aGUgdGltZXIgcGVyaW9kIHdhcyBzZXQgdG8gMCkgdGhlbiBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKiBAdmVyYmF0aW0KKyAqICNkZWZpbmUgTlVNX1RJTUVSUyA1CisgKgorICogLy8gQW4gYXJyYXkgdG8gaG9sZCBoYW5kbGVzIHRvIHRoZSBjcmVhdGVkIHRpbWVycy4KKyAqIFRpbWVySGFuZGxlX3QgeFRpbWVyc1sgTlVNX1RJTUVSUyBdOworICoKKyAqIC8vIEFuIGFycmF5IHRvIGhvbGQgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGltZXIgZXhwaXJlcy4KKyAqIGludDMyX3QgbEV4cGlyZUNvdW50ZXJzWyBOVU1fVElNRVJTIF0gPSB7IDAgfTsKKyAqCisgKiAvLyBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBieSBtdWx0aXBsZSB0aW1lciBpbnN0YW5jZXMuCisgKiAvLyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGJ1dCBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZQorICogLy8gYXNzb2NpYXRlZCB0aW1lciBleHBpcmVzLCBhbmQgc3RvcCB0aGUgdGltZXIgb25jZSB0aGUgdGltZXIgaGFzIGV4cGlyZWQKKyAqIC8vIDEwIHRpbWVzLgorICogdm9pZCB2VGltZXJDYWxsYmFjayggVGltZXJIYW5kbGVfdCBweFRpbWVyICkKKyAqIHsKKyAqIGludDMyX3QgbEFycmF5SW5kZXg7CisgKiBjb25zdCBpbnQzMl90IHhNYXhFeHBpcnlDb3VudEJlZm9yZVN0b3BwaW5nID0gMTA7CisgKgorICogCSAgIC8vIE9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGlmIHRoZSBweFRpbWVyIHBhcmFtZXRlciBpcyBOVUxMLgorICogCSAgIGNvbmZpZ0FTU0VSVCggcHhUaW1lciApOworICoKKyAqICAgICAvLyBXaGljaCB0aW1lciBleHBpcmVkPworICogICAgIGxBcnJheUluZGV4ID0gKCBpbnQzMl90ICkgcHZUaW1lckdldFRpbWVySUQoIHB4VGltZXIgKTsKKyAqCisgKiAgICAgLy8gSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBweFRpbWVyIGhhcyBleHBpcmVkLgorICogICAgIGxFeHBpcmVDb3VudGVyc1sgbEFycmF5SW5kZXggXSArPSAxOworICoKKyAqICAgICAvLyBJZiB0aGUgdGltZXIgaGFzIGV4cGlyZWQgMTAgdGltZXMgdGhlbiBzdG9wIGl0IGZyb20gcnVubmluZy4KKyAqICAgICBpZiggbEV4cGlyZUNvdW50ZXJzWyBsQXJyYXlJbmRleCBdID09IHhNYXhFeHBpcnlDb3VudEJlZm9yZVN0b3BwaW5nICkKKyAqICAgICB7CisgKiAgICAgICAgIC8vIERvIG5vdCB1c2UgYSBibG9jayB0aW1lIGlmIGNhbGxpbmcgYSB0aW1lciBBUEkgZnVuY3Rpb24gZnJvbSBhCisgKiAgICAgICAgIC8vIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uLCBhcyBkb2luZyBzbyBjb3VsZCBjYXVzZSBhIGRlYWRsb2NrIQorICogICAgICAgICB4VGltZXJTdG9wKCBweFRpbWVyLCAwICk7CisgKiAgICAgfQorICogfQorICoKKyAqIHZvaWQgbWFpbiggdm9pZCApCisgKiB7CisgKiBpbnQzMl90IHg7CisgKgorICogICAgIC8vIENyZWF0ZSB0aGVuIHN0YXJ0IHNvbWUgdGltZXJzLiAgU3RhcnRpbmcgdGhlIHRpbWVycyBiZWZvcmUgdGhlIHNjaGVkdWxlcgorICogICAgIC8vIGhhcyBiZWVuIHN0YXJ0ZWQgbWVhbnMgdGhlIHRpbWVycyB3aWxsIHN0YXJ0IHJ1bm5pbmcgaW1tZWRpYXRlbHkgdGhhdAorICogICAgIC8vIHRoZSBzY2hlZHVsZXIgc3RhcnRzLgorICogICAgIGZvciggeCA9IDA7IHggPCBOVU1fVElNRVJTOyB4KysgKQorICogICAgIHsKKyAqICAgICAgICAgeFRpbWVyc1sgeCBdID0geFRpbWVyQ3JlYXRlKCAgICAiVGltZXIiLCAgICAgICAvLyBKdXN0IGEgdGV4dCBuYW1lLCBub3QgdXNlZCBieSB0aGUga2VybmVsLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggMTAwICogeCApLCAgIC8vIFRoZSB0aW1lciBwZXJpb2QgaW4gdGlja3MuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRUUlVFLCAgICAgICAgLy8gVGhlIHRpbWVycyB3aWxsIGF1dG8tcmVsb2FkIHRoZW1zZWx2ZXMgd2hlbiB0aGV5IGV4cGlyZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHZvaWQgKiApIHgsICAvLyBBc3NpZ24gZWFjaCB0aW1lciBhIHVuaXF1ZSBpZCBlcXVhbCB0byBpdHMgYXJyYXkgaW5kZXguCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlRpbWVyQ2FsbGJhY2sgLy8gRWFjaCB0aW1lciBjYWxscyB0aGUgc2FtZSBjYWxsYmFjayB3aGVuIGl0IGV4cGlyZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICoKKyAqICAgICAgICAgaWYoIHhUaW1lcnNbIHggXSA9PSBOVUxMICkKKyAqICAgICAgICAgeworICogICAgICAgICAgICAgLy8gVGhlIHRpbWVyIHdhcyBub3QgY3JlYXRlZC4KKyAqICAgICAgICAgfQorICogICAgICAgICBlbHNlCisgKiAgICAgICAgIHsKKyAqICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSB0aW1lci4gIE5vIGJsb2NrIHRpbWUgaXMgc3BlY2lmaWVkLCBhbmQgZXZlbiBpZiBvbmUgd2FzCisgKiAgICAgICAgICAgICAvLyBpdCB3b3VsZCBiZSBpZ25vcmVkIGJlY2F1c2UgdGhlIHNjaGVkdWxlciBoYXMgbm90IHlldCBiZWVuCisgKiAgICAgICAgICAgICAvLyBzdGFydGVkLgorICogICAgICAgICAgICAgaWYoIHhUaW1lclN0YXJ0KCB4VGltZXJzWyB4IF0sIDAgKSAhPSBwZFBBU1MgKQorICogICAgICAgICAgICAgeworICogICAgICAgICAgICAgICAgIC8vIFRoZSB0aW1lciBjb3VsZCBub3QgYmUgc2V0IGludG8gdGhlIEFjdGl2ZSBzdGF0ZS4KKyAqICAgICAgICAgICAgIH0KKyAqICAgICAgICAgfQorICogICAgIH0KKyAqCisgKiAgICAgLy8gLi4uCisgKiAgICAgLy8gQ3JlYXRlIHRhc2tzIGhlcmUuCisgKiAgICAgLy8gLi4uCisgKgorICogICAgIC8vIFN0YXJ0aW5nIHRoZSBzY2hlZHVsZXIgd2lsbCBzdGFydCB0aGUgdGltZXJzIHJ1bm5pbmcgYXMgdGhleSBoYXZlIGFscmVhZHkKKyAqICAgICAvLyBiZWVuIHNldCBpbnRvIHRoZSBhY3RpdmUgc3RhdGUuCisgKiAgICAgdlRhc2tTdGFydFNjaGVkdWxlcigpOworICoKKyAqICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUuCisgKiAgICAgZm9yKCA7OyApOworICogfQorICogQGVuZHZlcmJhdGltCisgKi8KKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisJVGltZXJIYW5kbGVfdCB4VGltZXJDcmVhdGUoCWNvbnN0IGNoYXIgKiBjb25zdCBwY1RpbWVyTmFtZSwJCQkvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KKwkJCQkJCQkJY29uc3QgVGlja1R5cGVfdCB4VGltZXJQZXJpb2RJblRpY2tzLAorCQkJCQkJCQljb25zdCBVQmFzZVR5cGVfdCB1eEF1dG9SZWxvYWQsCisJCQkJCQkJCXZvaWQgKiBjb25zdCBwdlRpbWVySUQsCisJCQkJCQkJCVRpbWVyQ2FsbGJhY2tGdW5jdGlvbl90IHB4Q2FsbGJhY2tGdW5jdGlvbiApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYKKworLyoqCisgKiBUaW1lckhhbmRsZV90IHhUaW1lckNyZWF0ZVN0YXRpYyhjb25zdCBjaGFyICogY29uc3QgcGNUaW1lck5hbWUsCisgKiAJCQkJCQkJCQlUaWNrVHlwZV90IHhUaW1lclBlcmlvZEluVGlja3MsCisgKiAJCQkJCQkJCQlVQmFzZVR5cGVfdCB1eEF1dG9SZWxvYWQsCisgKiAJCQkJCQkJCQl2b2lkICogcHZUaW1lcklELAorICogCQkJCQkJCQkJVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QgcHhDYWxsYmFja0Z1bmN0aW9uLAorICoJCQkJCQkJCQlTdGF0aWNUaW1lcl90ICpweFRpbWVyQnVmZmVyICk7CisgKgorICogQ3JlYXRlcyBhIG5ldyBzb2Z0d2FyZSB0aW1lciBpbnN0YW5jZSwgYW5kIHJldHVybnMgYSBoYW5kbGUgYnkgd2hpY2ggdGhlCisgKiBjcmVhdGVkIHNvZnR3YXJlIHRpbWVyIGNhbiBiZSByZWZlcmVuY2VkLgorICoKKyAqIEludGVybmFsbHksIHdpdGhpbiB0aGUgRnJlZVJUT1MgaW1wbGVtZW50YXRpb24sIHNvZnR3YXJlIHRpbWVycyB1c2UgYSBibG9jaworICogb2YgbWVtb3J5LCBpbiB3aGljaCB0aGUgdGltZXIgZGF0YSBzdHJ1Y3R1cmUgaXMgc3RvcmVkLiAgSWYgYSBzb2Z0d2FyZSB0aW1lcgorICogaXMgY3JlYXRlZCB1c2luZyB4VGltZXJDcmVhdGUoKSB0aGVuIHRoZSByZXF1aXJlZCBtZW1vcnkgaXMgYXV0b21hdGljYWxseQorICogZHluYW1pY2FsbHkgYWxsb2NhdGVkIGluc2lkZSB0aGUgeFRpbWVyQ3JlYXRlKCkgZnVuY3Rpb24uICAoc2VlCisgKiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTEuaHRtbCkuICBJZiBhIHNvZnR3YXJlIHRpbWVyIGlzIGNyZWF0ZWQgdXNpbmcKKyAqIHhUaW1lckNyZWF0ZVN0YXRpYygpIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBtdXN0IHByb3ZpZGUgdGhlIG1lbW9yeSB0aGF0CisgKiB3aWxsIGdldCB1c2VkIGJ5IHRoZSBzb2Z0d2FyZSB0aW1lci4gIHhUaW1lckNyZWF0ZVN0YXRpYygpIHRoZXJlZm9yZSBhbGxvd3MgYQorICogc29mdHdhcmUgdGltZXIgdG8gYmUgY3JlYXRlZCB3aXRob3V0IHVzaW5nIGFueSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIFRpbWVycyBhcmUgY3JlYXRlZCBpbiB0aGUgZG9ybWFudCBzdGF0ZS4gIFRoZSB4VGltZXJTdGFydCgpLCB4VGltZXJSZXNldCgpLAorICogeFRpbWVyU3RhcnRGcm9tSVNSKCksIHhUaW1lclJlc2V0RnJvbUlTUigpLCB4VGltZXJDaGFuZ2VQZXJpb2QoKSBhbmQKKyAqIHhUaW1lckNoYW5nZVBlcmlvZEZyb21JU1IoKSBBUEkgZnVuY3Rpb25zIGNhbiBhbGwgYmUgdXNlZCB0byB0cmFuc2l0aW9uIGEKKyAqIHRpbWVyIGludG8gdGhlIGFjdGl2ZSBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcGNUaW1lck5hbWUgQSB0ZXh0IG5hbWUgdGhhdCBpcyBhc3NpZ25lZCB0byB0aGUgdGltZXIuICBUaGlzIGlzIGRvbmUKKyAqIHB1cmVseSB0byBhc3Npc3QgZGVidWdnaW5nLiAgVGhlIGtlcm5lbCBpdHNlbGYgb25seSBldmVyIHJlZmVyZW5jZXMgYSB0aW1lcgorICogYnkgaXRzIGhhbmRsZSwgYW5kIG5ldmVyIGJ5IGl0cyBuYW1lLgorICoKKyAqIEBwYXJhbSB4VGltZXJQZXJpb2RJblRpY2tzIFRoZSB0aW1lciBwZXJpb2QuICBUaGUgdGltZSBpcyBkZWZpbmVkIGluIHRpY2sKKyAqIHBlcmlvZHMgc28gdGhlIGNvbnN0YW50IHBvcnRUSUNLX1BFUklPRF9NUyBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGEgdGltZSB0aGF0CisgKiBoYXMgYmVlbiBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB0aW1lciBtdXN0IGV4cGlyZQorICogYWZ0ZXIgMTAwIHRpY2tzLCB0aGVuIHhUaW1lclBlcmlvZEluVGlja3Mgc2hvdWxkIGJlIHNldCB0byAxMDAuCisgKiBBbHRlcm5hdGl2ZWx5LCBpZiB0aGUgdGltZXIgbXVzdCBleHBpcmUgYWZ0ZXIgNTAwbXMsIHRoZW4geFBlcmlvZCBjYW4gYmUgc2V0CisgKiB0byAoIDUwMCAvIHBvcnRUSUNLX1BFUklPRF9NUyApIHByb3ZpZGVkIGNvbmZpZ1RJQ0tfUkFURV9IWiBpcyBsZXNzIHRoYW4gb3IKKyAqIGVxdWFsIHRvIDEwMDAuCisgKgorICogQHBhcmFtIHV4QXV0b1JlbG9hZCBJZiB1eEF1dG9SZWxvYWQgaXMgc2V0IHRvIHBkVFJVRSB0aGVuIHRoZSB0aW1lciB3aWxsCisgKiBleHBpcmUgcmVwZWF0ZWRseSB3aXRoIGEgZnJlcXVlbmN5IHNldCBieSB0aGUgeFRpbWVyUGVyaW9kSW5UaWNrcyBwYXJhbWV0ZXIuCisgKiBJZiB1eEF1dG9SZWxvYWQgaXMgc2V0IHRvIHBkRkFMU0UgdGhlbiB0aGUgdGltZXIgd2lsbCBiZSBhIG9uZS1zaG90IHRpbWVyIGFuZAorICogZW50ZXIgdGhlIGRvcm1hbnQgc3RhdGUgYWZ0ZXIgaXQgZXhwaXJlcy4KKyAqCisgKiBAcGFyYW0gcHZUaW1lcklEIEFuIGlkZW50aWZpZXIgdGhhdCBpcyBhc3NpZ25lZCB0byB0aGUgdGltZXIgYmVpbmcgY3JlYXRlZC4KKyAqIFR5cGljYWxseSB0aGlzIHdvdWxkIGJlIHVzZWQgaW4gdGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGlkZW50aWZ5IHdoaWNoCisgKiB0aW1lciBleHBpcmVkIHdoZW4gdGhlIHNhbWUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgYXNzaWduZWQgdG8gbW9yZSB0aGFuIG9uZQorICogdGltZXIuCisgKgorICogQHBhcmFtIHB4Q2FsbGJhY2tGdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSB0aW1lciBleHBpcmVzLgorICogQ2FsbGJhY2sgZnVuY3Rpb25zIG11c3QgaGF2ZSB0aGUgcHJvdG90eXBlIGRlZmluZWQgYnkgVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QsCisgKiB3aGljaCBpcyAidm9pZCB2Q2FsbGJhY2tGdW5jdGlvbiggVGltZXJIYW5kbGVfdCB4VGltZXIgKTsiLgorICoKKyAqIEBwYXJhbSBweFRpbWVyQnVmZmVyIE11c3QgcG9pbnQgdG8gYSB2YXJpYWJsZSBvZiB0eXBlIFN0YXRpY1RpbWVyX3QsIHdoaWNoCisgKiB3aWxsIGJlIHRoZW4gYmUgdXNlZCB0byBob2xkIHRoZSBzb2Z0d2FyZSB0aW1lcidzIGRhdGEgc3RydWN0dXJlcywgcmVtb3ZpbmcKKyAqIHRoZSBuZWVkIGZvciB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseS4KKyAqCisgKiBAcmV0dXJuIElmIHRoZSB0aW1lciBpcyBjcmVhdGVkIHRoZW4gYSBoYW5kbGUgdG8gdGhlIGNyZWF0ZWQgdGltZXIgaXMKKyAqIHJldHVybmVkLiAgSWYgcHhUaW1lckJ1ZmZlciB3YXMgTlVMTCB0aGVuIE5VTEwgaXMgcmV0dXJuZWQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqIEB2ZXJiYXRpbQorICoKKyAqIC8vIFRoZSBidWZmZXIgdXNlZCB0byBob2xkIHRoZSBzb2Z0d2FyZSB0aW1lcidzIGRhdGEgc3RydWN0dXJlLgorICogc3RhdGljIFN0YXRpY1RpbWVyX3QgeFRpbWVyQnVmZmVyOworICoKKyAqIC8vIEEgdmFyaWFibGUgdGhhdCB3aWxsIGJlIGluY3JlbWVudGVkIGJ5IHRoZSBzb2Z0d2FyZSB0aW1lcidzIGNhbGxiYWNrCisgKiAvLyBmdW5jdGlvbi4KKyAqIFVCYXNlVHlwZV90IHV4VmFyaWFibGVUb0luY3JlbWVudCA9IDA7CisgKgorICogLy8gQSBzb2Z0d2FyZSB0aW1lciBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGluY3JlbWVudHMgYSB2YXJpYWJsZSBwYXNzZWQgdG8KKyAqIC8vIGl0IHdoZW4gdGhlIHNvZnR3YXJlIHRpbWVyIHdhcyBjcmVhdGVkLiAgQWZ0ZXIgdGhlIDV0aCBpbmNyZW1lbnQgdGhlCisgKiAvLyBjYWxsYmFjayBmdW5jdGlvbiBzdG9wcyB0aGUgc29mdHdhcmUgdGltZXIuCisgKiBzdGF0aWMgdm9pZCBwcnZUaW1lckNhbGxiYWNrKCBUaW1lckhhbmRsZV90IHhFeHBpcmVkVGltZXIgKQorICogeworICogVUJhc2VUeXBlX3QgKnB1eFZhcmlhYmxlVG9JbmNyZW1lbnQ7CisgKiBCYXNlVHlwZV90IHhSZXR1cm5lZDsKKyAqCisgKiAgICAgLy8gT2J0YWluIHRoZSBhZGRyZXNzIG9mIHRoZSB2YXJpYWJsZSB0byBpbmNyZW1lbnQgZnJvbSB0aGUgdGltZXIgSUQuCisgKiAgICAgcHV4VmFyaWFibGVUb0luY3JlbWVudCA9ICggVUJhc2VUeXBlX3QgKiApIHB2VGltZXJHZXRUaW1lcklEKCB4RXhwaXJlZFRpbWVyICk7CisgKgorICogICAgIC8vIEluY3JlbWVudCB0aGUgdmFyaWFibGUgdG8gc2hvdyB0aGUgdGltZXIgY2FsbGJhY2sgaGFzIGV4ZWN1dGVkLgorICogICAgICggKnB1eFZhcmlhYmxlVG9JbmNyZW1lbnQgKSsrOworICoKKyAqICAgICAvLyBJZiB0aGlzIGNhbGxiYWNrIGhhcyBleGVjdXRlZCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIHRpbWVzLCBzdG9wIHRoZQorICogICAgIC8vIHRpbWVyLgorICogICAgIGlmKCAqcHV4VmFyaWFibGVUb0luY3JlbWVudCA9PSA1ICkKKyAqICAgICB7CisgKiAgICAgICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZyb20gYSB0aW1lciBjYWxsYmFjayBzbyBtdXN0IG5vdCBibG9jay4KKyAqICAgICAgICAgeFRpbWVyU3RvcCggeEV4cGlyZWRUaW1lciwgc3RhdGljRE9OVF9CTE9DSyApOworICogICAgIH0KKyAqIH0KKyAqCisgKgorICogdm9pZCBtYWluKCB2b2lkICkKKyAqIHsKKyAqICAgICAvLyBDcmVhdGUgdGhlIHNvZnR3YXJlIHRpbWUuICB4VGltZXJDcmVhdGVTdGF0aWMoKSBoYXMgYW4gZXh0cmEgcGFyYW1ldGVyCisgKiAgICAgLy8gdGhhbiB0aGUgbm9ybWFsIHhUaW1lckNyZWF0ZSgpIEFQSSBmdW5jdGlvbi4gIFRoZSBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyCisgKiAgICAgLy8gdG8gdGhlIFN0YXRpY1RpbWVyX3Qgc3RydWN0dXJlIHRoYXQgd2lsbCBob2xkIHRoZSBzb2Z0d2FyZSB0aW1lcgorICogICAgIC8vIHN0cnVjdHVyZS4gIElmIHRoZSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGFzIE5VTEwgdGhlbiB0aGUgc3RydWN0dXJlIHdpbGwgYmUKKyAqICAgICAvLyBhbGxvY2F0ZWQgZHluYW1pY2FsbHksIGp1c3QgYXMgaWYgeFRpbWVyQ3JlYXRlKCkgaGFkIGJlZW4gY2FsbGVkLgorICogICAgIHhUaW1lciA9IHhUaW1lckNyZWF0ZVN0YXRpYyggIlQxIiwgICAgICAgICAgICAgLy8gVGV4dCBuYW1lIGZvciB0aGUgdGFzay4gIEhlbHBzIGRlYnVnZ2luZyBvbmx5LiAgTm90IHVzZWQgYnkgRnJlZVJUT1MuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VGltZXJQZXJpb2QsICAgICAvLyBUaGUgcGVyaW9kIG9mIHRoZSB0aW1lciBpbiB0aWNrcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkVFJVRSwgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXV0by1yZWxvYWQgdGltZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHZvaWQgKiApICZ1eFZhcmlhYmxlVG9JbmNyZW1lbnQsICAgIC8vIEEgdmFyaWFibGUgaW5jcmVtZW50ZWQgYnkgdGhlIHNvZnR3YXJlIHRpbWVyJ3MgY2FsbGJhY2sgZnVuY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBydlRpbWVyQ2FsbGJhY2ssIC8vIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeFRpbWVyQnVmZmVyICk7ICAvLyBUaGUgYnVmZmVyIHRoYXQgd2lsbCBob2xkIHRoZSBzb2Z0d2FyZSB0aW1lciBzdHJ1Y3R1cmUuCisgKgorICogICAgIC8vIFRoZSBzY2hlZHVsZXIgaGFzIG5vdCBzdGFydGVkIHlldCBzbyBhIGJsb2NrIHRpbWUgaXMgbm90IHVzZWQuCisgKiAgICAgeFJldHVybmVkID0geFRpbWVyU3RhcnQoIHhUaW1lciwgMCApOworICoKKyAqICAgICAvLyAuLi4KKyAqICAgICAvLyBDcmVhdGUgdGFza3MgaGVyZS4KKyAqICAgICAvLyAuLi4KKyAqCisgKiAgICAgLy8gU3RhcnRpbmcgdGhlIHNjaGVkdWxlciB3aWxsIHN0YXJ0IHRoZSB0aW1lcnMgcnVubmluZyBhcyB0aGV5IGhhdmUgYWxyZWFkeQorICogICAgIC8vIGJlZW4gc2V0IGludG8gdGhlIGFjdGl2ZSBzdGF0ZS4KKyAqICAgICB2VGFza1N0YXJ0U2NoZWR1bGVyKCk7CisgKgorICogICAgIC8vIFNob3VsZCBub3QgcmVhY2ggaGVyZS4KKyAqICAgICBmb3IoIDs7ICk7CisgKiB9CisgKiBAZW5kdmVyYmF0aW0KKyAqLworI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCVRpbWVySGFuZGxlX3QgeFRpbWVyQ3JlYXRlU3RhdGljKAljb25zdCBjaGFyICogY29uc3QgcGNUaW1lck5hbWUsCQkJLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisJCQkJCQkJCQkJY29uc3QgVGlja1R5cGVfdCB4VGltZXJQZXJpb2RJblRpY2tzLAorCQkJCQkJCQkJCWNvbnN0IFVCYXNlVHlwZV90IHV4QXV0b1JlbG9hZCwKKwkJCQkJCQkJCQl2b2lkICogY29uc3QgcHZUaW1lcklELAorCQkJCQkJCQkJCVRpbWVyQ2FsbGJhY2tGdW5jdGlvbl90IHB4Q2FsbGJhY2tGdW5jdGlvbiwKKwkJCQkJCQkJCQlTdGF0aWNUaW1lcl90ICpweFRpbWVyQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZiAvKiBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OICovCisKKy8qKgorICogdm9pZCAqcHZUaW1lckdldFRpbWVySUQoIFRpbWVySGFuZGxlX3QgeFRpbWVyICk7CisgKgorICogUmV0dXJucyB0aGUgSUQgYXNzaWduZWQgdG8gdGhlIHRpbWVyLgorICoKKyAqIElEcyBhcmUgYXNzaWduZWQgdG8gdGltZXJzIHVzaW5nIHRoZSBwdlRpbWVySUQgcGFyYW1ldGVyIG9mIHRoZSBjYWxsIHRvCisgKiB4VGltZXJDcmVhdGVkKCkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHRpbWVyLCBhbmQgYnkgY2FsbGluZyB0aGUKKyAqIHZUaW1lclNldFRpbWVySUQoKSBBUEkgZnVuY3Rpb24uCisgKgorICogSWYgdGhlIHNhbWUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgYXNzaWduZWQgdG8gbXVsdGlwbGUgdGltZXJzIHRoZW4gdGhlIHRpbWVyCisgKiBJRCBjYW4gYmUgdXNlZCBhcyB0aW1lIHNwZWNpZmljICh0aW1lciBsb2NhbCkgc3RvcmFnZS4KKyAqCisgKiBAcGFyYW0geFRpbWVyIFRoZSB0aW1lciBiZWluZyBxdWVyaWVkLgorICoKKyAqIEByZXR1cm4gVGhlIElEIGFzc2lnbmVkIHRvIHRoZSB0aW1lciBiZWluZyBxdWVyaWVkLgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKgorICogU2VlIHRoZSB4VGltZXJDcmVhdGUoKSBBUEkgZnVuY3Rpb24gZXhhbXBsZSB1c2FnZSBzY2VuYXJpby4KKyAqLwordm9pZCAqcHZUaW1lckdldFRpbWVySUQoIGNvbnN0IFRpbWVySGFuZGxlX3QgeFRpbWVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiB2b2lkIHZUaW1lclNldFRpbWVySUQoIFRpbWVySGFuZGxlX3QgeFRpbWVyLCB2b2lkICpwdk5ld0lEICk7CisgKgorICogU2V0cyB0aGUgSUQgYXNzaWduZWQgdG8gdGhlIHRpbWVyLgorICoKKyAqIElEcyBhcmUgYXNzaWduZWQgdG8gdGltZXJzIHVzaW5nIHRoZSBwdlRpbWVySUQgcGFyYW1ldGVyIG9mIHRoZSBjYWxsIHRvCisgKiB4VGltZXJDcmVhdGVkKCkgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHRpbWVyLgorICoKKyAqIElmIHRoZSBzYW1lIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGFzc2lnbmVkIHRvIG11bHRpcGxlIHRpbWVycyB0aGVuIHRoZSB0aW1lcgorICogSUQgY2FuIGJlIHVzZWQgYXMgdGltZSBzcGVjaWZpYyAodGltZXIgbG9jYWwpIHN0b3JhZ2UuCisgKgorICogQHBhcmFtIHhUaW1lciBUaGUgdGltZXIgYmVpbmcgdXBkYXRlZC4KKyAqCisgKiBAcGFyYW0gcHZOZXdJRCBUaGUgSUQgdG8gYXNzaWduIHRvIHRoZSB0aW1lci4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICoKKyAqIFNlZSB0aGUgeFRpbWVyQ3JlYXRlKCkgQVBJIGZ1bmN0aW9uIGV4YW1wbGUgdXNhZ2Ugc2NlbmFyaW8uCisgKi8KK3ZvaWQgdlRpbWVyU2V0VGltZXJJRCggVGltZXJIYW5kbGVfdCB4VGltZXIsIHZvaWQgKnB2TmV3SUQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEJhc2VUeXBlX3QgeFRpbWVySXNUaW1lckFjdGl2ZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKTsKKyAqCisgKiBRdWVyaWVzIGEgdGltZXIgdG8gc2VlIGlmIGl0IGlzIGFjdGl2ZSBvciBkb3JtYW50LgorICoKKyAqIEEgdGltZXIgd2lsbCBiZSBkb3JtYW50IGlmOgorICogICAgIDEpIEl0IGhhcyBiZWVuIGNyZWF0ZWQgYnV0IG5vdCBzdGFydGVkLCBvcgorICogICAgIDIpIEl0IGlzIGFuIGV4cGlyZWQgb25lLXNob3QgdGltZXIgdGhhdCBoYXMgbm90IGJlZW4gcmVzdGFydGVkLgorICoKKyAqIFRpbWVycyBhcmUgY3JlYXRlZCBpbiB0aGUgZG9ybWFudCBzdGF0ZS4gIFRoZSB4VGltZXJTdGFydCgpLCB4VGltZXJSZXNldCgpLAorICogeFRpbWVyU3RhcnRGcm9tSVNSKCksIHhUaW1lclJlc2V0RnJvbUlTUigpLCB4VGltZXJDaGFuZ2VQZXJpb2QoKSBhbmQKKyAqIHhUaW1lckNoYW5nZVBlcmlvZEZyb21JU1IoKSBBUEkgZnVuY3Rpb25zIGNhbiBhbGwgYmUgdXNlZCB0byB0cmFuc2l0aW9uIGEgdGltZXIgaW50byB0aGUKKyAqIGFjdGl2ZSBzdGF0ZS4KKyAqCisgKiBAcGFyYW0geFRpbWVyIFRoZSB0aW1lciBiZWluZyBxdWVyaWVkLgorICoKKyAqIEByZXR1cm4gcGRGQUxTRSB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSB0aW1lciBpcyBkb3JtYW50LiAgQSB2YWx1ZSBvdGhlciB0aGFuCisgKiBwZEZBTFNFIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHRpbWVyIGlzIGFjdGl2ZS4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICogQHZlcmJhdGltCisgKiAvLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgeFRpbWVyIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZC4KKyAqIHZvaWQgdkFGdW5jdGlvbiggVGltZXJIYW5kbGVfdCB4VGltZXIgKQorICogeworICogICAgIGlmKCB4VGltZXJJc1RpbWVyQWN0aXZlKCB4VGltZXIgKSAhPSBwZEZBTFNFICkgLy8gb3IgbW9yZSBzaW1wbHkgYW5kIGVxdWl2YWxlbnRseSAiaWYoIHhUaW1lcklzVGltZXJBY3RpdmUoIHhUaW1lciApICkiCisgKiAgICAgeworICogICAgICAgICAvLyB4VGltZXIgaXMgYWN0aXZlLCBkbyBzb21ldGhpbmcuCisgKiAgICAgfQorICogICAgIGVsc2UKKyAqICAgICB7CisgKiAgICAgICAgIC8vIHhUaW1lciBpcyBub3QgYWN0aXZlLCBkbyBzb21ldGhpbmcgZWxzZS4KKyAqICAgICB9CisgKiB9CisgKiBAZW5kdmVyYmF0aW0KKyAqLworQmFzZVR5cGVfdCB4VGltZXJJc1RpbWVyQWN0aXZlKCBUaW1lckhhbmRsZV90IHhUaW1lciApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogVGFza0hhbmRsZV90IHhUaW1lckdldFRpbWVyRGFlbW9uVGFza0hhbmRsZSggdm9pZCApOworICoKKyAqIFNpbXBseSByZXR1cm5zIHRoZSBoYW5kbGUgb2YgdGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2suICBJdCBpdCBub3QgdmFsaWQKKyAqIHRvIGNhbGwgeFRpbWVyR2V0VGltZXJEYWVtb25UYXNrSGFuZGxlKCkgYmVmb3JlIHRoZSBzY2hlZHVsZXIgaGFzIGJlZW4gc3RhcnRlZC4KKyAqLworVGFza0hhbmRsZV90IHhUaW1lckdldFRpbWVyRGFlbW9uVGFza0hhbmRsZSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQmFzZVR5cGVfdCB4VGltZXJTdGFydCggVGltZXJIYW5kbGVfdCB4VGltZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7CisgKgorICogVGltZXIgZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSBhIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2suICBNYW55IG9mIHRoZQorICogcHVibGljIEZyZWVSVE9TIHRpbWVyIEFQSSBmdW5jdGlvbnMgc2VuZCBjb21tYW5kcyB0byB0aGUgdGltZXIgc2VydmljZSB0YXNrCisgKiB0aHJvdWdoIGEgcXVldWUgY2FsbGVkIHRoZSB0aW1lciBjb21tYW5kIHF1ZXVlLiAgVGhlIHRpbWVyIGNvbW1hbmQgcXVldWUgaXMKKyAqIHByaXZhdGUgdG8gdGhlIGtlcm5lbCBpdHNlbGYgYW5kIGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9uCisgKiBjb2RlLiAgVGhlIGxlbmd0aCBvZiB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZSBpcyBzZXQgYnkgdGhlCisgKiBjb25maWdUSU1FUl9RVUVVRV9MRU5HVEggY29uZmlndXJhdGlvbiBjb25zdGFudC4KKyAqCisgKiB4VGltZXJTdGFydCgpIHN0YXJ0cyBhIHRpbWVyIHRoYXQgd2FzIHByZXZpb3VzbHkgY3JlYXRlZCB1c2luZyB0aGUKKyAqIHhUaW1lckNyZWF0ZSgpIEFQSSBmdW5jdGlvbi4gIElmIHRoZSB0aW1lciBoYWQgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgYW5kIHdhcworICogYWxyZWFkeSBpbiB0aGUgYWN0aXZlIHN0YXRlLCB0aGVuIHhUaW1lclN0YXJ0KCkgaGFzIGVxdWl2YWxlbnQgZnVuY3Rpb25hbGl0eQorICogdG8gdGhlIHhUaW1lclJlc2V0KCkgQVBJIGZ1bmN0aW9uLgorICoKKyAqIFN0YXJ0aW5nIGEgdGltZXIgZW5zdXJlcyB0aGUgdGltZXIgaXMgaW4gdGhlIGFjdGl2ZSBzdGF0ZS4gIElmIHRoZSB0aW1lcgorICogaXMgbm90IHN0b3BwZWQsIGRlbGV0ZWQsIG9yIHJlc2V0IGluIHRoZSBtZWFuIHRpbWUsIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0aW1lciB3aWxsIGdldCBjYWxsZWQgJ24nIHRpY2tzIGFmdGVyIHhUaW1lclN0YXJ0KCkgd2FzCisgKiBjYWxsZWQsIHdoZXJlICduJyBpcyB0aGUgdGltZXJzIGRlZmluZWQgcGVyaW9kLgorICoKKyAqIEl0IGlzIHZhbGlkIHRvIGNhbGwgeFRpbWVyU3RhcnQoKSBiZWZvcmUgdGhlIHNjaGVkdWxlciBoYXMgYmVlbiBzdGFydGVkLCBidXQKKyAqIHdoZW4gdGhpcyBpcyBkb25lIHRoZSB0aW1lciB3aWxsIG5vdCBhY3R1YWxseSBzdGFydCB1bnRpbCB0aGUgc2NoZWR1bGVyIGlzCisgKiBzdGFydGVkLCBhbmQgdGhlIHRpbWVycyBleHBpcnkgdGltZSB3aWxsIGJlIHJlbGF0aXZlIHRvIHdoZW4gdGhlIHNjaGVkdWxlciBpcworICogc3RhcnRlZCwgbm90IHJlbGF0aXZlIHRvIHdoZW4geFRpbWVyU3RhcnQoKSB3YXMgY2FsbGVkLgorICoKKyAqIFRoZSBjb25maWdVU0VfVElNRVJTIGNvbmZpZ3VyYXRpb24gY29uc3RhbnQgbXVzdCBiZSBzZXQgdG8gMSBmb3IgeFRpbWVyU3RhcnQoKQorICogdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIEBwYXJhbSB4VGltZXIgVGhlIGhhbmRsZSBvZiB0aGUgdGltZXIgYmVpbmcgc3RhcnRlZC9yZXN0YXJ0ZWQuCisgKgorICogQHBhcmFtIHhUaWNrc1RvV2FpdCBTcGVjaWZpZXMgdGhlIHRpbWUsIGluIHRpY2tzLCB0aGF0IHRoZSBjYWxsaW5nIHRhc2sgc2hvdWxkCisgKiBiZSBoZWxkIGluIHRoZSBCbG9ja2VkIHN0YXRlIHRvIHdhaXQgZm9yIHRoZSBzdGFydCBjb21tYW5kIHRvIGJlIHN1Y2Nlc3NmdWxseQorICogc2VudCB0byB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZSwgc2hvdWxkIHRoZSBxdWV1ZSBhbHJlYWR5IGJlIGZ1bGwgd2hlbgorICogeFRpbWVyU3RhcnQoKSB3YXMgY2FsbGVkLiAgeFRpY2tzVG9XYWl0IGlzIGlnbm9yZWQgaWYgeFRpbWVyU3RhcnQoKSBpcyBjYWxsZWQKKyAqIGJlZm9yZSB0aGUgc2NoZWR1bGVyIGlzIHN0YXJ0ZWQuCisgKgorICogQHJldHVybiBwZEZBSUwgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgc3RhcnQgY29tbWFuZCBjb3VsZCBub3QgYmUgc2VudCB0bworICogdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUgZXZlbiBhZnRlciB4VGlja3NUb1dhaXQgdGlja3MgaGFkIHBhc3NlZC4gIHBkUEFTUyB3aWxsCisgKiBiZSByZXR1cm5lZCBpZiB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUuCisgKiBXaGVuIHRoZSBjb21tYW5kIGlzIGFjdHVhbGx5IHByb2Nlc3NlZCB3aWxsIGRlcGVuZCBvbiB0aGUgcHJpb3JpdHkgb2YgdGhlCisgKiB0aW1lciBzZXJ2aWNlL2RhZW1vbiB0YXNrIHJlbGF0aXZlIHRvIG90aGVyIHRhc2tzIGluIHRoZSBzeXN0ZW0sIGFsdGhvdWdoIHRoZQorICogdGltZXJzIGV4cGlyeSB0aW1lIGlzIHJlbGF0aXZlIHRvIHdoZW4geFRpbWVyU3RhcnQoKSBpcyBhY3R1YWxseSBjYWxsZWQuICBUaGUKKyAqIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sgcHJpb3JpdHkgaXMgc2V0IGJ5IHRoZSBjb25maWdUSU1FUl9UQVNLX1BSSU9SSVRZCisgKiBjb25maWd1cmF0aW9uIGNvbnN0YW50LgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKgorICogU2VlIHRoZSB4VGltZXJDcmVhdGUoKSBBUEkgZnVuY3Rpb24gZXhhbXBsZSB1c2FnZSBzY2VuYXJpby4KKyAqCisgKi8KKyNkZWZpbmUgeFRpbWVyU3RhcnQoIHhUaW1lciwgeFRpY2tzVG9XYWl0ICkgeFRpbWVyR2VuZXJpY0NvbW1hbmQoICggeFRpbWVyICksIHRtckNPTU1BTkRfU1RBUlQsICggeFRhc2tHZXRUaWNrQ291bnQoKSApLCBOVUxMLCAoIHhUaWNrc1RvV2FpdCApICkKKworLyoqCisgKiBCYXNlVHlwZV90IHhUaW1lclN0b3AoIFRpbWVySGFuZGxlX3QgeFRpbWVyLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOworICoKKyAqIFRpbWVyIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgYSB0aW1lciBzZXJ2aWNlL2RhZW1vbiB0YXNrLiAgTWFueSBvZiB0aGUKKyAqIHB1YmxpYyBGcmVlUlRPUyB0aW1lciBBUEkgZnVuY3Rpb25zIHNlbmQgY29tbWFuZHMgdG8gdGhlIHRpbWVyIHNlcnZpY2UgdGFzaworICogdGhyb3VnaCBhIHF1ZXVlIGNhbGxlZCB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZS4gIFRoZSB0aW1lciBjb21tYW5kIHF1ZXVlIGlzCisgKiBwcml2YXRlIHRvIHRoZSBrZXJuZWwgaXRzZWxmIGFuZCBpcyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSB0byBhcHBsaWNhdGlvbgorICogY29kZS4gIFRoZSBsZW5ndGggb2YgdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUgaXMgc2V0IGJ5IHRoZQorICogY29uZmlnVElNRVJfUVVFVUVfTEVOR1RIIGNvbmZpZ3VyYXRpb24gY29uc3RhbnQuCisgKgorICogeFRpbWVyU3RvcCgpIHN0b3BzIGEgdGltZXIgdGhhdCB3YXMgcHJldmlvdXNseSBzdGFydGVkIHVzaW5nIGVpdGhlciBvZiB0aGUKKyAqIFRoZSB4VGltZXJTdGFydCgpLCB4VGltZXJSZXNldCgpLCB4VGltZXJTdGFydEZyb21JU1IoKSwgeFRpbWVyUmVzZXRGcm9tSVNSKCksCisgKiB4VGltZXJDaGFuZ2VQZXJpb2QoKSBvciB4VGltZXJDaGFuZ2VQZXJpb2RGcm9tSVNSKCkgQVBJIGZ1bmN0aW9ucy4KKyAqCisgKiBTdG9wcGluZyBhIHRpbWVyIGVuc3VyZXMgdGhlIHRpbWVyIGlzIG5vdCBpbiB0aGUgYWN0aXZlIHN0YXRlLgorICoKKyAqIFRoZSBjb25maWdVU0VfVElNRVJTIGNvbmZpZ3VyYXRpb24gY29uc3RhbnQgbXVzdCBiZSBzZXQgdG8gMSBmb3IgeFRpbWVyU3RvcCgpCisgKiB0byBiZSBhdmFpbGFibGUuCisgKgorICogQHBhcmFtIHhUaW1lciBUaGUgaGFuZGxlIG9mIHRoZSB0aW1lciBiZWluZyBzdG9wcGVkLgorICoKKyAqIEBwYXJhbSB4VGlja3NUb1dhaXQgU3BlY2lmaWVzIHRoZSB0aW1lLCBpbiB0aWNrcywgdGhhdCB0aGUgY2FsbGluZyB0YXNrIHNob3VsZAorICogYmUgaGVsZCBpbiB0aGUgQmxvY2tlZCBzdGF0ZSB0byB3YWl0IGZvciB0aGUgc3RvcCBjb21tYW5kIHRvIGJlIHN1Y2Nlc3NmdWxseQorICogc2VudCB0byB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZSwgc2hvdWxkIHRoZSBxdWV1ZSBhbHJlYWR5IGJlIGZ1bGwgd2hlbgorICogeFRpbWVyU3RvcCgpIHdhcyBjYWxsZWQuICB4VGlja3NUb1dhaXQgaXMgaWdub3JlZCBpZiB4VGltZXJTdG9wKCkgaXMgY2FsbGVkCisgKiBiZWZvcmUgdGhlIHNjaGVkdWxlciBpcyBzdGFydGVkLgorICoKKyAqIEByZXR1cm4gcGRGQUlMIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHN0b3AgY29tbWFuZCBjb3VsZCBub3QgYmUgc2VudCB0bworICogdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUgZXZlbiBhZnRlciB4VGlja3NUb1dhaXQgdGlja3MgaGFkIHBhc3NlZC4gIHBkUEFTUyB3aWxsCisgKiBiZSByZXR1cm5lZCBpZiB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUuCisgKiBXaGVuIHRoZSBjb21tYW5kIGlzIGFjdHVhbGx5IHByb2Nlc3NlZCB3aWxsIGRlcGVuZCBvbiB0aGUgcHJpb3JpdHkgb2YgdGhlCisgKiB0aW1lciBzZXJ2aWNlL2RhZW1vbiB0YXNrIHJlbGF0aXZlIHRvIG90aGVyIHRhc2tzIGluIHRoZSBzeXN0ZW0uICBUaGUgdGltZXIKKyAqIHNlcnZpY2UvZGFlbW9uIHRhc2sgcHJpb3JpdHkgaXMgc2V0IGJ5IHRoZSBjb25maWdUSU1FUl9UQVNLX1BSSU9SSVRZCisgKiBjb25maWd1cmF0aW9uIGNvbnN0YW50LgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKgorICogU2VlIHRoZSB4VGltZXJDcmVhdGUoKSBBUEkgZnVuY3Rpb24gZXhhbXBsZSB1c2FnZSBzY2VuYXJpby4KKyAqCisgKi8KKyNkZWZpbmUgeFRpbWVyU3RvcCggeFRpbWVyLCB4VGlja3NUb1dhaXQgKSB4VGltZXJHZW5lcmljQ29tbWFuZCggKCB4VGltZXIgKSwgdG1yQ09NTUFORF9TVE9QLCAwVSwgTlVMTCwgKCB4VGlja3NUb1dhaXQgKSApCisKKy8qKgorICogQmFzZVR5cGVfdCB4VGltZXJDaGFuZ2VQZXJpb2QoIAlUaW1lckhhbmRsZV90IHhUaW1lciwKKyAqCQkJCQkJCQkJCVRpY2tUeXBlX3QgeE5ld1BlcmlvZCwKKyAqCQkJCQkJCQkJCVRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7CisgKgorICogVGltZXIgZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSBhIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2suICBNYW55IG9mIHRoZQorICogcHVibGljIEZyZWVSVE9TIHRpbWVyIEFQSSBmdW5jdGlvbnMgc2VuZCBjb21tYW5kcyB0byB0aGUgdGltZXIgc2VydmljZSB0YXNrCisgKiB0aHJvdWdoIGEgcXVldWUgY2FsbGVkIHRoZSB0aW1lciBjb21tYW5kIHF1ZXVlLiAgVGhlIHRpbWVyIGNvbW1hbmQgcXVldWUgaXMKKyAqIHByaXZhdGUgdG8gdGhlIGtlcm5lbCBpdHNlbGYgYW5kIGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9uCisgKiBjb2RlLiAgVGhlIGxlbmd0aCBvZiB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZSBpcyBzZXQgYnkgdGhlCisgKiBjb25maWdUSU1FUl9RVUVVRV9MRU5HVEggY29uZmlndXJhdGlvbiBjb25zdGFudC4KKyAqCisgKiB4VGltZXJDaGFuZ2VQZXJpb2QoKSBjaGFuZ2VzIHRoZSBwZXJpb2Qgb2YgYSB0aW1lciB0aGF0IHdhcyBwcmV2aW91c2x5CisgKiBjcmVhdGVkIHVzaW5nIHRoZSB4VGltZXJDcmVhdGUoKSBBUEkgZnVuY3Rpb24uCisgKgorICogeFRpbWVyQ2hhbmdlUGVyaW9kKCkgY2FuIGJlIGNhbGxlZCB0byBjaGFuZ2UgdGhlIHBlcmlvZCBvZiBhbiBhY3RpdmUgb3IKKyAqIGRvcm1hbnQgc3RhdGUgdGltZXIuCisgKgorICogVGhlIGNvbmZpZ1VTRV9USU1FUlMgY29uZmlndXJhdGlvbiBjb25zdGFudCBtdXN0IGJlIHNldCB0byAxIGZvcgorICogeFRpbWVyQ2hhbmdlUGVyaW9kKCkgdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIEBwYXJhbSB4VGltZXIgVGhlIGhhbmRsZSBvZiB0aGUgdGltZXIgdGhhdCBpcyBoYXZpbmcgaXRzIHBlcmlvZCBjaGFuZ2VkLgorICoKKyAqIEBwYXJhbSB4TmV3UGVyaW9kIFRoZSBuZXcgcGVyaW9kIGZvciB4VGltZXIuIFRpbWVyIHBlcmlvZHMgYXJlIHNwZWNpZmllZCBpbgorICogdGljayBwZXJpb2RzLCBzbyB0aGUgY29uc3RhbnQgcG9ydFRJQ0tfUEVSSU9EX01TIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYSB0aW1lCisgKiB0aGF0IGhhcyBiZWVuIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRpbWVyIG11c3QKKyAqIGV4cGlyZSBhZnRlciAxMDAgdGlja3MsIHRoZW4geE5ld1BlcmlvZCBzaG91bGQgYmUgc2V0IHRvIDEwMC4gIEFsdGVybmF0aXZlbHksCisgKiBpZiB0aGUgdGltZXIgbXVzdCBleHBpcmUgYWZ0ZXIgNTAwbXMsIHRoZW4geE5ld1BlcmlvZCBjYW4gYmUgc2V0IHRvCisgKiAoIDUwMCAvIHBvcnRUSUNLX1BFUklPRF9NUyApIHByb3ZpZGVkIGNvbmZpZ1RJQ0tfUkFURV9IWiBpcyBsZXNzIHRoYW4KKyAqIG9yIGVxdWFsIHRvIDEwMDAuCisgKgorICogQHBhcmFtIHhUaWNrc1RvV2FpdCBTcGVjaWZpZXMgdGhlIHRpbWUsIGluIHRpY2tzLCB0aGF0IHRoZSBjYWxsaW5nIHRhc2sgc2hvdWxkCisgKiBiZSBoZWxkIGluIHRoZSBCbG9ja2VkIHN0YXRlIHRvIHdhaXQgZm9yIHRoZSBjaGFuZ2UgcGVyaW9kIGNvbW1hbmQgdG8gYmUKKyAqIHN1Y2Nlc3NmdWxseSBzZW50IHRvIHRoZSB0aW1lciBjb21tYW5kIHF1ZXVlLCBzaG91bGQgdGhlIHF1ZXVlIGFscmVhZHkgYmUKKyAqIGZ1bGwgd2hlbiB4VGltZXJDaGFuZ2VQZXJpb2QoKSB3YXMgY2FsbGVkLiAgeFRpY2tzVG9XYWl0IGlzIGlnbm9yZWQgaWYKKyAqIHhUaW1lckNoYW5nZVBlcmlvZCgpIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHNjaGVkdWxlciBpcyBzdGFydGVkLgorICoKKyAqIEByZXR1cm4gcGRGQUlMIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNoYW5nZSBwZXJpb2QgY29tbWFuZCBjb3VsZCBub3QgYmUKKyAqIHNlbnQgdG8gdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUgZXZlbiBhZnRlciB4VGlja3NUb1dhaXQgdGlja3MgaGFkIHBhc3NlZC4KKyAqIHBkUEFTUyB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBjb21tYW5kIHdhcyBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgdGltZXIKKyAqIGNvbW1hbmQgcXVldWUuICBXaGVuIHRoZSBjb21tYW5kIGlzIGFjdHVhbGx5IHByb2Nlc3NlZCB3aWxsIGRlcGVuZCBvbiB0aGUKKyAqIHByaW9yaXR5IG9mIHRoZSB0aW1lciBzZXJ2aWNlL2RhZW1vbiB0YXNrIHJlbGF0aXZlIHRvIG90aGVyIHRhc2tzIGluIHRoZQorICogc3lzdGVtLiAgVGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sgcHJpb3JpdHkgaXMgc2V0IGJ5IHRoZQorICogY29uZmlnVElNRVJfVEFTS19QUklPUklUWSBjb25maWd1cmF0aW9uIGNvbnN0YW50LgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKiBAdmVyYmF0aW0KKyAqIC8vIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB4VGltZXIgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLiAgSWYgdGhlIHRpbWVyCisgKiAvLyByZWZlcmVuY2VkIGJ5IHhUaW1lciBpcyBhbHJlYWR5IGFjdGl2ZSB3aGVuIGl0IGlzIGNhbGxlZCwgdGhlbiB0aGUgdGltZXIKKyAqIC8vIGlzIGRlbGV0ZWQuICBJZiB0aGUgdGltZXIgcmVmZXJlbmNlZCBieSB4VGltZXIgaXMgbm90IGFjdGl2ZSB3aGVuIGl0IGlzCisgKiAvLyBjYWxsZWQsIHRoZW4gdGhlIHBlcmlvZCBvZiB0aGUgdGltZXIgaXMgc2V0IHRvIDUwMG1zIGFuZCB0aGUgdGltZXIgaXMKKyAqIC8vIHN0YXJ0ZWQuCisgKiB2b2lkIHZBRnVuY3Rpb24oIFRpbWVySGFuZGxlX3QgeFRpbWVyICkKKyAqIHsKKyAqICAgICBpZiggeFRpbWVySXNUaW1lckFjdGl2ZSggeFRpbWVyICkgIT0gcGRGQUxTRSApIC8vIG9yIG1vcmUgc2ltcGx5IGFuZCBlcXVpdmFsZW50bHkgImlmKCB4VGltZXJJc1RpbWVyQWN0aXZlKCB4VGltZXIgKSApIgorICogICAgIHsKKyAqICAgICAgICAgLy8geFRpbWVyIGlzIGFscmVhZHkgYWN0aXZlIC0gZGVsZXRlIGl0LgorICogICAgICAgICB4VGltZXJEZWxldGUoIHhUaW1lciApOworICogICAgIH0KKyAqICAgICBlbHNlCisgKiAgICAgeworICogICAgICAgICAvLyB4VGltZXIgaXMgbm90IGFjdGl2ZSwgY2hhbmdlIGl0cyBwZXJpb2QgdG8gNTAwbXMuICBUaGlzIHdpbGwgYWxzbworICogICAgICAgICAvLyBjYXVzZSB0aGUgdGltZXIgdG8gc3RhcnQuICBCbG9jayBmb3IgYSBtYXhpbXVtIG9mIDEwMCB0aWNrcyBpZiB0aGUKKyAqICAgICAgICAgLy8gY2hhbmdlIHBlcmlvZCBjb21tYW5kIGNhbm5vdCBpbW1lZGlhdGVseSBiZSBzZW50IHRvIHRoZSB0aW1lcgorICogICAgICAgICAvLyBjb21tYW5kIHF1ZXVlLgorICogICAgICAgICBpZiggeFRpbWVyQ2hhbmdlUGVyaW9kKCB4VGltZXIsIDUwMCAvIHBvcnRUSUNLX1BFUklPRF9NUywgMTAwICkgPT0gcGRQQVNTICkKKyAqICAgICAgICAgeworICogICAgICAgICAgICAgLy8gVGhlIGNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWxseSBzZW50LgorICogICAgICAgICB9CisgKiAgICAgICAgIGVsc2UKKyAqICAgICAgICAgeworICogICAgICAgICAgICAgLy8gVGhlIGNvbW1hbmQgY291bGQgbm90IGJlIHNlbnQsIGV2ZW4gYWZ0ZXIgd2FpdGluZyBmb3IgMTAwIHRpY2tzCisgKiAgICAgICAgICAgICAvLyB0byBwYXNzLiAgVGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaGVyZS4KKyAqICAgICAgICAgfQorICogICAgIH0KKyAqIH0KKyAqIEBlbmR2ZXJiYXRpbQorICovCisgI2RlZmluZSB4VGltZXJDaGFuZ2VQZXJpb2QoIHhUaW1lciwgeE5ld1BlcmlvZCwgeFRpY2tzVG9XYWl0ICkgeFRpbWVyR2VuZXJpY0NvbW1hbmQoICggeFRpbWVyICksIHRtckNPTU1BTkRfQ0hBTkdFX1BFUklPRCwgKCB4TmV3UGVyaW9kICksIE5VTEwsICggeFRpY2tzVG9XYWl0ICkgKQorCisvKioKKyAqIEJhc2VUeXBlX3QgeFRpbWVyRGVsZXRlKCBUaW1lckhhbmRsZV90IHhUaW1lciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKKyAqCisgKiBUaW1lciBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IGEgdGltZXIgc2VydmljZS9kYWVtb24gdGFzay4gIE1hbnkgb2YgdGhlCisgKiBwdWJsaWMgRnJlZVJUT1MgdGltZXIgQVBJIGZ1bmN0aW9ucyBzZW5kIGNvbW1hbmRzIHRvIHRoZSB0aW1lciBzZXJ2aWNlIHRhc2sKKyAqIHRocm91Z2ggYSBxdWV1ZSBjYWxsZWQgdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUuICBUaGUgdGltZXIgY29tbWFuZCBxdWV1ZSBpcworICogcHJpdmF0ZSB0byB0aGUga2VybmVsIGl0c2VsZiBhbmQgaXMgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgdG8gYXBwbGljYXRpb24KKyAqIGNvZGUuICBUaGUgbGVuZ3RoIG9mIHRoZSB0aW1lciBjb21tYW5kIHF1ZXVlIGlzIHNldCBieSB0aGUKKyAqIGNvbmZpZ1RJTUVSX1FVRVVFX0xFTkdUSCBjb25maWd1cmF0aW9uIGNvbnN0YW50LgorICoKKyAqIHhUaW1lckRlbGV0ZSgpIGRlbGV0ZXMgYSB0aW1lciB0aGF0IHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgdXNpbmcgdGhlCisgKiB4VGltZXJDcmVhdGUoKSBBUEkgZnVuY3Rpb24uCisgKgorICogVGhlIGNvbmZpZ1VTRV9USU1FUlMgY29uZmlndXJhdGlvbiBjb25zdGFudCBtdXN0IGJlIHNldCB0byAxIGZvcgorICogeFRpbWVyRGVsZXRlKCkgdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIEBwYXJhbSB4VGltZXIgVGhlIGhhbmRsZSBvZiB0aGUgdGltZXIgYmVpbmcgZGVsZXRlZC4KKyAqCisgKiBAcGFyYW0geFRpY2tzVG9XYWl0IFNwZWNpZmllcyB0aGUgdGltZSwgaW4gdGlja3MsIHRoYXQgdGhlIGNhbGxpbmcgdGFzayBzaG91bGQKKyAqIGJlIGhlbGQgaW4gdGhlIEJsb2NrZWQgc3RhdGUgdG8gd2FpdCBmb3IgdGhlIGRlbGV0ZSBjb21tYW5kIHRvIGJlCisgKiBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZSwgc2hvdWxkIHRoZSBxdWV1ZSBhbHJlYWR5IGJlCisgKiBmdWxsIHdoZW4geFRpbWVyRGVsZXRlKCkgd2FzIGNhbGxlZC4gIHhUaWNrc1RvV2FpdCBpcyBpZ25vcmVkIGlmIHhUaW1lckRlbGV0ZSgpCisgKiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBzY2hlZHVsZXIgaXMgc3RhcnRlZC4KKyAqCisgKiBAcmV0dXJuIHBkRkFJTCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBkZWxldGUgY29tbWFuZCBjb3VsZCBub3QgYmUgc2VudCB0bworICogdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUgZXZlbiBhZnRlciB4VGlja3NUb1dhaXQgdGlja3MgaGFkIHBhc3NlZC4gIHBkUEFTUyB3aWxsCisgKiBiZSByZXR1cm5lZCBpZiB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUuCisgKiBXaGVuIHRoZSBjb21tYW5kIGlzIGFjdHVhbGx5IHByb2Nlc3NlZCB3aWxsIGRlcGVuZCBvbiB0aGUgcHJpb3JpdHkgb2YgdGhlCisgKiB0aW1lciBzZXJ2aWNlL2RhZW1vbiB0YXNrIHJlbGF0aXZlIHRvIG90aGVyIHRhc2tzIGluIHRoZSBzeXN0ZW0uICBUaGUgdGltZXIKKyAqIHNlcnZpY2UvZGFlbW9uIHRhc2sgcHJpb3JpdHkgaXMgc2V0IGJ5IHRoZSBjb25maWdUSU1FUl9UQVNLX1BSSU9SSVRZCisgKiBjb25maWd1cmF0aW9uIGNvbnN0YW50LgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKgorICogU2VlIHRoZSB4VGltZXJDaGFuZ2VQZXJpb2QoKSBBUEkgZnVuY3Rpb24gZXhhbXBsZSB1c2FnZSBzY2VuYXJpby4KKyAqLworI2RlZmluZSB4VGltZXJEZWxldGUoIHhUaW1lciwgeFRpY2tzVG9XYWl0ICkgeFRpbWVyR2VuZXJpY0NvbW1hbmQoICggeFRpbWVyICksIHRtckNPTU1BTkRfREVMRVRFLCAwVSwgTlVMTCwgKCB4VGlja3NUb1dhaXQgKSApCisKKy8qKgorICogQmFzZVR5cGVfdCB4VGltZXJSZXNldCggVGltZXJIYW5kbGVfdCB4VGltZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7CisgKgorICogVGltZXIgZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSBhIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2suICBNYW55IG9mIHRoZQorICogcHVibGljIEZyZWVSVE9TIHRpbWVyIEFQSSBmdW5jdGlvbnMgc2VuZCBjb21tYW5kcyB0byB0aGUgdGltZXIgc2VydmljZSB0YXNrCisgKiB0aHJvdWdoIGEgcXVldWUgY2FsbGVkIHRoZSB0aW1lciBjb21tYW5kIHF1ZXVlLiAgVGhlIHRpbWVyIGNvbW1hbmQgcXVldWUgaXMKKyAqIHByaXZhdGUgdG8gdGhlIGtlcm5lbCBpdHNlbGYgYW5kIGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9uCisgKiBjb2RlLiAgVGhlIGxlbmd0aCBvZiB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZSBpcyBzZXQgYnkgdGhlCisgKiBjb25maWdUSU1FUl9RVUVVRV9MRU5HVEggY29uZmlndXJhdGlvbiBjb25zdGFudC4KKyAqCisgKiB4VGltZXJSZXNldCgpIHJlLXN0YXJ0cyBhIHRpbWVyIHRoYXQgd2FzIHByZXZpb3VzbHkgY3JlYXRlZCB1c2luZyB0aGUKKyAqIHhUaW1lckNyZWF0ZSgpIEFQSSBmdW5jdGlvbi4gIElmIHRoZSB0aW1lciBoYWQgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgYW5kIHdhcworICogYWxyZWFkeSBpbiB0aGUgYWN0aXZlIHN0YXRlLCB0aGVuIHhUaW1lclJlc2V0KCkgd2lsbCBjYXVzZSB0aGUgdGltZXIgdG8KKyAqIHJlLWV2YWx1YXRlIGl0cyBleHBpcnkgdGltZSBzbyB0aGF0IGl0IGlzIHJlbGF0aXZlIHRvIHdoZW4geFRpbWVyUmVzZXQoKSB3YXMKKyAqIGNhbGxlZC4gIElmIHRoZSB0aW1lciB3YXMgaW4gdGhlIGRvcm1hbnQgc3RhdGUgdGhlbiB4VGltZXJSZXNldCgpIGhhcworICogZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5IHRvIHRoZSB4VGltZXJTdGFydCgpIEFQSSBmdW5jdGlvbi4KKyAqCisgKiBSZXNldHRpbmcgYSB0aW1lciBlbnN1cmVzIHRoZSB0aW1lciBpcyBpbiB0aGUgYWN0aXZlIHN0YXRlLiAgSWYgdGhlIHRpbWVyCisgKiBpcyBub3Qgc3RvcHBlZCwgZGVsZXRlZCwgb3IgcmVzZXQgaW4gdGhlIG1lYW4gdGltZSwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyIHdpbGwgZ2V0IGNhbGxlZCAnbicgdGlja3MgYWZ0ZXIgeFRpbWVyUmVzZXQoKSB3YXMKKyAqIGNhbGxlZCwgd2hlcmUgJ24nIGlzIHRoZSB0aW1lcnMgZGVmaW5lZCBwZXJpb2QuCisgKgorICogSXQgaXMgdmFsaWQgdG8gY2FsbCB4VGltZXJSZXNldCgpIGJlZm9yZSB0aGUgc2NoZWR1bGVyIGhhcyBiZWVuIHN0YXJ0ZWQsIGJ1dAorICogd2hlbiB0aGlzIGlzIGRvbmUgdGhlIHRpbWVyIHdpbGwgbm90IGFjdHVhbGx5IHN0YXJ0IHVudGlsIHRoZSBzY2hlZHVsZXIgaXMKKyAqIHN0YXJ0ZWQsIGFuZCB0aGUgdGltZXJzIGV4cGlyeSB0aW1lIHdpbGwgYmUgcmVsYXRpdmUgdG8gd2hlbiB0aGUgc2NoZWR1bGVyIGlzCisgKiBzdGFydGVkLCBub3QgcmVsYXRpdmUgdG8gd2hlbiB4VGltZXJSZXNldCgpIHdhcyBjYWxsZWQuCisgKgorICogVGhlIGNvbmZpZ1VTRV9USU1FUlMgY29uZmlndXJhdGlvbiBjb25zdGFudCBtdXN0IGJlIHNldCB0byAxIGZvciB4VGltZXJSZXNldCgpCisgKiB0byBiZSBhdmFpbGFibGUuCisgKgorICogQHBhcmFtIHhUaW1lciBUaGUgaGFuZGxlIG9mIHRoZSB0aW1lciBiZWluZyByZXNldC9zdGFydGVkL3Jlc3RhcnRlZC4KKyAqCisgKiBAcGFyYW0geFRpY2tzVG9XYWl0IFNwZWNpZmllcyB0aGUgdGltZSwgaW4gdGlja3MsIHRoYXQgdGhlIGNhbGxpbmcgdGFzayBzaG91bGQKKyAqIGJlIGhlbGQgaW4gdGhlIEJsb2NrZWQgc3RhdGUgdG8gd2FpdCBmb3IgdGhlIHJlc2V0IGNvbW1hbmQgdG8gYmUgc3VjY2Vzc2Z1bGx5CisgKiBzZW50IHRvIHRoZSB0aW1lciBjb21tYW5kIHF1ZXVlLCBzaG91bGQgdGhlIHF1ZXVlIGFscmVhZHkgYmUgZnVsbCB3aGVuCisgKiB4VGltZXJSZXNldCgpIHdhcyBjYWxsZWQuICB4VGlja3NUb1dhaXQgaXMgaWdub3JlZCBpZiB4VGltZXJSZXNldCgpIGlzIGNhbGxlZAorICogYmVmb3JlIHRoZSBzY2hlZHVsZXIgaXMgc3RhcnRlZC4KKyAqCisgKiBAcmV0dXJuIHBkRkFJTCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSByZXNldCBjb21tYW5kIGNvdWxkIG5vdCBiZSBzZW50IHRvCisgKiB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZSBldmVuIGFmdGVyIHhUaWNrc1RvV2FpdCB0aWNrcyBoYWQgcGFzc2VkLiAgcGRQQVNTIHdpbGwKKyAqIGJlIHJldHVybmVkIGlmIHRoZSBjb21tYW5kIHdhcyBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZS4KKyAqIFdoZW4gdGhlIGNvbW1hbmQgaXMgYWN0dWFsbHkgcHJvY2Vzc2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBwcmlvcml0eSBvZiB0aGUKKyAqIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sgcmVsYXRpdmUgdG8gb3RoZXIgdGFza3MgaW4gdGhlIHN5c3RlbSwgYWx0aG91Z2ggdGhlCisgKiB0aW1lcnMgZXhwaXJ5IHRpbWUgaXMgcmVsYXRpdmUgdG8gd2hlbiB4VGltZXJTdGFydCgpIGlzIGFjdHVhbGx5IGNhbGxlZC4gIFRoZQorICogdGltZXIgc2VydmljZS9kYWVtb24gdGFzayBwcmlvcml0eSBpcyBzZXQgYnkgdGhlIGNvbmZpZ1RJTUVSX1RBU0tfUFJJT1JJVFkKKyAqIGNvbmZpZ3VyYXRpb24gY29uc3RhbnQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqIEB2ZXJiYXRpbQorICogLy8gV2hlbiBhIGtleSBpcyBwcmVzc2VkLCBhbiBMQ0QgYmFjay1saWdodCBpcyBzd2l0Y2hlZCBvbi4gIElmIDUgc2Vjb25kcyBwYXNzCisgKiAvLyB3aXRob3V0IGEga2V5IGJlaW5nIHByZXNzZWQsIHRoZW4gdGhlIExDRCBiYWNrLWxpZ2h0IGlzIHN3aXRjaGVkIG9mZi4gIEluCisgKiAvLyB0aGlzIGNhc2UsIHRoZSB0aW1lciBpcyBhIG9uZS1zaG90IHRpbWVyLgorICoKKyAqIFRpbWVySGFuZGxlX3QgeEJhY2tsaWdodFRpbWVyID0gTlVMTDsKKyAqCisgKiAvLyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gYXNzaWduZWQgdG8gdGhlIG9uZS1zaG90IHRpbWVyLiAgSW4gdGhpcyBjYXNlIHRoZQorICogLy8gcGFyYW1ldGVyIGlzIG5vdCB1c2VkLgorICogdm9pZCB2QmFja2xpZ2h0VGltZXJDYWxsYmFjayggVGltZXJIYW5kbGVfdCBweFRpbWVyICkKKyAqIHsKKyAqICAgICAvLyBUaGUgdGltZXIgZXhwaXJlZCwgdGhlcmVmb3JlIDUgc2Vjb25kcyBtdXN0IGhhdmUgcGFzc2VkIHNpbmNlIGEga2V5CisgKiAgICAgLy8gd2FzIHByZXNzZWQuICBTd2l0Y2ggb2ZmIHRoZSBMQ0QgYmFjay1saWdodC4KKyAqICAgICB2U2V0QmFja2xpZ2h0U3RhdGUoIEJBQ0tMSUdIVF9PRkYgKTsKKyAqIH0KKyAqCisgKiAvLyBUaGUga2V5IHByZXNzIGV2ZW50IGhhbmRsZXIuCisgKiB2b2lkIHZLZXlQcmVzc0V2ZW50SGFuZGxlciggY2hhciBjS2V5ICkKKyAqIHsKKyAqICAgICAvLyBFbnN1cmUgdGhlIExDRCBiYWNrLWxpZ2h0IGlzIG9uLCB0aGVuIHJlc2V0IHRoZSB0aW1lciB0aGF0IGlzCisgKiAgICAgLy8gcmVzcG9uc2libGUgZm9yIHR1cm5pbmcgdGhlIGJhY2stbGlnaHQgb2ZmIGFmdGVyIDUgc2Vjb25kcyBvZgorICogICAgIC8vIGtleSBpbmFjdGl2aXR5LiAgV2FpdCAxMCB0aWNrcyBmb3IgdGhlIGNvbW1hbmQgdG8gYmUgc3VjY2Vzc2Z1bGx5IHNlbnQKKyAqICAgICAvLyBpZiBpdCBjYW5ub3QgYmUgc2VudCBpbW1lZGlhdGVseS4KKyAqICAgICB2U2V0QmFja2xpZ2h0U3RhdGUoIEJBQ0tMSUdIVF9PTiApOworICogICAgIGlmKCB4VGltZXJSZXNldCggeEJhY2tsaWdodFRpbWVyLCAxMDAgKSAhPSBwZFBBU1MgKQorICogICAgIHsKKyAqICAgICAgICAgLy8gVGhlIHJlc2V0IGNvbW1hbmQgd2FzIG5vdCBleGVjdXRlZCBzdWNjZXNzZnVsbHkuICBUYWtlIGFwcHJvcHJpYXRlCisgKiAgICAgICAgIC8vIGFjdGlvbiBoZXJlLgorICogICAgIH0KKyAqCisgKiAgICAgLy8gUGVyZm9ybSB0aGUgcmVzdCBvZiB0aGUga2V5IHByb2Nlc3NpbmcgaGVyZS4KKyAqIH0KKyAqCisgKiB2b2lkIG1haW4oIHZvaWQgKQorICogeworICogaW50MzJfdCB4OworICoKKyAqICAgICAvLyBDcmVhdGUgdGhlbiBzdGFydCB0aGUgb25lLXNob3QgdGltZXIgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdHVybmluZworICogICAgIC8vIHRoZSBiYWNrLWxpZ2h0IG9mZiBpZiBubyBrZXlzIGFyZSBwcmVzc2VkIHdpdGhpbiBhIDUgc2Vjb25kIHBlcmlvZC4KKyAqICAgICB4QmFja2xpZ2h0VGltZXIgPSB4VGltZXJDcmVhdGUoICJCYWNrbGlnaHRUaW1lciIsICAgICAgICAgICAvLyBKdXN0IGEgdGV4dCBuYW1lLCBub3QgdXNlZCBieSB0aGUga2VybmVsLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCA1MDAwIC8gcG9ydFRJQ0tfUEVSSU9EX01TKSwgLy8gVGhlIHRpbWVyIHBlcmlvZCBpbiB0aWNrcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkRkFMU0UsICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGltZXIgaXMgYSBvbmUtc2hvdCB0aW1lci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaWQgaXMgbm90IHVzZWQgYnkgdGhlIGNhbGxiYWNrIHNvIGNhbiB0YWtlIGFueSB2YWx1ZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZCYWNrbGlnaHRUaW1lckNhbGxiYWNrICAgICAvLyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBzd2l0Y2hlcyB0aGUgTENEIGJhY2stbGlnaHQgb2ZmLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgKgorICogICAgIGlmKCB4QmFja2xpZ2h0VGltZXIgPT0gTlVMTCApCisgKiAgICAgeworICogICAgICAgICAvLyBUaGUgdGltZXIgd2FzIG5vdCBjcmVhdGVkLgorICogICAgIH0KKyAqICAgICBlbHNlCisgKiAgICAgeworICogICAgICAgICAvLyBTdGFydCB0aGUgdGltZXIuICBObyBibG9jayB0aW1lIGlzIHNwZWNpZmllZCwgYW5kIGV2ZW4gaWYgb25lIHdhcworICogICAgICAgICAvLyBpdCB3b3VsZCBiZSBpZ25vcmVkIGJlY2F1c2UgdGhlIHNjaGVkdWxlciBoYXMgbm90IHlldCBiZWVuCisgKiAgICAgICAgIC8vIHN0YXJ0ZWQuCisgKiAgICAgICAgIGlmKCB4VGltZXJTdGFydCggeEJhY2tsaWdodFRpbWVyLCAwICkgIT0gcGRQQVNTICkKKyAqICAgICAgICAgeworICogICAgICAgICAgICAgLy8gVGhlIHRpbWVyIGNvdWxkIG5vdCBiZSBzZXQgaW50byB0aGUgQWN0aXZlIHN0YXRlLgorICogICAgICAgICB9CisgKiAgICAgfQorICoKKyAqICAgICAvLyAuLi4KKyAqICAgICAvLyBDcmVhdGUgdGFza3MgaGVyZS4KKyAqICAgICAvLyAuLi4KKyAqCisgKiAgICAgLy8gU3RhcnRpbmcgdGhlIHNjaGVkdWxlciB3aWxsIHN0YXJ0IHRoZSB0aW1lciBydW5uaW5nIGFzIGl0IGhhcyBhbHJlYWR5CisgKiAgICAgLy8gYmVlbiBzZXQgaW50byB0aGUgYWN0aXZlIHN0YXRlLgorICogICAgIHZUYXNrU3RhcnRTY2hlZHVsZXIoKTsKKyAqCisgKiAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlLgorICogICAgIGZvciggOzsgKTsKKyAqIH0KKyAqIEBlbmR2ZXJiYXRpbQorICovCisjZGVmaW5lIHhUaW1lclJlc2V0KCB4VGltZXIsIHhUaWNrc1RvV2FpdCApIHhUaW1lckdlbmVyaWNDb21tYW5kKCAoIHhUaW1lciApLCB0bXJDT01NQU5EX1JFU0VULCAoIHhUYXNrR2V0VGlja0NvdW50KCkgKSwgTlVMTCwgKCB4VGlja3NUb1dhaXQgKSApCisKKy8qKgorICogQmFzZVR5cGVfdCB4VGltZXJTdGFydEZyb21JU1IoIAlUaW1lckhhbmRsZV90IHhUaW1lciwKKyAqCQkJCQkJCQkJQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworICoKKyAqIEEgdmVyc2lvbiBvZiB4VGltZXJTdGFydCgpIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBzZXJ2aWNlCisgKiByb3V0aW5lLgorICoKKyAqIEBwYXJhbSB4VGltZXIgVGhlIGhhbmRsZSBvZiB0aGUgdGltZXIgYmVpbmcgc3RhcnRlZC9yZXN0YXJ0ZWQuCisgKgorICogQHBhcmFtIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gVGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sgc3BlbmRzIG1vc3QKKyAqIG9mIGl0cyB0aW1lIGluIHRoZSBCbG9ja2VkIHN0YXRlLCB3YWl0aW5nIGZvciBtZXNzYWdlcyB0byBhcnJpdmUgb24gdGhlIHRpbWVyCisgKiBjb21tYW5kIHF1ZXVlLiAgQ2FsbGluZyB4VGltZXJTdGFydEZyb21JU1IoKSB3cml0ZXMgYSBtZXNzYWdlIHRvIHRoZSB0aW1lcgorICogY29tbWFuZCBxdWV1ZSwgc28gaGFzIHRoZSBwb3RlbnRpYWwgdG8gdHJhbnNpdGlvbiB0aGUgdGltZXIgc2VydmljZS9kYWVtb24KKyAqIHRhc2sgb3V0IG9mIHRoZSBCbG9ja2VkIHN0YXRlLiAgSWYgY2FsbGluZyB4VGltZXJTdGFydEZyb21JU1IoKSBjYXVzZXMgdGhlCisgKiB0aW1lciBzZXJ2aWNlL2RhZW1vbiB0YXNrIHRvIGxlYXZlIHRoZSBCbG9ja2VkIHN0YXRlLCBhbmQgdGhlIHRpbWVyIHNlcnZpY2UvCisgKiBkYWVtb24gdGFzayBoYXMgYSBwcmlvcml0eSBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnRseSBleGVjdXRpbmcKKyAqIHRhc2sgKHRoZSB0YXNrIHRoYXQgd2FzIGludGVycnVwdGVkKSwgdGhlbiAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB3aWxsCisgKiBnZXQgc2V0IHRvIHBkVFJVRSBpbnRlcm5hbGx5IHdpdGhpbiB0aGUgeFRpbWVyU3RhcnRGcm9tSVNSKCkgZnVuY3Rpb24uICBJZgorICogeFRpbWVyU3RhcnRGcm9tSVNSKCkgc2V0cyB0aGlzIHZhbHVlIHRvIHBkVFJVRSB0aGVuIGEgY29udGV4dCBzd2l0Y2ggc2hvdWxkCisgKiBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgZXhpdHMuCisgKgorICogQHJldHVybiBwZEZBSUwgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgc3RhcnQgY29tbWFuZCBjb3VsZCBub3QgYmUgc2VudCB0bworICogdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUuICBwZFBBU1Mgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgY29tbWFuZCB3YXMKKyAqIHN1Y2Nlc3NmdWxseSBzZW50IHRvIHRoZSB0aW1lciBjb21tYW5kIHF1ZXVlLiAgV2hlbiB0aGUgY29tbWFuZCBpcyBhY3R1YWxseQorICogcHJvY2Vzc2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBwcmlvcml0eSBvZiB0aGUgdGltZXIgc2VydmljZS9kYWVtb24gdGFzaworICogcmVsYXRpdmUgdG8gb3RoZXIgdGFza3MgaW4gdGhlIHN5c3RlbSwgYWx0aG91Z2ggdGhlIHRpbWVycyBleHBpcnkgdGltZSBpcworICogcmVsYXRpdmUgdG8gd2hlbiB4VGltZXJTdGFydEZyb21JU1IoKSBpcyBhY3R1YWxseSBjYWxsZWQuICBUaGUgdGltZXIKKyAqIHNlcnZpY2UvZGFlbW9uIHRhc2sgcHJpb3JpdHkgaXMgc2V0IGJ5IHRoZSBjb25maWdUSU1FUl9UQVNLX1BSSU9SSVRZCisgKiBjb25maWd1cmF0aW9uIGNvbnN0YW50LgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKiBAdmVyYmF0aW0KKyAqIC8vIFRoaXMgc2NlbmFyaW8gYXNzdW1lcyB4QmFja2xpZ2h0VGltZXIgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLiAgV2hlbiBhCisgKiAvLyBrZXkgaXMgcHJlc3NlZCwgYW4gTENEIGJhY2stbGlnaHQgaXMgc3dpdGNoZWQgb24uICBJZiA1IHNlY29uZHMgcGFzcworICogLy8gd2l0aG91dCBhIGtleSBiZWluZyBwcmVzc2VkLCB0aGVuIHRoZSBMQ0QgYmFjay1saWdodCBpcyBzd2l0Y2hlZCBvZmYuICBJbgorICogLy8gdGhpcyBjYXNlLCB0aGUgdGltZXIgaXMgYSBvbmUtc2hvdCB0aW1lciwgYW5kIHVubGlrZSB0aGUgZXhhbXBsZSBnaXZlbiBmb3IKKyAqIC8vIHRoZSB4VGltZXJSZXNldCgpIGZ1bmN0aW9uLCB0aGUga2V5IHByZXNzIGV2ZW50IGhhbmRsZXIgaXMgYW4gaW50ZXJydXB0CisgKiAvLyBzZXJ2aWNlIHJvdXRpbmUuCisgKgorICogLy8gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFzc2lnbmVkIHRvIHRoZSBvbmUtc2hvdCB0aW1lci4gIEluIHRoaXMgY2FzZSB0aGUKKyAqIC8vIHBhcmFtZXRlciBpcyBub3QgdXNlZC4KKyAqIHZvaWQgdkJhY2tsaWdodFRpbWVyQ2FsbGJhY2soIFRpbWVySGFuZGxlX3QgcHhUaW1lciApCisgKiB7CisgKiAgICAgLy8gVGhlIHRpbWVyIGV4cGlyZWQsIHRoZXJlZm9yZSA1IHNlY29uZHMgbXVzdCBoYXZlIHBhc3NlZCBzaW5jZSBhIGtleQorICogICAgIC8vIHdhcyBwcmVzc2VkLiAgU3dpdGNoIG9mZiB0aGUgTENEIGJhY2stbGlnaHQuCisgKiAgICAgdlNldEJhY2tsaWdodFN0YXRlKCBCQUNLTElHSFRfT0ZGICk7CisgKiB9CisgKgorICogLy8gVGhlIGtleSBwcmVzcyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICogdm9pZCB2S2V5UHJlc3NFdmVudEludGVycnVwdEhhbmRsZXIoIHZvaWQgKQorICogeworICogQmFzZVR5cGVfdCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZEZBTFNFOworICoKKyAqICAgICAvLyBFbnN1cmUgdGhlIExDRCBiYWNrLWxpZ2h0IGlzIG9uLCB0aGVuIHJlc3RhcnQgdGhlIHRpbWVyIHRoYXQgaXMKKyAqICAgICAvLyByZXNwb25zaWJsZSBmb3IgdHVybmluZyB0aGUgYmFjay1saWdodCBvZmYgYWZ0ZXIgNSBzZWNvbmRzIG9mCisgKiAgICAgLy8ga2V5IGluYWN0aXZpdHkuICBUaGlzIGlzIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgc28gY2FuIG9ubHkKKyAqICAgICAvLyBjYWxsIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgdGhhdCBlbmQgaW4gIkZyb21JU1IiLgorICogICAgIHZTZXRCYWNrbGlnaHRTdGF0ZSggQkFDS0xJR0hUX09OICk7CisgKgorICogICAgIC8vIHhUaW1lclN0YXJ0RnJvbUlTUigpIG9yIHhUaW1lclJlc2V0RnJvbUlTUigpIGNvdWxkIGJlIGNhbGxlZCBoZXJlCisgKiAgICAgLy8gYXMgYm90aCBjYXVzZSB0aGUgdGltZXIgdG8gcmUtY2FsY3VsYXRlIGl0cyBleHBpcnkgdGltZS4KKyAqICAgICAvLyB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gd2FzIGluaXRpYWxpc2VkIHRvIHBkRkFMU0Ugd2hlbiBpdCB3YXMKKyAqICAgICAvLyBkZWNsYXJlZCAoaW4gdGhpcyBmdW5jdGlvbikuCisgKiAgICAgaWYoIHhUaW1lclN0YXJ0RnJvbUlTUiggeEJhY2tsaWdodFRpbWVyLCAmeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgIT0gcGRQQVNTICkKKyAqICAgICB7CisgKiAgICAgICAgIC8vIFRoZSBzdGFydCBjb21tYW5kIHdhcyBub3QgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LiAgVGFrZSBhcHByb3ByaWF0ZQorICogICAgICAgICAvLyBhY3Rpb24gaGVyZS4KKyAqICAgICB9CisgKgorICogICAgIC8vIFBlcmZvcm0gdGhlIHJlc3Qgb2YgdGhlIGtleSBwcm9jZXNzaW5nIGhlcmUuCisgKgorICogICAgIC8vIElmIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBlcXVhbHMgcGRUUlVFLCB0aGVuIGEgY29udGV4dCBzd2l0Y2gKKyAqICAgICAvLyBzaG91bGQgYmUgcGVyZm9ybWVkLiAgVGhlIHN5bnRheCByZXF1aXJlZCB0byBwZXJmb3JtIGEgY29udGV4dCBzd2l0Y2gKKyAqICAgICAvLyBmcm9tIGluc2lkZSBhbiBJU1IgdmFyaWVzIGZyb20gcG9ydCB0byBwb3J0LCBhbmQgZnJvbSBjb21waWxlciB0bworICogICAgIC8vIGNvbXBpbGVyLiAgSW5zcGVjdCB0aGUgZGVtb3MgZm9yIHRoZSBwb3J0IHlvdSBhcmUgdXNpbmcgdG8gZmluZCB0aGUKKyAqICAgICAvLyBhY3R1YWwgc3ludGF4IHJlcXVpcmVkLgorICogICAgIGlmKCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gIT0gcGRGQUxTRSApCisgKiAgICAgeworICogICAgICAgICAvLyBDYWxsIHRoZSBpbnRlcnJ1cHQgc2FmZSB5aWVsZCBmdW5jdGlvbiBoZXJlIChhY3R1YWwgZnVuY3Rpb24KKyAqICAgICAgICAgLy8gZGVwZW5kcyBvbiB0aGUgRnJlZVJUT1MgcG9ydCBiZWluZyB1c2VkKS4KKyAqICAgICB9CisgKiB9CisgKiBAZW5kdmVyYmF0aW0KKyAqLworI2RlZmluZSB4VGltZXJTdGFydEZyb21JU1IoIHhUaW1lciwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApIHhUaW1lckdlbmVyaWNDb21tYW5kKCAoIHhUaW1lciApLCB0bXJDT01NQU5EX1NUQVJUX0ZST01fSVNSLCAoIHhUYXNrR2V0VGlja0NvdW50RnJvbUlTUigpICksICggcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApLCAwVSApCisKKy8qKgorICogQmFzZVR5cGVfdCB4VGltZXJTdG9wRnJvbUlTUiggCVRpbWVySGFuZGxlX3QgeFRpbWVyLAorICoJCQkJCQkJCQlCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisgKgorICogQSB2ZXJzaW9uIG9mIHhUaW1lclN0b3AoKSB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgc2VydmljZQorICogcm91dGluZS4KKyAqCisgKiBAcGFyYW0geFRpbWVyIFRoZSBoYW5kbGUgb2YgdGhlIHRpbWVyIGJlaW5nIHN0b3BwZWQuCisgKgorICogQHBhcmFtIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gVGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sgc3BlbmRzIG1vc3QKKyAqIG9mIGl0cyB0aW1lIGluIHRoZSBCbG9ja2VkIHN0YXRlLCB3YWl0aW5nIGZvciBtZXNzYWdlcyB0byBhcnJpdmUgb24gdGhlIHRpbWVyCisgKiBjb21tYW5kIHF1ZXVlLiAgQ2FsbGluZyB4VGltZXJTdG9wRnJvbUlTUigpIHdyaXRlcyBhIG1lc3NhZ2UgdG8gdGhlIHRpbWVyCisgKiBjb21tYW5kIHF1ZXVlLCBzbyBoYXMgdGhlIHBvdGVudGlhbCB0byB0cmFuc2l0aW9uIHRoZSB0aW1lciBzZXJ2aWNlL2RhZW1vbgorICogdGFzayBvdXQgb2YgdGhlIEJsb2NrZWQgc3RhdGUuICBJZiBjYWxsaW5nIHhUaW1lclN0b3BGcm9tSVNSKCkgY2F1c2VzIHRoZQorICogdGltZXIgc2VydmljZS9kYWVtb24gdGFzayB0byBsZWF2ZSB0aGUgQmxvY2tlZCBzdGF0ZSwgYW5kIHRoZSB0aW1lciBzZXJ2aWNlLworICogZGFlbW9uIHRhc2sgaGFzIGEgcHJpb3JpdHkgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nCisgKiB0YXNrICh0aGUgdGFzayB0aGF0IHdhcyBpbnRlcnJ1cHRlZCksIHRoZW4gKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gd2lsbAorICogZ2V0IHNldCB0byBwZFRSVUUgaW50ZXJuYWxseSB3aXRoaW4gdGhlIHhUaW1lclN0b3BGcm9tSVNSKCkgZnVuY3Rpb24uICBJZgorICogeFRpbWVyU3RvcEZyb21JU1IoKSBzZXRzIHRoaXMgdmFsdWUgdG8gcGRUUlVFIHRoZW4gYSBjb250ZXh0IHN3aXRjaCBzaG91bGQKKyAqIGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGludGVycnVwdCBleGl0cy4KKyAqCisgKiBAcmV0dXJuIHBkRkFJTCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBzdG9wIGNvbW1hbmQgY291bGQgbm90IGJlIHNlbnQgdG8KKyAqIHRoZSB0aW1lciBjb21tYW5kIHF1ZXVlLiAgcGRQQVNTIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbW1hbmQgd2FzCisgKiBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZS4gIFdoZW4gdGhlIGNvbW1hbmQgaXMgYWN0dWFsbHkKKyAqIHByb2Nlc3NlZCB3aWxsIGRlcGVuZCBvbiB0aGUgcHJpb3JpdHkgb2YgdGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sKKyAqIHJlbGF0aXZlIHRvIG90aGVyIHRhc2tzIGluIHRoZSBzeXN0ZW0uICBUaGUgdGltZXIgc2VydmljZS9kYWVtb24gdGFzaworICogcHJpb3JpdHkgaXMgc2V0IGJ5IHRoZSBjb25maWdUSU1FUl9UQVNLX1BSSU9SSVRZIGNvbmZpZ3VyYXRpb24gY29uc3RhbnQuCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqIEB2ZXJiYXRpbQorICogLy8gVGhpcyBzY2VuYXJpbyBhc3N1bWVzIHhUaW1lciBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYW5kIHN0YXJ0ZWQuICBXaGVuCisgKiAvLyBhbiBpbnRlcnJ1cHQgb2NjdXJzLCB0aGUgdGltZXIgc2hvdWxkIGJlIHNpbXBseSBzdG9wcGVkLgorICoKKyAqIC8vIFRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIHRoYXQgc3RvcHMgdGhlIHRpbWVyLgorICogdm9pZCB2QW5FeGFtcGxlSW50ZXJydXB0U2VydmljZVJvdXRpbmUoIHZvaWQgKQorICogeworICogQmFzZVR5cGVfdCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZEZBTFNFOworICoKKyAqICAgICAvLyBUaGUgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCAtIHNpbXBseSBzdG9wIHRoZSB0aW1lci4KKyAqICAgICAvLyB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gd2FzIHNldCB0byBwZEZBTFNFIHdoZXJlIGl0IHdhcyBkZWZpbmVkCisgKiAgICAgLy8gKHdpdGhpbiB0aGlzIGZ1bmN0aW9uKS4gIEFzIHRoaXMgaXMgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgb25seQorICogICAgIC8vIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgdGhhdCBlbmQgaW4gIkZyb21JU1IiIGNhbiBiZSB1c2VkLgorICogICAgIGlmKCB4VGltZXJTdG9wRnJvbUlTUiggeFRpbWVyLCAmeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkgIT0gcGRQQVNTICkKKyAqICAgICB7CisgKiAgICAgICAgIC8vIFRoZSBzdG9wIGNvbW1hbmQgd2FzIG5vdCBleGVjdXRlZCBzdWNjZXNzZnVsbHkuICBUYWtlIGFwcHJvcHJpYXRlCisgKiAgICAgICAgIC8vIGFjdGlvbiBoZXJlLgorICogICAgIH0KKyAqCisgKiAgICAgLy8gSWYgeEhpZ2hlclByaW9yaXR5VGFza1dva2VuIGVxdWFscyBwZFRSVUUsIHRoZW4gYSBjb250ZXh0IHN3aXRjaAorICogICAgIC8vIHNob3VsZCBiZSBwZXJmb3JtZWQuICBUaGUgc3ludGF4IHJlcXVpcmVkIHRvIHBlcmZvcm0gYSBjb250ZXh0IHN3aXRjaAorICogICAgIC8vIGZyb20gaW5zaWRlIGFuIElTUiB2YXJpZXMgZnJvbSBwb3J0IHRvIHBvcnQsIGFuZCBmcm9tIGNvbXBpbGVyIHRvCisgKiAgICAgLy8gY29tcGlsZXIuICBJbnNwZWN0IHRoZSBkZW1vcyBmb3IgdGhlIHBvcnQgeW91IGFyZSB1c2luZyB0byBmaW5kIHRoZQorICogICAgIC8vIGFjdHVhbCBzeW50YXggcmVxdWlyZWQuCisgKiAgICAgaWYoIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiAhPSBwZEZBTFNFICkKKyAqICAgICB7CisgKiAgICAgICAgIC8vIENhbGwgdGhlIGludGVycnVwdCBzYWZlIHlpZWxkIGZ1bmN0aW9uIGhlcmUgKGFjdHVhbCBmdW5jdGlvbgorICogICAgICAgICAvLyBkZXBlbmRzIG9uIHRoZSBGcmVlUlRPUyBwb3J0IGJlaW5nIHVzZWQpLgorICogICAgIH0KKyAqIH0KKyAqIEBlbmR2ZXJiYXRpbQorICovCisjZGVmaW5lIHhUaW1lclN0b3BGcm9tSVNSKCB4VGltZXIsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSB4VGltZXJHZW5lcmljQ29tbWFuZCggKCB4VGltZXIgKSwgdG1yQ09NTUFORF9TVE9QX0ZST01fSVNSLCAwLCAoIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSwgMFUgKQorCisvKioKKyAqIEJhc2VUeXBlX3QgeFRpbWVyQ2hhbmdlUGVyaW9kRnJvbUlTUiggVGltZXJIYW5kbGVfdCB4VGltZXIsCisgKgkJCQkJCQkJCQkgVGlja1R5cGVfdCB4TmV3UGVyaW9kLAorICoJCQkJCQkJCQkJIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKyAqCisgKiBBIHZlcnNpb24gb2YgeFRpbWVyQ2hhbmdlUGVyaW9kKCkgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0CisgKiBzZXJ2aWNlIHJvdXRpbmUuCisgKgorICogQHBhcmFtIHhUaW1lciBUaGUgaGFuZGxlIG9mIHRoZSB0aW1lciB0aGF0IGlzIGhhdmluZyBpdHMgcGVyaW9kIGNoYW5nZWQuCisgKgorICogQHBhcmFtIHhOZXdQZXJpb2QgVGhlIG5ldyBwZXJpb2QgZm9yIHhUaW1lci4gVGltZXIgcGVyaW9kcyBhcmUgc3BlY2lmaWVkIGluCisgKiB0aWNrIHBlcmlvZHMsIHNvIHRoZSBjb25zdGFudCBwb3J0VElDS19QRVJJT0RfTVMgY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIHRpbWUKKyAqIHRoYXQgaGFzIGJlZW4gc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gIEZvciBleGFtcGxlLCBpZiB0aGUgdGltZXIgbXVzdAorICogZXhwaXJlIGFmdGVyIDEwMCB0aWNrcywgdGhlbiB4TmV3UGVyaW9kIHNob3VsZCBiZSBzZXQgdG8gMTAwLiAgQWx0ZXJuYXRpdmVseSwKKyAqIGlmIHRoZSB0aW1lciBtdXN0IGV4cGlyZSBhZnRlciA1MDBtcywgdGhlbiB4TmV3UGVyaW9kIGNhbiBiZSBzZXQgdG8KKyAqICggNTAwIC8gcG9ydFRJQ0tfUEVSSU9EX01TICkgcHJvdmlkZWQgY29uZmlnVElDS19SQVRFX0haIGlzIGxlc3MgdGhhbgorICogb3IgZXF1YWwgdG8gMTAwMC4KKyAqCisgKiBAcGFyYW0gcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBUaGUgdGltZXIgc2VydmljZS9kYWVtb24gdGFzayBzcGVuZHMgbW9zdAorICogb2YgaXRzIHRpbWUgaW4gdGhlIEJsb2NrZWQgc3RhdGUsIHdhaXRpbmcgZm9yIG1lc3NhZ2VzIHRvIGFycml2ZSBvbiB0aGUgdGltZXIKKyAqIGNvbW1hbmQgcXVldWUuICBDYWxsaW5nIHhUaW1lckNoYW5nZVBlcmlvZEZyb21JU1IoKSB3cml0ZXMgYSBtZXNzYWdlIHRvIHRoZQorICogdGltZXIgY29tbWFuZCBxdWV1ZSwgc28gaGFzIHRoZSBwb3RlbnRpYWwgdG8gdHJhbnNpdGlvbiB0aGUgdGltZXIgc2VydmljZS8KKyAqIGRhZW1vbiB0YXNrIG91dCBvZiB0aGUgQmxvY2tlZCBzdGF0ZS4gIElmIGNhbGxpbmcgeFRpbWVyQ2hhbmdlUGVyaW9kRnJvbUlTUigpCisgKiBjYXVzZXMgdGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sgdG8gbGVhdmUgdGhlIEJsb2NrZWQgc3RhdGUsIGFuZCB0aGUKKyAqIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sgaGFzIGEgcHJpb3JpdHkgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoZQorICogY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrICh0aGUgdGFzayB0aGF0IHdhcyBpbnRlcnJ1cHRlZCksIHRoZW4KKyAqICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHdpbGwgZ2V0IHNldCB0byBwZFRSVUUgaW50ZXJuYWxseSB3aXRoaW4gdGhlCisgKiB4VGltZXJDaGFuZ2VQZXJpb2RGcm9tSVNSKCkgZnVuY3Rpb24uICBJZiB4VGltZXJDaGFuZ2VQZXJpb2RGcm9tSVNSKCkgc2V0cworICogdGhpcyB2YWx1ZSB0byBwZFRSVUUgdGhlbiBhIGNvbnRleHQgc3dpdGNoIHNob3VsZCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZQorICogaW50ZXJydXB0IGV4aXRzLgorICoKKyAqIEByZXR1cm4gcGRGQUlMIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbW1hbmQgdG8gY2hhbmdlIHRoZSB0aW1lcnMgcGVyaW9kCisgKiBjb3VsZCBub3QgYmUgc2VudCB0byB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZS4gIHBkUEFTUyB3aWxsIGJlIHJldHVybmVkIGlmIHRoZQorICogY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIHRpbWVyIGNvbW1hbmQgcXVldWUuICBXaGVuIHRoZSBjb21tYW5kCisgKiBpcyBhY3R1YWxseSBwcm9jZXNzZWQgd2lsbCBkZXBlbmQgb24gdGhlIHByaW9yaXR5IG9mIHRoZSB0aW1lciBzZXJ2aWNlL2RhZW1vbgorICogdGFzayByZWxhdGl2ZSB0byBvdGhlciB0YXNrcyBpbiB0aGUgc3lzdGVtLiAgVGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sKKyAqIHByaW9yaXR5IGlzIHNldCBieSB0aGUgY29uZmlnVElNRVJfVEFTS19QUklPUklUWSBjb25maWd1cmF0aW9uIGNvbnN0YW50LgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKiBAdmVyYmF0aW0KKyAqIC8vIFRoaXMgc2NlbmFyaW8gYXNzdW1lcyB4VGltZXIgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFuZCBzdGFydGVkLiAgV2hlbgorICogLy8gYW4gaW50ZXJydXB0IG9jY3VycywgdGhlIHBlcmlvZCBvZiB4VGltZXIgc2hvdWxkIGJlIGNoYW5nZWQgdG8gNTAwbXMuCisgKgorICogLy8gVGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgdGhhdCBjaGFuZ2VzIHRoZSBwZXJpb2Qgb2YgeFRpbWVyLgorICogdm9pZCB2QW5FeGFtcGxlSW50ZXJydXB0U2VydmljZVJvdXRpbmUoIHZvaWQgKQorICogeworICogQmFzZVR5cGVfdCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZEZBTFNFOworICoKKyAqICAgICAvLyBUaGUgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCAtIGNoYW5nZSB0aGUgcGVyaW9kIG9mIHhUaW1lciB0byA1MDBtcy4KKyAqICAgICAvLyB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gd2FzIHNldCB0byBwZEZBTFNFIHdoZXJlIGl0IHdhcyBkZWZpbmVkCisgKiAgICAgLy8gKHdpdGhpbiB0aGlzIGZ1bmN0aW9uKS4gIEFzIHRoaXMgaXMgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgb25seQorICogICAgIC8vIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgdGhhdCBlbmQgaW4gIkZyb21JU1IiIGNhbiBiZSB1c2VkLgorICogICAgIGlmKCB4VGltZXJDaGFuZ2VQZXJpb2RGcm9tSVNSKCB4VGltZXIsICZ4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSAhPSBwZFBBU1MgKQorICogICAgIHsKKyAqICAgICAgICAgLy8gVGhlIGNvbW1hbmQgdG8gY2hhbmdlIHRoZSB0aW1lcnMgcGVyaW9kIHdhcyBub3QgZXhlY3V0ZWQKKyAqICAgICAgICAgLy8gc3VjY2Vzc2Z1bGx5LiAgVGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaGVyZS4KKyAqICAgICB9CisgKgorICogICAgIC8vIElmIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBlcXVhbHMgcGRUUlVFLCB0aGVuIGEgY29udGV4dCBzd2l0Y2gKKyAqICAgICAvLyBzaG91bGQgYmUgcGVyZm9ybWVkLiAgVGhlIHN5bnRheCByZXF1aXJlZCB0byBwZXJmb3JtIGEgY29udGV4dCBzd2l0Y2gKKyAqICAgICAvLyBmcm9tIGluc2lkZSBhbiBJU1IgdmFyaWVzIGZyb20gcG9ydCB0byBwb3J0LCBhbmQgZnJvbSBjb21waWxlciB0bworICogICAgIC8vIGNvbXBpbGVyLiAgSW5zcGVjdCB0aGUgZGVtb3MgZm9yIHRoZSBwb3J0IHlvdSBhcmUgdXNpbmcgdG8gZmluZCB0aGUKKyAqICAgICAvLyBhY3R1YWwgc3ludGF4IHJlcXVpcmVkLgorICogICAgIGlmKCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gIT0gcGRGQUxTRSApCisgKiAgICAgeworICogICAgICAgICAvLyBDYWxsIHRoZSBpbnRlcnJ1cHQgc2FmZSB5aWVsZCBmdW5jdGlvbiBoZXJlIChhY3R1YWwgZnVuY3Rpb24KKyAqICAgICAgICAgLy8gZGVwZW5kcyBvbiB0aGUgRnJlZVJUT1MgcG9ydCBiZWluZyB1c2VkKS4KKyAqICAgICB9CisgKiB9CisgKiBAZW5kdmVyYmF0aW0KKyAqLworI2RlZmluZSB4VGltZXJDaGFuZ2VQZXJpb2RGcm9tSVNSKCB4VGltZXIsIHhOZXdQZXJpb2QsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSB4VGltZXJHZW5lcmljQ29tbWFuZCggKCB4VGltZXIgKSwgdG1yQ09NTUFORF9DSEFOR0VfUEVSSU9EX0ZST01fSVNSLCAoIHhOZXdQZXJpb2QgKSwgKCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICksIDBVICkKKworLyoqCisgKiBCYXNlVHlwZV90IHhUaW1lclJlc2V0RnJvbUlTUiggCVRpbWVySGFuZGxlX3QgeFRpbWVyLAorICoJCQkJCQkJCQlCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisgKgorICogQSB2ZXJzaW9uIG9mIHhUaW1lclJlc2V0KCkgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IHNlcnZpY2UKKyAqIHJvdXRpbmUuCisgKgorICogQHBhcmFtIHhUaW1lciBUaGUgaGFuZGxlIG9mIHRoZSB0aW1lciB0aGF0IGlzIHRvIGJlIHN0YXJ0ZWQsIHJlc2V0LCBvcgorICogcmVzdGFydGVkLgorICoKKyAqIEBwYXJhbSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuIFRoZSB0aW1lciBzZXJ2aWNlL2RhZW1vbiB0YXNrIHNwZW5kcyBtb3N0CisgKiBvZiBpdHMgdGltZSBpbiB0aGUgQmxvY2tlZCBzdGF0ZSwgd2FpdGluZyBmb3IgbWVzc2FnZXMgdG8gYXJyaXZlIG9uIHRoZSB0aW1lcgorICogY29tbWFuZCBxdWV1ZS4gIENhbGxpbmcgeFRpbWVyUmVzZXRGcm9tSVNSKCkgd3JpdGVzIGEgbWVzc2FnZSB0byB0aGUgdGltZXIKKyAqIGNvbW1hbmQgcXVldWUsIHNvIGhhcyB0aGUgcG90ZW50aWFsIHRvIHRyYW5zaXRpb24gdGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uCisgKiB0YXNrIG91dCBvZiB0aGUgQmxvY2tlZCBzdGF0ZS4gIElmIGNhbGxpbmcgeFRpbWVyUmVzZXRGcm9tSVNSKCkgY2F1c2VzIHRoZQorICogdGltZXIgc2VydmljZS9kYWVtb24gdGFzayB0byBsZWF2ZSB0aGUgQmxvY2tlZCBzdGF0ZSwgYW5kIHRoZSB0aW1lciBzZXJ2aWNlLworICogZGFlbW9uIHRhc2sgaGFzIGEgcHJpb3JpdHkgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nCisgKiB0YXNrICh0aGUgdGFzayB0aGF0IHdhcyBpbnRlcnJ1cHRlZCksIHRoZW4gKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gd2lsbAorICogZ2V0IHNldCB0byBwZFRSVUUgaW50ZXJuYWxseSB3aXRoaW4gdGhlIHhUaW1lclJlc2V0RnJvbUlTUigpIGZ1bmN0aW9uLiAgSWYKKyAqIHhUaW1lclJlc2V0RnJvbUlTUigpIHNldHMgdGhpcyB2YWx1ZSB0byBwZFRSVUUgdGhlbiBhIGNvbnRleHQgc3dpdGNoIHNob3VsZAorICogYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGV4aXRzLgorICoKKyAqIEByZXR1cm4gcGRGQUlMIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHJlc2V0IGNvbW1hbmQgY291bGQgbm90IGJlIHNlbnQgdG8KKyAqIHRoZSB0aW1lciBjb21tYW5kIHF1ZXVlLiAgcGRQQVNTIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGNvbW1hbmQgd2FzCisgKiBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgdGltZXIgY29tbWFuZCBxdWV1ZS4gIFdoZW4gdGhlIGNvbW1hbmQgaXMgYWN0dWFsbHkKKyAqIHByb2Nlc3NlZCB3aWxsIGRlcGVuZCBvbiB0aGUgcHJpb3JpdHkgb2YgdGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uIHRhc2sKKyAqIHJlbGF0aXZlIHRvIG90aGVyIHRhc2tzIGluIHRoZSBzeXN0ZW0sIGFsdGhvdWdoIHRoZSB0aW1lcnMgZXhwaXJ5IHRpbWUgaXMKKyAqIHJlbGF0aXZlIHRvIHdoZW4geFRpbWVyUmVzZXRGcm9tSVNSKCkgaXMgYWN0dWFsbHkgY2FsbGVkLiAgVGhlIHRpbWVyIHNlcnZpY2UvZGFlbW9uCisgKiB0YXNrIHByaW9yaXR5IGlzIHNldCBieSB0aGUgY29uZmlnVElNRVJfVEFTS19QUklPUklUWSBjb25maWd1cmF0aW9uIGNvbnN0YW50LgorICoKKyAqIEV4YW1wbGUgdXNhZ2U6CisgKiBAdmVyYmF0aW0KKyAqIC8vIFRoaXMgc2NlbmFyaW8gYXNzdW1lcyB4QmFja2xpZ2h0VGltZXIgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLiAgV2hlbiBhCisgKiAvLyBrZXkgaXMgcHJlc3NlZCwgYW4gTENEIGJhY2stbGlnaHQgaXMgc3dpdGNoZWQgb24uICBJZiA1IHNlY29uZHMgcGFzcworICogLy8gd2l0aG91dCBhIGtleSBiZWluZyBwcmVzc2VkLCB0aGVuIHRoZSBMQ0QgYmFjay1saWdodCBpcyBzd2l0Y2hlZCBvZmYuICBJbgorICogLy8gdGhpcyBjYXNlLCB0aGUgdGltZXIgaXMgYSBvbmUtc2hvdCB0aW1lciwgYW5kIHVubGlrZSB0aGUgZXhhbXBsZSBnaXZlbiBmb3IKKyAqIC8vIHRoZSB4VGltZXJSZXNldCgpIGZ1bmN0aW9uLCB0aGUga2V5IHByZXNzIGV2ZW50IGhhbmRsZXIgaXMgYW4gaW50ZXJydXB0CisgKiAvLyBzZXJ2aWNlIHJvdXRpbmUuCisgKgorICogLy8gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFzc2lnbmVkIHRvIHRoZSBvbmUtc2hvdCB0aW1lci4gIEluIHRoaXMgY2FzZSB0aGUKKyAqIC8vIHBhcmFtZXRlciBpcyBub3QgdXNlZC4KKyAqIHZvaWQgdkJhY2tsaWdodFRpbWVyQ2FsbGJhY2soIFRpbWVySGFuZGxlX3QgcHhUaW1lciApCisgKiB7CisgKiAgICAgLy8gVGhlIHRpbWVyIGV4cGlyZWQsIHRoZXJlZm9yZSA1IHNlY29uZHMgbXVzdCBoYXZlIHBhc3NlZCBzaW5jZSBhIGtleQorICogICAgIC8vIHdhcyBwcmVzc2VkLiAgU3dpdGNoIG9mZiB0aGUgTENEIGJhY2stbGlnaHQuCisgKiAgICAgdlNldEJhY2tsaWdodFN0YXRlKCBCQUNLTElHSFRfT0ZGICk7CisgKiB9CisgKgorICogLy8gVGhlIGtleSBwcmVzcyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICogdm9pZCB2S2V5UHJlc3NFdmVudEludGVycnVwdEhhbmRsZXIoIHZvaWQgKQorICogeworICogQmFzZVR5cGVfdCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZEZBTFNFOworICoKKyAqICAgICAvLyBFbnN1cmUgdGhlIExDRCBiYWNrLWxpZ2h0IGlzIG9uLCB0aGVuIHJlc2V0IHRoZSB0aW1lciB0aGF0IGlzCisgKiAgICAgLy8gcmVzcG9uc2libGUgZm9yIHR1cm5pbmcgdGhlIGJhY2stbGlnaHQgb2ZmIGFmdGVyIDUgc2Vjb25kcyBvZgorICogICAgIC8vIGtleSBpbmFjdGl2aXR5LiAgVGhpcyBpcyBhbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIHNvIGNhbiBvbmx5CisgKiAgICAgLy8gY2FsbCBGcmVlUlRPUyBBUEkgZnVuY3Rpb25zIHRoYXQgZW5kIGluICJGcm9tSVNSIi4KKyAqICAgICB2U2V0QmFja2xpZ2h0U3RhdGUoIEJBQ0tMSUdIVF9PTiApOworICoKKyAqICAgICAvLyB4VGltZXJTdGFydEZyb21JU1IoKSBvciB4VGltZXJSZXNldEZyb21JU1IoKSBjb3VsZCBiZSBjYWxsZWQgaGVyZQorICogICAgIC8vIGFzIGJvdGggY2F1c2UgdGhlIHRpbWVyIHRvIHJlLWNhbGN1bGF0ZSBpdHMgZXhwaXJ5IHRpbWUuCisgKiAgICAgLy8geEhpZ2hlclByaW9yaXR5VGFza1dva2VuIHdhcyBpbml0aWFsaXNlZCB0byBwZEZBTFNFIHdoZW4gaXQgd2FzCisgKiAgICAgLy8gZGVjbGFyZWQgKGluIHRoaXMgZnVuY3Rpb24pLgorICogICAgIGlmKCB4VGltZXJSZXNldEZyb21JU1IoIHhCYWNrbGlnaHRUaW1lciwgJnhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApICE9IHBkUEFTUyApCisgKiAgICAgeworICogICAgICAgICAvLyBUaGUgcmVzZXQgY29tbWFuZCB3YXMgbm90IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS4gIFRha2UgYXBwcm9wcmlhdGUKKyAqICAgICAgICAgLy8gYWN0aW9uIGhlcmUuCisgKiAgICAgfQorICoKKyAqICAgICAvLyBQZXJmb3JtIHRoZSByZXN0IG9mIHRoZSBrZXkgcHJvY2Vzc2luZyBoZXJlLgorICoKKyAqICAgICAvLyBJZiB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gZXF1YWxzIHBkVFJVRSwgdGhlbiBhIGNvbnRleHQgc3dpdGNoCisgKiAgICAgLy8gc2hvdWxkIGJlIHBlcmZvcm1lZC4gIFRoZSBzeW50YXggcmVxdWlyZWQgdG8gcGVyZm9ybSBhIGNvbnRleHQgc3dpdGNoCisgKiAgICAgLy8gZnJvbSBpbnNpZGUgYW4gSVNSIHZhcmllcyBmcm9tIHBvcnQgdG8gcG9ydCwgYW5kIGZyb20gY29tcGlsZXIgdG8KKyAqICAgICAvLyBjb21waWxlci4gIEluc3BlY3QgdGhlIGRlbW9zIGZvciB0aGUgcG9ydCB5b3UgYXJlIHVzaW5nIHRvIGZpbmQgdGhlCisgKiAgICAgLy8gYWN0dWFsIHN5bnRheCByZXF1aXJlZC4KKyAqICAgICBpZiggeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICE9IHBkRkFMU0UgKQorICogICAgIHsKKyAqICAgICAgICAgLy8gQ2FsbCB0aGUgaW50ZXJydXB0IHNhZmUgeWllbGQgZnVuY3Rpb24gaGVyZSAoYWN0dWFsIGZ1bmN0aW9uCisgKiAgICAgICAgIC8vIGRlcGVuZHMgb24gdGhlIEZyZWVSVE9TIHBvcnQgYmVpbmcgdXNlZCkuCisgKiAgICAgfQorICogfQorICogQGVuZHZlcmJhdGltCisgKi8KKyNkZWZpbmUgeFRpbWVyUmVzZXRGcm9tSVNSKCB4VGltZXIsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSB4VGltZXJHZW5lcmljQ29tbWFuZCggKCB4VGltZXIgKSwgdG1yQ09NTUFORF9SRVNFVF9GUk9NX0lTUiwgKCB4VGFza0dldFRpY2tDb3VudEZyb21JU1IoKSApLCAoIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKSwgMFUgKQorCisKKy8qKgorICogQmFzZVR5cGVfdCB4VGltZXJQZW5kRnVuY3Rpb25DYWxsRnJvbUlTUiggUGVuZGVkRnVuY3Rpb25fdCB4RnVuY3Rpb25Ub1BlbmQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB2UGFyYW1ldGVyMSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdWxQYXJhbWV0ZXIyLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisgKgorICoKKyAqIFVzZWQgZnJvbSBhcHBsaWNhdGlvbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcyB0byBkZWZlciB0aGUgZXhlY3V0aW9uIG9mIGEKKyAqIGZ1bmN0aW9uIHRvIHRoZSBSVE9TIGRhZW1vbiB0YXNrICh0aGUgdGltZXIgc2VydmljZSB0YXNrLCBoZW5jZSB0aGlzIGZ1bmN0aW9uCisgKiBpcyBpbXBsZW1lbnRlZCBpbiB0aW1lcnMuYyBhbmQgaXMgcHJlZml4ZWQgd2l0aCAnVGltZXInKS4KKyAqCisgKiBJZGVhbGx5IGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKElTUikgaXMga2VwdCBhcyBzaG9ydCBhcyBwb3NzaWJsZSwgYnV0CisgKiBzb21ldGltZXMgYW4gSVNSIGVpdGhlciBoYXMgYSBsb3Qgb2YgcHJvY2Vzc2luZyB0byBkbywgb3IgbmVlZHMgdG8gcGVyZm9ybQorICogcHJvY2Vzc2luZyB0aGF0IGlzIG5vdCBkZXRlcm1pbmlzdGljLiAgSW4gdGhlc2UgY2FzZXMKKyAqIHhUaW1lclBlbmRGdW5jdGlvbkNhbGxGcm9tSVNSKCkgY2FuIGJlIHVzZWQgdG8gZGVmZXIgcHJvY2Vzc2luZyBvZiBhIGZ1bmN0aW9uCisgKiB0byB0aGUgUlRPUyBkYWVtb24gdGFzay4KKyAqCisgKiBBIG1lY2hhbmlzbSBpcyBwcm92aWRlZCB0aGF0IGFsbG93cyB0aGUgaW50ZXJydXB0IHRvIHJldHVybiBkaXJlY3RseSB0byB0aGUKKyAqIHRhc2sgdGhhdCB3aWxsIHN1YnNlcXVlbnRseSBleGVjdXRlIHRoZSBwZW5kZWQgY2FsbGJhY2sgZnVuY3Rpb24uICBUaGlzCisgKiBhbGxvd3MgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgY29udGlndW91c2x5IGluIHRpbWUgd2l0aCB0aGUKKyAqIGludGVycnVwdCAtIGp1c3QgYXMgaWYgdGhlIGNhbGxiYWNrIGhhZCBleGVjdXRlZCBpbiB0aGUgaW50ZXJydXB0IGl0c2VsZi4KKyAqCisgKiBAcGFyYW0geEZ1bmN0aW9uVG9QZW5kIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZyb20gdGhlIHRpbWVyIHNlcnZpY2UvCisgKiBkYWVtb24gdGFzay4gIFRoZSBmdW5jdGlvbiBtdXN0IGNvbmZvcm0gdG8gdGhlIFBlbmRlZEZ1bmN0aW9uX3QKKyAqIHByb3RvdHlwZS4KKyAqCisgKiBAcGFyYW0gcHZQYXJhbWV0ZXIxIFRoZSB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24ncyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBUaGUgcGFyYW1ldGVyIGhhcyBhIHZvaWQgKiB0eXBlIHRvIGFsbG93IGl0IHRvIGJlIHVzZWQgdG8gcGFzcyBhbnkgdHlwZS4KKyAqIEZvciBleGFtcGxlLCB1bnNpZ25lZCBsb25ncyBjYW4gYmUgY2FzdCB0byBhIHZvaWQgKiwgb3IgdGhlIHZvaWQgKiBjYW4gYmUKKyAqIHVzZWQgdG8gcG9pbnQgdG8gYSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHVsUGFyYW1ldGVyMiBUaGUgdmFsdWUgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uJ3Mgc2Vjb25kIHBhcmFtZXRlci4KKyAqCisgKiBAcGFyYW0gcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiBBcyBtZW50aW9uZWQgYWJvdmUsIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogd2lsbCByZXN1bHQgaW4gYSBtZXNzYWdlIGJlaW5nIHNlbnQgdG8gdGhlIHRpbWVyIGRhZW1vbiB0YXNrLiAgSWYgdGhlCisgKiBwcmlvcml0eSBvZiB0aGUgdGltZXIgZGFlbW9uIHRhc2sgKHdoaWNoIGlzIHNldCB1c2luZworICogY29uZmlnVElNRVJfVEFTS19QUklPUklUWSBpbiBGcmVlUlRPU0NvbmZpZy5oKSBpcyBoaWdoZXIgdGhhbiB0aGUgcHJpb3JpdHkgb2YKKyAqIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrICh0aGUgdGFzayB0aGUgaW50ZXJydXB0IGludGVycnVwdGVkKSB0aGVuCisgKiAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiB3aWxsIGJlIHNldCB0byBwZFRSVUUgd2l0aGluCisgKiB4VGltZXJQZW5kRnVuY3Rpb25DYWxsRnJvbUlTUigpLCBpbmRpY2F0aW5nIHRoYXQgYSBjb250ZXh0IHN3aXRjaCBzaG91bGQgYmUKKyAqIHJlcXVlc3RlZCBiZWZvcmUgdGhlIGludGVycnVwdCBleGl0cy4gIEZvciB0aGF0IHJlYXNvbgorICogKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gbXVzdCBiZSBpbml0aWFsaXNlZCB0byBwZEZBTFNFLiAgU2VlIHRoZQorICogZXhhbXBsZSBjb2RlIGJlbG93LgorICoKKyAqIEByZXR1cm4gcGRQQVNTIGlzIHJldHVybmVkIGlmIHRoZSBtZXNzYWdlIHdhcyBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUKKyAqIHRpbWVyIGRhZW1vbiB0YXNrLCBvdGhlcndpc2UgcGRGQUxTRSBpcyByZXR1cm5lZC4KKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICogQHZlcmJhdGltCisgKgorICoJLy8gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkYWVtb24gdGFzay4KKyAqICAvLyBOb3RlIGNhbGxiYWNrIGZ1bmN0aW9ucyBtdXN0IGFsbCB1c2UgdGhpcyBzYW1lIHByb3RvdHlwZS4KKyAqICB2b2lkIHZQcm9jZXNzSW50ZXJmYWNlKCB2b2lkICpwdlBhcmFtZXRlcjEsIHVpbnQzMl90IHVsUGFyYW1ldGVyMiApCisgKgl7CisgKgkJQmFzZVR5cGVfdCB4SW50ZXJmYWNlVG9TZXJ2aWNlOworICoKKyAqCQkvLyBUaGUgaW50ZXJmYWNlIHRoYXQgcmVxdWlyZXMgc2VydmljaW5nIGlzIHBhc3NlZCBpbiB0aGUgc2Vjb25kCisgKiAgICAgIC8vIHBhcmFtZXRlci4gIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgaW4gdGhpcyBjYXNlLgorICoJCXhJbnRlcmZhY2VUb1NlcnZpY2UgPSAoIEJhc2VUeXBlX3QgKSB1bFBhcmFtZXRlcjI7CisgKgorICoJCS8vIC4uLlBlcmZvcm0gdGhlIHByb2Nlc3NpbmcgaGVyZS4uLgorICoJfQorICoKKyAqCS8vIEFuIElTUiB0aGF0IHJlY2VpdmVzIGRhdGEgcGFja2V0cyBmcm9tIG11bHRpcGxlIGludGVyZmFjZXMKKyAqICB2b2lkIHZBbklTUiggdm9pZCApCisgKgl7CisgKgkJQmFzZVR5cGVfdCB4SW50ZXJmYWNlVG9TZXJ2aWNlLCB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW47CisgKgorICoJCS8vIFF1ZXJ5IHRoZSBoYXJkd2FyZSB0byBkZXRlcm1pbmUgd2hpY2ggaW50ZXJmYWNlIG5lZWRzIHByb2Nlc3NpbmcuCisgKgkJeEludGVyZmFjZVRvU2VydmljZSA9IHBydkNoZWNrSW50ZXJmYWNlcygpOworICoKKyAqICAgICAgLy8gVGhlIGFjdHVhbCBwcm9jZXNzaW5nIGlzIHRvIGJlIGRlZmVycmVkIHRvIGEgdGFzay4gIFJlcXVlc3QgdGhlCisgKiAgICAgIC8vIHZQcm9jZXNzSW50ZXJmYWNlKCkgY2FsbGJhY2sgZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIHBhc3NpbmcgaW4gdGhlCisgKgkJLy8gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBuZWVkcyBwcm9jZXNzaW5nLiAgVGhlIGludGVyZmFjZSB0bworICoJCS8vIHNlcnZpY2UgaXMgcGFzc2VkIGluIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcworICoJCS8vIG5vdCB1c2VkIGluIHRoaXMgY2FzZS4KKyAqCQl4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZEZBTFNFOworICoJCXhUaW1lclBlbmRGdW5jdGlvbkNhbGxGcm9tSVNSKCB2UHJvY2Vzc0ludGVyZmFjZSwgTlVMTCwgKCB1aW50MzJfdCApIHhJbnRlcmZhY2VUb1NlcnZpY2UsICZ4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKyAqCisgKgkJLy8gSWYgeEhpZ2hlclByaW9yaXR5VGFza1dva2VuIGlzIG5vdyBzZXQgdG8gcGRUUlVFIHRoZW4gYSBjb250ZXh0CisgKgkJLy8gc3dpdGNoIHNob3VsZCBiZSByZXF1ZXN0ZWQuICBUaGUgbWFjcm8gdXNlZCBpcyBwb3J0IHNwZWNpZmljIGFuZCB3aWxsCisgKgkJLy8gYmUgZWl0aGVyIHBvcnRZSUVMRF9GUk9NX0lTUigpIG9yIHBvcnRFTkRfU1dJVENISU5HX0lTUigpIC0gcmVmZXIgdG8KKyAqCQkvLyB0aGUgZG9jdW1lbnRhdGlvbiBwYWdlIGZvciB0aGUgcG9ydCBiZWluZyB1c2VkLgorICoJCXBvcnRZSUVMRF9GUk9NX0lTUiggeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisgKgorICoJfQorICogQGVuZHZlcmJhdGltCisgKi8KK0Jhc2VUeXBlX3QgeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbEZyb21JU1IoIFBlbmRlZEZ1bmN0aW9uX3QgeEZ1bmN0aW9uVG9QZW5kLCB2b2lkICpwdlBhcmFtZXRlcjEsIHVpbnQzMl90IHVsUGFyYW1ldGVyMiwgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKyAvKioKKyAgKiBCYXNlVHlwZV90IHhUaW1lclBlbmRGdW5jdGlvbkNhbGwoIFBlbmRlZEZ1bmN0aW9uX3QgeEZ1bmN0aW9uVG9QZW5kLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHZQYXJhbWV0ZXIxLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdWxQYXJhbWV0ZXIyLAorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKKyAgKgorICAqCisgICogVXNlZCB0byBkZWZlciB0aGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24gdG8gdGhlIFJUT1MgZGFlbW9uIHRhc2sgKHRoZSB0aW1lcgorICAqIHNlcnZpY2UgdGFzaywgaGVuY2UgdGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0aW1lcnMuYyBhbmQgaXMgcHJlZml4ZWQKKyAgKiB3aXRoICdUaW1lcicpLgorICAqCisgICogQHBhcmFtIHhGdW5jdGlvblRvUGVuZCBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmcm9tIHRoZSB0aW1lciBzZXJ2aWNlLworICAqIGRhZW1vbiB0YXNrLiAgVGhlIGZ1bmN0aW9uIG11c3QgY29uZm9ybSB0byB0aGUgUGVuZGVkRnVuY3Rpb25fdAorICAqIHByb3RvdHlwZS4KKyAgKgorICAqIEBwYXJhbSBwdlBhcmFtZXRlcjEgVGhlIHZhbHVlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbidzIGZpcnN0IHBhcmFtZXRlci4KKyAgKiBUaGUgcGFyYW1ldGVyIGhhcyBhIHZvaWQgKiB0eXBlIHRvIGFsbG93IGl0IHRvIGJlIHVzZWQgdG8gcGFzcyBhbnkgdHlwZS4KKyAgKiBGb3IgZXhhbXBsZSwgdW5zaWduZWQgbG9uZ3MgY2FuIGJlIGNhc3QgdG8gYSB2b2lkICosIG9yIHRoZSB2b2lkICogY2FuIGJlCisgICogdXNlZCB0byBwb2ludCB0byBhIHN0cnVjdHVyZS4KKyAgKgorICAqIEBwYXJhbSB1bFBhcmFtZXRlcjIgVGhlIHZhbHVlIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbidzIHNlY29uZCBwYXJhbWV0ZXIuCisgICoKKyAgKiBAcGFyYW0geFRpY2tzVG9XYWl0IENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIHJlc3VsdCBpbiBhIG1lc3NhZ2UgYmVpbmcKKyAgKiBzZW50IHRvIHRoZSB0aW1lciBkYWVtb24gdGFzayBvbiBhIHF1ZXVlLiAgeFRpY2tzVG9XYWl0IGlzIHRoZSBhbW91bnQgb2YKKyAgKiB0aW1lIHRoZSBjYWxsaW5nIHRhc2sgc2hvdWxkIHJlbWFpbiBpbiB0aGUgQmxvY2tlZCBzdGF0ZSAoc28gbm90IHVzaW5nIGFueQorICAqIHByb2Nlc3NpbmcgdGltZSkgZm9yIHNwYWNlIHRvIGJlY29tZSBhdmFpbGFibGUgb24gdGhlIHRpbWVyIHF1ZXVlIGlmIHRoZQorICAqIHF1ZXVlIGlzIGZvdW5kIHRvIGJlIGZ1bGwuCisgICoKKyAgKiBAcmV0dXJuIHBkUEFTUyBpcyByZXR1cm5lZCBpZiB0aGUgbWVzc2FnZSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlCisgICogdGltZXIgZGFlbW9uIHRhc2ssIG90aGVyd2lzZSBwZEZBTFNFIGlzIHJldHVybmVkLgorICAqCisgICovCitCYXNlVHlwZV90IHhUaW1lclBlbmRGdW5jdGlvbkNhbGwoIFBlbmRlZEZ1bmN0aW9uX3QgeEZ1bmN0aW9uVG9QZW5kLCB2b2lkICpwdlBhcmFtZXRlcjEsIHVpbnQzMl90IHVsUGFyYW1ldGVyMiwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIGNvbnN0IGNoYXIgKiBjb25zdCBwY1RpbWVyR2V0TmFtZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKTsKKyAqCisgKiBSZXR1cm5zIHRoZSBuYW1lIHRoYXQgd2FzIGFzc2lnbmVkIHRvIGEgdGltZXIgd2hlbiB0aGUgdGltZXIgd2FzIGNyZWF0ZWQuCisgKgorICogQHBhcmFtIHhUaW1lciBUaGUgaGFuZGxlIG9mIHRoZSB0aW1lciBiZWluZyBxdWVyaWVkLgorICoKKyAqIEByZXR1cm4gVGhlIG5hbWUgYXNzaWduZWQgdG8gdGhlIHRpbWVyIHNwZWNpZmllZCBieSB0aGUgeFRpbWVyIHBhcmFtZXRlci4KKyAqLworY29uc3QgY2hhciAqIHBjVGltZXJHZXROYW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApIFBSSVZJTEVHRURfRlVOQ1RJT047IC8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworCisvKioKKyAqIFRpY2tUeXBlX3QgeFRpbWVyR2V0UGVyaW9kKCBUaW1lckhhbmRsZV90IHhUaW1lciApOworICoKKyAqIFJldHVybnMgdGhlIHBlcmlvZCBvZiBhIHRpbWVyLgorICoKKyAqIEBwYXJhbSB4VGltZXIgVGhlIGhhbmRsZSBvZiB0aGUgdGltZXIgYmVpbmcgcXVlcmllZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBwZXJpb2Qgb2YgdGhlIHRpbWVyIGluIHRpY2tzLgorICovCitUaWNrVHlwZV90IHhUaW1lckdldFBlcmlvZCggVGltZXJIYW5kbGVfdCB4VGltZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyogVGlja1R5cGVfdCB4VGltZXJHZXRFeHBpcnlUaW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApOworKgorKiBSZXR1cm5zIHRoZSB0aW1lIGluIHRpY2tzIGF0IHdoaWNoIHRoZSB0aW1lciB3aWxsIGV4cGlyZS4gIElmIHRoaXMgaXMgbGVzcworKiB0aGFuIHRoZSBjdXJyZW50IHRpY2sgY291bnQgdGhlbiB0aGUgZXhwaXJ5IHRpbWUgaGFzIG92ZXJmbG93ZWQgZnJvbSB0aGUKKyogY3VycmVudCB0aW1lLgorKgorKiBAcGFyYW0geFRpbWVyIFRoZSBoYW5kbGUgb2YgdGhlIHRpbWVyIGJlaW5nIHF1ZXJpZWQuCisqCisqIEByZXR1cm4gSWYgdGhlIHRpbWVyIGlzIHJ1bm5pbmcgdGhlbiB0aGUgdGltZSBpbiB0aWNrcyBhdCB3aGljaCB0aGUgdGltZXIKKyogd2lsbCBuZXh0IGV4cGlyZSBpcyByZXR1cm5lZC4gIElmIHRoZSB0aW1lciBpcyBub3QgcnVubmluZyB0aGVuIHRoZSByZXR1cm4KKyogdmFsdWUgaXMgdW5kZWZpbmVkLgorKi8KK1RpY2tUeXBlX3QgeFRpbWVyR2V0RXhwaXJ5VGltZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogRnVuY3Rpb25zIGJleW9uZCB0aGlzIHBhcnQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGFuZCBhcmUgaW50ZW5kZWQKKyAqIGZvciB1c2UgYnkgdGhlIGtlcm5lbCBvbmx5LgorICovCitCYXNlVHlwZV90IHhUaW1lckNyZWF0ZVRpbWVyVGFzayggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CitCYXNlVHlwZV90IHhUaW1lckdlbmVyaWNDb21tYW5kKCBUaW1lckhhbmRsZV90IHhUaW1lciwgY29uc3QgQmFzZVR5cGVfdCB4Q29tbWFuZElELCBjb25zdCBUaWNrVHlwZV90IHhPcHRpb25hbFZhbHVlLCBCYXNlVHlwZV90ICogY29uc3QgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiwgY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjaWYoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwl2b2lkIHZUaW1lclNldFRpbWVyTnVtYmVyKCBUaW1lckhhbmRsZV90IHhUaW1lciwgVUJhc2VUeXBlX3QgdXhUaW1lck51bWJlciApIFBSSVZJTEVHRURfRlVOQ1RJT047CisJVUJhc2VUeXBlX3QgdXhUaW1lckdldFRpbWVyTnVtYmVyKCBUaW1lckhhbmRsZV90IHhUaW1lciApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiBUSU1FUlNfSCAqLworCisKKwpkaWZmIC0tZ2l0IGEvU291cmNlL2xpc3QuYyBiL1NvdXJjZS9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NTIzYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9saXN0LmMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgImxpc3QuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUFVCTElDIExJU1QgQVBJIGRvY3VtZW50ZWQgaW4gbGlzdC5oCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZMaXN0SW5pdGlhbGlzZSggTGlzdF90ICogY29uc3QgcHhMaXN0ICkKK3sKKwkvKiBUaGUgbGlzdCBzdHJ1Y3R1cmUgY29udGFpbnMgYSBsaXN0IGl0ZW0gd2hpY2ggaXMgdXNlZCB0byBtYXJrIHRoZQorCWVuZCBvZiB0aGUgbGlzdC4gIFRvIGluaXRpYWxpc2UgdGhlIGxpc3QgdGhlIGxpc3QgZW5kIGlzIGluc2VydGVkCisJYXMgdGhlIG9ubHkgbGlzdCBlbnRyeS4gKi8KKwlweExpc3QtPnB4SW5kZXggPSAoIExpc3RJdGVtX3QgKiApICYoIHB4TGlzdC0+eExpc3RFbmQgKTsJCQkvKmxpbnQgIWU4MjYgIWU3NDAgVGhlIG1pbmkgbGlzdCBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyB0aGUgbGlzdCBlbmQgdG8gc2F2ZSBSQU0uICBUaGlzIGlzIGNoZWNrZWQgYW5kIHZhbGlkLiAqLworCisJLyogVGhlIGxpc3QgZW5kIHZhbHVlIGlzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHZhbHVlIGluIHRoZSBsaXN0IHRvCisJZW5zdXJlIGl0IHJlbWFpbnMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4gKi8KKwlweExpc3QtPnhMaXN0RW5kLnhJdGVtVmFsdWUgPSBwb3J0TUFYX0RFTEFZOworCisJLyogVGhlIGxpc3QgZW5kIG5leHQgYW5kIHByZXZpb3VzIHBvaW50ZXJzIHBvaW50IHRvIGl0c2VsZiBzbyB3ZSBrbm93CisJd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS4gKi8KKwlweExpc3QtPnhMaXN0RW5kLnB4TmV4dCA9ICggTGlzdEl0ZW1fdCAqICkgJiggcHhMaXN0LT54TGlzdEVuZCApOwkvKmxpbnQgIWU4MjYgIWU3NDAgVGhlIG1pbmkgbGlzdCBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyB0aGUgbGlzdCBlbmQgdG8gc2F2ZSBSQU0uICBUaGlzIGlzIGNoZWNrZWQgYW5kIHZhbGlkLiAqLworCXB4TGlzdC0+eExpc3RFbmQucHhQcmV2aW91cyA9ICggTGlzdEl0ZW1fdCAqICkgJiggcHhMaXN0LT54TGlzdEVuZCApOy8qbGludCAhZTgyNiAhZTc0MCBUaGUgbWluaSBsaXN0IHN0cnVjdHVyZSBpcyB1c2VkIGFzIHRoZSBsaXN0IGVuZCB0byBzYXZlIFJBTS4gIFRoaXMgaXMgY2hlY2tlZCBhbmQgdmFsaWQuICovCisKKwlweExpc3QtPnV4TnVtYmVyT2ZJdGVtcyA9ICggVUJhc2VUeXBlX3QgKSAwVTsKKworCS8qIFdyaXRlIGtub3duIHZhbHVlcyBpbnRvIHRoZSBsaXN0IGlmCisJY29uZmlnVVNFX0xJU1RfREFUQV9JTlRFR1JJVFlfQ0hFQ0tfQllURVMgaXMgc2V0IHRvIDEuICovCisJbGlzdFNFVF9MSVNUX0lOVEVHUklUWV9DSEVDS18xX1ZBTFVFKCBweExpc3QgKTsKKwlsaXN0U0VUX0xJU1RfSU5URUdSSVRZX0NIRUNLXzJfVkFMVUUoIHB4TGlzdCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdkxpc3RJbml0aWFsaXNlSXRlbSggTGlzdEl0ZW1fdCAqIGNvbnN0IHB4SXRlbSApCit7CisJLyogTWFrZSBzdXJlIHRoZSBsaXN0IGl0ZW0gaXMgbm90IHJlY29yZGVkIGFzIGJlaW5nIG9uIGEgbGlzdC4gKi8KKwlweEl0ZW0tPnB2Q29udGFpbmVyID0gTlVMTDsKKworCS8qIFdyaXRlIGtub3duIHZhbHVlcyBpbnRvIHRoZSBsaXN0IGl0ZW0gaWYKKwljb25maWdVU0VfTElTVF9EQVRBX0lOVEVHUklUWV9DSEVDS19CWVRFUyBpcyBzZXQgdG8gMS4gKi8KKwlsaXN0U0VUX0ZJUlNUX0xJU1RfSVRFTV9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUoIHB4SXRlbSApOworCWxpc3RTRVRfU0VDT05EX0xJU1RfSVRFTV9JTlRFR1JJVFlfQ0hFQ0tfVkFMVUUoIHB4SXRlbSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdkxpc3RJbnNlcnRFbmQoIExpc3RfdCAqIGNvbnN0IHB4TGlzdCwgTGlzdEl0ZW1fdCAqIGNvbnN0IHB4TmV3TGlzdEl0ZW0gKQoreworTGlzdEl0ZW1fdCAqIGNvbnN0IHB4SW5kZXggPSBweExpc3QtPnB4SW5kZXg7CisKKwkvKiBPbmx5IGVmZmVjdGl2ZSB3aGVuIGNvbmZpZ0FTU0VSVCgpIGlzIGFsc28gZGVmaW5lZCwgdGhlc2UgdGVzdHMgbWF5IGNhdGNoCisJdGhlIGxpc3QgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIG92ZXJ3cml0dGVuIGluIG1lbW9yeS4gIFRoZXkgd2lsbCBub3QgY2F0Y2gKKwlkYXRhIGVycm9ycyBjYXVzZWQgYnkgaW5jb3JyZWN0IGNvbmZpZ3VyYXRpb24gb3IgdXNlIG9mIEZyZWVSVE9TLiAqLworCWxpc3RURVNUX0xJU1RfSU5URUdSSVRZKCBweExpc3QgKTsKKwlsaXN0VEVTVF9MSVNUX0lURU1fSU5URUdSSVRZKCBweE5ld0xpc3RJdGVtICk7CisKKwkvKiBJbnNlcnQgYSBuZXcgbGlzdCBpdGVtIGludG8gcHhMaXN0LCBidXQgcmF0aGVyIHRoYW4gc29ydCB0aGUgbGlzdCwKKwltYWtlcyB0aGUgbmV3IGxpc3QgaXRlbSB0aGUgbGFzdCBpdGVtIHRvIGJlIHJlbW92ZWQgYnkgYSBjYWxsIHRvCisJbGlzdEdFVF9PV05FUl9PRl9ORVhUX0VOVFJZKCkuICovCisJcHhOZXdMaXN0SXRlbS0+cHhOZXh0ID0gcHhJbmRleDsKKwlweE5ld0xpc3RJdGVtLT5weFByZXZpb3VzID0gcHhJbmRleC0+cHhQcmV2aW91czsKKworCS8qIE9ubHkgdXNlZCBkdXJpbmcgZGVjaXNpb24gY292ZXJhZ2UgdGVzdGluZy4gKi8KKwltdENPVkVSQUdFX1RFU1RfREVMQVkoKTsKKworCXB4SW5kZXgtPnB4UHJldmlvdXMtPnB4TmV4dCA9IHB4TmV3TGlzdEl0ZW07CisJcHhJbmRleC0+cHhQcmV2aW91cyA9IHB4TmV3TGlzdEl0ZW07CisKKwkvKiBSZW1lbWJlciB3aGljaCBsaXN0IHRoZSBpdGVtIGlzIGluLiAqLworCXB4TmV3TGlzdEl0ZW0tPnB2Q29udGFpbmVyID0gKCB2b2lkICogKSBweExpc3Q7CisKKwkoIHB4TGlzdC0+dXhOdW1iZXJPZkl0ZW1zICkrKzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZMaXN0SW5zZXJ0KCBMaXN0X3QgKiBjb25zdCBweExpc3QsIExpc3RJdGVtX3QgKiBjb25zdCBweE5ld0xpc3RJdGVtICkKK3sKK0xpc3RJdGVtX3QgKnB4SXRlcmF0b3I7Citjb25zdCBUaWNrVHlwZV90IHhWYWx1ZU9mSW5zZXJ0aW9uID0gcHhOZXdMaXN0SXRlbS0+eEl0ZW1WYWx1ZTsKKworCS8qIE9ubHkgZWZmZWN0aXZlIHdoZW4gY29uZmlnQVNTRVJUKCkgaXMgYWxzbyBkZWZpbmVkLCB0aGVzZSB0ZXN0cyBtYXkgY2F0Y2gKKwl0aGUgbGlzdCBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgb3ZlcndyaXR0ZW4gaW4gbWVtb3J5LiAgVGhleSB3aWxsIG5vdCBjYXRjaAorCWRhdGEgZXJyb3JzIGNhdXNlZCBieSBpbmNvcnJlY3QgY29uZmlndXJhdGlvbiBvciB1c2Ugb2YgRnJlZVJUT1MuICovCisJbGlzdFRFU1RfTElTVF9JTlRFR1JJVFkoIHB4TGlzdCApOworCWxpc3RURVNUX0xJU1RfSVRFTV9JTlRFR1JJVFkoIHB4TmV3TGlzdEl0ZW0gKTsKKworCS8qIEluc2VydCB0aGUgbmV3IGxpc3QgaXRlbSBpbnRvIHRoZSBsaXN0LCBzb3J0ZWQgaW4geEl0ZW1WYWx1ZSBvcmRlci4KKworCUlmIHRoZSBsaXN0IGFscmVhZHkgY29udGFpbnMgYSBsaXN0IGl0ZW0gd2l0aCB0aGUgc2FtZSBpdGVtIHZhbHVlIHRoZW4gdGhlCisJbmV3IGxpc3QgaXRlbSBzaG91bGQgYmUgcGxhY2VkIGFmdGVyIGl0LiAgVGhpcyBlbnN1cmVzIHRoYXQgVENCJ3Mgd2hpY2ggYXJlCisJc3RvcmVkIGluIHJlYWR5IGxpc3RzIChhbGwgb2Ygd2hpY2ggaGF2ZSB0aGUgc2FtZSB4SXRlbVZhbHVlIHZhbHVlKSBnZXQgYQorCXNoYXJlIG9mIHRoZSBDUFUuICBIb3dldmVyLCBpZiB0aGUgeEl0ZW1WYWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgYmFjayBtYXJrZXIKKwl0aGUgaXRlcmF0aW9uIGxvb3AgYmVsb3cgd2lsbCBub3QgZW5kLiAgVGhlcmVmb3JlIHRoZSB2YWx1ZSBpcyBjaGVja2VkCisJZmlyc3QsIGFuZCB0aGUgYWxnb3JpdGhtIHNsaWdodGx5IG1vZGlmaWVkIGlmIG5lY2Vzc2FyeS4gKi8KKwlpZiggeFZhbHVlT2ZJbnNlcnRpb24gPT0gcG9ydE1BWF9ERUxBWSApCisJeworCQlweEl0ZXJhdG9yID0gcHhMaXN0LT54TGlzdEVuZC5weFByZXZpb3VzOworCX0KKwllbHNlCisJeworCQkvKiAqKiogTk9URSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQlJZiB5b3UgZmluZCB5b3VyIGFwcGxpY2F0aW9uIGlzIGNyYXNoaW5nIGhlcmUgdGhlbiBsaWtlbHkgY2F1c2VzIGFyZQorCQlsaXN0ZWQgYmVsb3cuICBJbiBhZGRpdGlvbiBzZWUgaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvRkFRSGVscC5odG1sIGZvcgorCQltb3JlIHRpcHMsIGFuZCBlbnN1cmUgY29uZmlnQVNTRVJUKCkgaXMgZGVmaW5lZCEKKwkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTEwLmh0bWwjY29uZmlnQVNTRVJUCisKKwkJCTEpIFN0YWNrIG92ZXJmbG93IC0KKwkJCSAgIHNlZSBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9TdGFja3MtYW5kLXN0YWNrLW92ZXJmbG93LWNoZWNraW5nLmh0bWwKKwkJCTIpIEluY29ycmVjdCBpbnRlcnJ1cHQgcHJpb3JpdHkgYXNzaWdubWVudCwgZXNwZWNpYWxseSBvbiBDb3J0ZXgtTQorCQkJICAgcGFydHMgd2hlcmUgbnVtZXJpY2FsbHkgaGlnaCBwcmlvcml0eSB2YWx1ZXMgZGVub3RlIGxvdyBhY3R1YWwKKwkJCSAgIGludGVycnVwdCBwcmlvcml0aWVzLCB3aGljaCBjYW4gc2VlbSBjb3VudGVyIGludHVpdGl2ZS4gIFNlZQorCQkJICAgaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCBhbmQgdGhlIGRlZmluaXRpb24KKwkJCSAgIG9mIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBvbgorCQkJICAgaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTEwLmh0bWwKKwkJCTMpIENhbGxpbmcgYW4gQVBJIGZ1bmN0aW9uIGZyb20gd2l0aGluIGEgY3JpdGljYWwgc2VjdGlvbiBvciB3aGVuCisJCQkgICB0aGUgc2NoZWR1bGVyIGlzIHN1c3BlbmRlZCwgb3IgY2FsbGluZyBhbiBBUEkgZnVuY3Rpb24gdGhhdCBkb2VzCisJCQkgICBub3QgZW5kIGluICJGcm9tSVNSIiBmcm9tIGFuIGludGVycnVwdC4KKwkJCTQpIFVzaW5nIGEgcXVldWUgb3Igc2VtYXBob3JlIGJlZm9yZSBpdCBoYXMgYmVlbiBpbml0aWFsaXNlZCBvcgorCQkJICAgYmVmb3JlIHRoZSBzY2hlZHVsZXIgaGFzIGJlZW4gc3RhcnRlZCAoYXJlIGludGVycnVwdHMgZmlyaW5nCisJCQkgICBiZWZvcmUgdlRhc2tTdGFydFNjaGVkdWxlcigpIGhhcyBiZWVuIGNhbGxlZD8pLgorCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJCWZvciggcHhJdGVyYXRvciA9ICggTGlzdEl0ZW1fdCAqICkgJiggcHhMaXN0LT54TGlzdEVuZCApOyBweEl0ZXJhdG9yLT5weE5leHQtPnhJdGVtVmFsdWUgPD0geFZhbHVlT2ZJbnNlcnRpb247IHB4SXRlcmF0b3IgPSBweEl0ZXJhdG9yLT5weE5leHQgKSAvKmxpbnQgIWU4MjYgIWU3NDAgVGhlIG1pbmkgbGlzdCBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyB0aGUgbGlzdCBlbmQgdG8gc2F2ZSBSQU0uICBUaGlzIGlzIGNoZWNrZWQgYW5kIHZhbGlkLiAqLworCQl7CisJCQkvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUsIGp1c3QgaXRlcmF0aW5nIHRvIHRoZSB3YW50ZWQKKwkJCWluc2VydGlvbiBwb3NpdGlvbi4gKi8KKwkJfQorCX0KKworCXB4TmV3TGlzdEl0ZW0tPnB4TmV4dCA9IHB4SXRlcmF0b3ItPnB4TmV4dDsKKwlweE5ld0xpc3RJdGVtLT5weE5leHQtPnB4UHJldmlvdXMgPSBweE5ld0xpc3RJdGVtOworCXB4TmV3TGlzdEl0ZW0tPnB4UHJldmlvdXMgPSBweEl0ZXJhdG9yOworCXB4SXRlcmF0b3ItPnB4TmV4dCA9IHB4TmV3TGlzdEl0ZW07CisKKwkvKiBSZW1lbWJlciB3aGljaCBsaXN0IHRoZSBpdGVtIGlzIGluLiAgVGhpcyBhbGxvd3MgZmFzdCByZW1vdmFsIG9mIHRoZQorCWl0ZW0gbGF0ZXIuICovCisJcHhOZXdMaXN0SXRlbS0+cHZDb250YWluZXIgPSAoIHZvaWQgKiApIHB4TGlzdDsKKworCSggcHhMaXN0LT51eE51bWJlck9mSXRlbXMgKSsrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1VCYXNlVHlwZV90IHV4TGlzdFJlbW92ZSggTGlzdEl0ZW1fdCAqIGNvbnN0IHB4SXRlbVRvUmVtb3ZlICkKK3sKKy8qIFRoZSBsaXN0IGl0ZW0ga25vd3Mgd2hpY2ggbGlzdCBpdCBpcyBpbi4gIE9idGFpbiB0aGUgbGlzdCBmcm9tIHRoZSBsaXN0CitpdGVtLiAqLworTGlzdF90ICogY29uc3QgcHhMaXN0ID0gKCBMaXN0X3QgKiApIHB4SXRlbVRvUmVtb3ZlLT5wdkNvbnRhaW5lcjsKKworCXB4SXRlbVRvUmVtb3ZlLT5weE5leHQtPnB4UHJldmlvdXMgPSBweEl0ZW1Ub1JlbW92ZS0+cHhQcmV2aW91czsKKwlweEl0ZW1Ub1JlbW92ZS0+cHhQcmV2aW91cy0+cHhOZXh0ID0gcHhJdGVtVG9SZW1vdmUtPnB4TmV4dDsKKworCS8qIE9ubHkgdXNlZCBkdXJpbmcgZGVjaXNpb24gY292ZXJhZ2UgdGVzdGluZy4gKi8KKwltdENPVkVSQUdFX1RFU1RfREVMQVkoKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgaW5kZXggaXMgbGVmdCBwb2ludGluZyB0byBhIHZhbGlkIGl0ZW0uICovCisJaWYoIHB4TGlzdC0+cHhJbmRleCA9PSBweEl0ZW1Ub1JlbW92ZSApCisJeworCQlweExpc3QtPnB4SW5kZXggPSBweEl0ZW1Ub1JlbW92ZS0+cHhQcmV2aW91czsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCXB4SXRlbVRvUmVtb3ZlLT5wdkNvbnRhaW5lciA9IE5VTEw7CisJKCBweExpc3QtPnV4TnVtYmVyT2ZJdGVtcyApLS07CisKKwlyZXR1cm4gcHhMaXN0LT51eE51bWJlck9mSXRlbXM7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0NvbW1vbi9tcHVfd3JhcHBlcnMuYyBiL1NvdXJjZS9wb3J0YWJsZS9Db21tb24vbXB1X3dyYXBwZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3MmI3NAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9Db21tb24vbXB1X3dyYXBwZXJzLmMKQEAgLTAsMCArMSwxMjkwIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB3cmFwcGVyIGZ1bmN0aW9ucyB1c2VkIHRvIHJhaXNlIHRoZSBwcm9jZXNzb3IgcHJpdmlsZWdlCisgKiBiZWZvcmUgY2FsbGluZyBhIHN0YW5kYXJkIEZyZWVSVE9TIEFQSSBmdW5jdGlvbi4KKyAqLworCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCithbGwgdGhlIEFQSSBmdW5jdGlvbnMgdG8gdXNlIHRoZSBNUFUgd3JhcHBlcnMuICBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgordGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisjaW5jbHVkZSAidGltZXJzLmgiCisjaW5jbHVkZSAiZXZlbnRfZ3JvdXBzLmgiCisjaW5jbHVkZSAic3RyZWFtX2J1ZmZlci5oIgorI2luY2x1ZGUgIm1wdV9wcm90b3R5cGVzLmgiCisKKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKgorICogQ2hlY2tzIHRvIHNlZSBpZiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBvZiBhbiB1bnByaXZpbGVnZWQgdGFzaywgYW5kCisgKiBpZiBzbyByYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBhbmQgcmV0dXJucyBmYWxzZSAtIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcKKyAqIG90aGVyIHRoYW4gcmV0dXJuIHRydWUuCisgKi8KK2V4dGVybiBCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisJQmFzZVR5cGVfdCBNUFVfeFRhc2tDcmVhdGVSZXN0cmljdGVkKCBjb25zdCBUYXNrUGFyYW1ldGVyc190ICogY29uc3QgcHhUYXNrRGVmaW5pdGlvbiwgVGFza0hhbmRsZV90ICpweENyZWF0ZWRUYXNrICkKKwl7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4VGFza0NyZWF0ZVJlc3RyaWN0ZWQoIHB4VGFza0RlZmluaXRpb24sIHB4Q3JlYXRlZFRhc2sgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZiAvKiBjb25pZmdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKwlCYXNlVHlwZV90IE1QVV94VGFza0NyZWF0ZVJlc3RyaWN0ZWRTdGF0aWMoIGNvbnN0IFRhc2tQYXJhbWV0ZXJzX3QgKiBjb25zdCBweFRhc2tEZWZpbml0aW9uLCBUYXNrSGFuZGxlX3QgKnB4Q3JlYXRlZFRhc2sgKQorCXsKKwlCYXNlVHlwZV90IHhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJeFJldHVybiA9IHhUYXNrQ3JlYXRlUmVzdHJpY3RlZFN0YXRpYyggcHhUYXNrRGVmaW5pdGlvbiwgcHhDcmVhdGVkVGFzayApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmIC8qIGNvbmlmZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKwlCYXNlVHlwZV90IE1QVV94VGFza0NyZWF0ZSggVGFza0Z1bmN0aW9uX3QgcHZUYXNrQ29kZSwgY29uc3QgY2hhciAqIGNvbnN0IHBjTmFtZSwgdWludDE2X3QgdXNTdGFja0RlcHRoLCB2b2lkICpwdlBhcmFtZXRlcnMsIFVCYXNlVHlwZV90IHV4UHJpb3JpdHksIFRhc2tIYW5kbGVfdCAqcHhDcmVhdGVkVGFzayApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFRhc2tDcmVhdGUoIHB2VGFza0NvZGUsIHBjTmFtZSwgdXNTdGFja0RlcHRoLCBwdlBhcmFtZXRlcnMsIHV4UHJpb3JpdHksIHB4Q3JlYXRlZFRhc2sgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKwlUYXNrSGFuZGxlX3QgTVBVX3hUYXNrQ3JlYXRlU3RhdGljKCBUYXNrRnVuY3Rpb25fdCBweFRhc2tDb2RlLCBjb25zdCBjaGFyICogY29uc3QgcGNOYW1lLCBjb25zdCB1aW50MzJfdCB1bFN0YWNrRGVwdGgsIHZvaWQgKiBjb25zdCBwdlBhcmFtZXRlcnMsIFVCYXNlVHlwZV90IHV4UHJpb3JpdHksIFN0YWNrVHlwZV90ICogY29uc3QgcHV4U3RhY2tCdWZmZXIsIFN0YXRpY1Rhc2tfdCAqIGNvbnN0IHB4VGFza0J1ZmZlciApCisJeworCVRhc2tIYW5kbGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4VGFza0NyZWF0ZVN0YXRpYyggcHhUYXNrQ29kZSwgcGNOYW1lLCB1bFN0YWNrRGVwdGgsIHB2UGFyYW1ldGVycywgdXhQcmlvcml0eSwgcHV4U3RhY2tCdWZmZXIsIHB4VGFza0J1ZmZlciApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIE1QVV92VGFza0FsbG9jYXRlTVBVUmVnaW9ucyggVGFza0hhbmRsZV90IHhUYXNrLCBjb25zdCBNZW1vcnlSZWdpb25fdCAqIGNvbnN0IHhSZWdpb25zICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJdlRhc2tBbGxvY2F0ZU1QVVJlZ2lvbnMoIHhUYXNrLCB4UmVnaW9ucyApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfdlRhc2tEZWxldGUgPT0gMSApCisJdm9pZCBNUFVfdlRhc2tEZWxldGUoIFRhc2tIYW5kbGVfdCBweFRhc2tUb0RlbGV0ZSApCisJeworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXZUYXNrRGVsZXRlKCBweFRhc2tUb0RlbGV0ZSApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBJTkNMVURFX3ZUYXNrRGVsYXlVbnRpbCA9PSAxICkKKwl2b2lkIE1QVV92VGFza0RlbGF5VW50aWwoIFRpY2tUeXBlX3QgKiBjb25zdCBweFByZXZpb3VzV2FrZVRpbWUsIFRpY2tUeXBlX3QgeFRpbWVJbmNyZW1lbnQgKQorCXsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl2VGFza0RlbGF5VW50aWwoIHB4UHJldmlvdXNXYWtlVGltZSwgeFRpbWVJbmNyZW1lbnQgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV94VGFza0Fib3J0RGVsYXkgPT0gMSApCisJQmFzZVR5cGVfdCBNUFVfeFRhc2tBYm9ydERlbGF5KCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCXsKKwlCYXNlVHlwZV90IHhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJeFJldHVybiA9IHhUYXNrQWJvcnREZWxheSggeFRhc2sgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfdlRhc2tEZWxheSA9PSAxICkKKwl2b2lkIE1QVV92VGFza0RlbGF5KCBUaWNrVHlwZV90IHhUaWNrc1RvRGVsYXkgKQorCXsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl2VGFza0RlbGF5KCB4VGlja3NUb0RlbGF5ICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfdXhUYXNrUHJpb3JpdHlHZXQgPT0gMSApCisJVUJhc2VUeXBlX3QgTVBVX3V4VGFza1ByaW9yaXR5R2V0KCBUYXNrSGFuZGxlX3QgcHhUYXNrICkKKwl7CisJVUJhc2VUeXBlX3QgdXhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJdXhSZXR1cm4gPSB1eFRhc2tQcmlvcml0eUdldCggcHhUYXNrICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCQlyZXR1cm4gdXhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV92VGFza1ByaW9yaXR5U2V0ID09IDEgKQorCXZvaWQgTVBVX3ZUYXNrUHJpb3JpdHlTZXQoIFRhc2tIYW5kbGVfdCBweFRhc2ssIFVCYXNlVHlwZV90IHV4TmV3UHJpb3JpdHkgKQorCXsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl2VGFza1ByaW9yaXR5U2V0KCBweFRhc2ssIHV4TmV3UHJpb3JpdHkgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV9lVGFza0dldFN0YXRlID09IDEgKQorCWVUYXNrU3RhdGUgTVBVX2VUYXNrR2V0U3RhdGUoIFRhc2tIYW5kbGVfdCBweFRhc2sgKQorCXsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKwllVGFza1N0YXRlIGVSZXR1cm47CisKKwkJZVJldHVybiA9IGVUYXNrR2V0U3RhdGUoIHB4VGFzayApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIGVSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisJdm9pZCBNUFVfdlRhc2tHZXRJbmZvKCBUYXNrSGFuZGxlX3QgeFRhc2ssIFRhc2tTdGF0dXNfdCAqcHhUYXNrU3RhdHVzLCBCYXNlVHlwZV90IHhHZXRGcmVlU3RhY2tTcGFjZSwgZVRhc2tTdGF0ZSBlU3RhdGUgKQorCXsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl2VGFza0dldEluZm8oIHhUYXNrLCBweFRhc2tTdGF0dXMsIHhHZXRGcmVlU3RhY2tTcGFjZSwgZVN0YXRlICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfeFRhc2tHZXRJZGxlVGFza0hhbmRsZSA9PSAxICkKKwlUYXNrSGFuZGxlX3QgTVBVX3hUYXNrR2V0SWRsZVRhc2tIYW5kbGUoIHZvaWQgKQorCXsKKwlUYXNrSGFuZGxlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFRhc2tHZXRJZGxlVGFza0hhbmRsZSgpOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSApCisJdm9pZCBNUFVfdlRhc2tTdXNwZW5kKCBUYXNrSGFuZGxlX3QgcHhUYXNrVG9TdXNwZW5kICkKKwl7CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJdlRhc2tTdXNwZW5kKCBweFRhc2tUb1N1c3BlbmQgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSApCisJdm9pZCBNUFVfdlRhc2tSZXN1bWUoIFRhc2tIYW5kbGVfdCBweFRhc2tUb1Jlc3VtZSApCisJeworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXZUYXNrUmVzdW1lKCBweFRhc2tUb1Jlc3VtZSApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIE1QVV92VGFza1N1c3BlbmRBbGwoIHZvaWQgKQoreworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwl2VGFza1N1c3BlbmRBbGwoKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IE1QVV94VGFza1Jlc3VtZUFsbCggdm9pZCApCit7CitCYXNlVHlwZV90IHhSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXhSZXR1cm4gPSB4VGFza1Jlc3VtZUFsbCgpOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1RpY2tUeXBlX3QgTVBVX3hUYXNrR2V0VGlja0NvdW50KCB2b2lkICkKK3sKK1RpY2tUeXBlX3QgeFJldHVybjsKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJeFJldHVybiA9IHhUYXNrR2V0VGlja0NvdW50KCk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVUJhc2VUeXBlX3QgTVBVX3V4VGFza0dldE51bWJlck9mVGFza3MoIHZvaWQgKQoreworVUJhc2VUeXBlX3QgdXhSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXV4UmV0dXJuID0gdXhUYXNrR2V0TnVtYmVyT2ZUYXNrcygpOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCXJldHVybiB1eFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitjaGFyICogTVBVX3BjVGFza0dldE5hbWUoIFRhc2tIYW5kbGVfdCB4VGFza1RvUXVlcnkgKQoreworY2hhciAqcGNSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXBjUmV0dXJuID0gcGNUYXNrR2V0TmFtZSggeFRhc2tUb1F1ZXJ5ICk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJcmV0dXJuIHBjUmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfeFRhc2tHZXRIYW5kbGUgPT0gMSApCisJVGFza0hhbmRsZV90IE1QVV94VGFza0dldEhhbmRsZSggY29uc3QgY2hhciAqcGNOYW1lVG9RdWVyeSApCisJeworCVRhc2tIYW5kbGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4VGFza0dldEhhbmRsZSggcGNOYW1lVG9RdWVyeSApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApICYmICggY29uZmlnVVNFX1NUQVRTX0ZPUk1BVFRJTkdfRlVOQ1RJT05TID4gMCApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKKwl2b2lkIE1QVV92VGFza0xpc3QoIGNoYXIgKnBjV3JpdGVCdWZmZXIgKQorCXsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl2VGFza0xpc3QoIHBjV3JpdGVCdWZmZXIgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggKCBjb25maWdHRU5FUkFURV9SVU5fVElNRV9TVEFUUyA9PSAxICkgJiYgKCBjb25maWdVU0VfU1RBVFNfRk9STUFUVElOR19GVU5DVElPTlMgPiAwICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCXZvaWQgTVBVX3ZUYXNrR2V0UnVuVGltZVN0YXRzKCBjaGFyICpwY1dyaXRlQnVmZmVyICkKKwl7CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJdlRhc2tHZXRSdW5UaW1lU3RhdHMoIHBjV3JpdGVCdWZmZXIgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX0FQUExJQ0FUSU9OX1RBU0tfVEFHID09IDEgKQorCXZvaWQgTVBVX3ZUYXNrU2V0QXBwbGljYXRpb25UYXNrVGFnKCBUYXNrSGFuZGxlX3QgeFRhc2ssIFRhc2tIb29rRnVuY3Rpb25fdCBweFRhZ1ZhbHVlICkKKwl7CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJdlRhc2tTZXRBcHBsaWNhdGlvblRhc2tUYWcoIHhUYXNrLCBweFRhZ1ZhbHVlICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyA9PSAxICkKKwlUYXNrSG9va0Z1bmN0aW9uX3QgTVBVX3hUYXNrR2V0QXBwbGljYXRpb25UYXNrVGFnKCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCXsKKwlUYXNrSG9va0Z1bmN0aW9uX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFRhc2tHZXRBcHBsaWNhdGlvblRhc2tUYWcoIHhUYXNrICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgIT0gMCApCisJdm9pZCBNUFVfdlRhc2tTZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1NldCwgQmFzZVR5cGVfdCB4SW5kZXgsIHZvaWQgKnB2VmFsdWUgKQorCXsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl2VGFza1NldFRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXIoIHhUYXNrVG9TZXQsIHhJbmRleCwgcHZWYWx1ZSApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgIT0gMCApCisJdm9pZCAqTVBVX3B2VGFza0dldFRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXIoIFRhc2tIYW5kbGVfdCB4VGFza1RvUXVlcnksIEJhc2VUeXBlX3QgeEluZGV4ICkKKwl7CisJdm9pZCAqcHZSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJcHZSZXR1cm4gPSBwdlRhc2tHZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyKCB4VGFza1RvUXVlcnksIHhJbmRleCApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHB2UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyA9PSAxICkKKwlCYXNlVHlwZV90IE1QVV94VGFza0NhbGxBcHBsaWNhdGlvblRhc2tIb29rKCBUYXNrSGFuZGxlX3QgeFRhc2ssIHZvaWQgKnB2UGFyYW1ldGVyICkKKwl7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4VGFza0NhbGxBcHBsaWNhdGlvblRhc2tIb29rKCB4VGFzaywgcHZQYXJhbWV0ZXIgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwlVQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0U3lzdGVtU3RhdGUoIFRhc2tTdGF0dXNfdCAqcHhUYXNrU3RhdHVzQXJyYXksIFVCYXNlVHlwZV90IHV4QXJyYXlTaXplLCB1aW50MzJfdCAqcHVsVG90YWxSdW5UaW1lICkKKwl7CisJVUJhc2VUeXBlX3QgdXhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJdXhSZXR1cm4gPSB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSggcHhUYXNrU3RhdHVzQXJyYXksIHV4QXJyYXlTaXplLCBwdWxUb3RhbFJ1blRpbWUgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB1eFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBJTkNMVURFX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayA9PSAxICkKKwlVQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrKCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCXsKKwlVQmFzZVR5cGVfdCB1eFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl1eFJldHVybiA9IHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayggeFRhc2sgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB1eFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBJTkNMVURFX3hUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUgPT0gMSApCisJVGFza0hhbmRsZV90IE1QVV94VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCB2b2lkICkKKwl7CisJVGFza0hhbmRsZV90IHhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJeFJldHVybiA9IHhUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUoKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSA9PSAxICkKKwlCYXNlVHlwZV90IE1QVV94VGFza0dldFNjaGVkdWxlclN0YXRlKCB2b2lkICkKKwl7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4VGFza0dldFNjaGVkdWxlclN0YXRlKCk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIE1QVV92VGFza1NldFRpbWVPdXRTdGF0ZSggVGltZU91dF90ICogY29uc3QgcHhUaW1lT3V0ICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJdlRhc2tTZXRUaW1lT3V0U3RhdGUoIHB4VGltZU91dCApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrQ2hlY2tGb3JUaW1lT3V0KCBUaW1lT3V0X3QgKiBjb25zdCBweFRpbWVPdXQsIFRpY2tUeXBlX3QgKiBjb25zdCBweFRpY2tzVG9XYWl0ICkKK3sKK0Jhc2VUeXBlX3QgeFJldHVybjsKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJeFJldHVybiA9IHhUYXNrQ2hlY2tGb3JUaW1lT3V0KCBweFRpbWVPdXQsIHB4VGlja3NUb1dhaXQgKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgPT0gMSApCisJQmFzZVR5cGVfdCBNUFVfeFRhc2tHZW5lcmljTm90aWZ5KCBUYXNrSGFuZGxlX3QgeFRhc2tUb05vdGlmeSwgdWludDMyX3QgdWxWYWx1ZSwgZU5vdGlmeUFjdGlvbiBlQWN0aW9uLCB1aW50MzJfdCAqcHVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZSApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFRhc2tHZW5lcmljTm90aWZ5KCB4VGFza1RvTm90aWZ5LCB1bFZhbHVlLCBlQWN0aW9uLCBwdWxQcmV2aW91c05vdGlmaWNhdGlvblZhbHVlICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgPT0gMSApCisJQmFzZVR5cGVfdCBNUFVfeFRhc2tOb3RpZnlXYWl0KCB1aW50MzJfdCB1bEJpdHNUb0NsZWFyT25FbnRyeSwgdWludDMyX3QgdWxCaXRzVG9DbGVhck9uRXhpdCwgdWludDMyX3QgKnB1bE5vdGlmaWNhdGlvblZhbHVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFRhc2tOb3RpZnlXYWl0KCB1bEJpdHNUb0NsZWFyT25FbnRyeSwgdWxCaXRzVG9DbGVhck9uRXhpdCwgcHVsTm90aWZpY2F0aW9uVmFsdWUsIHhUaWNrc1RvV2FpdCApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TID09IDEgKQorCXVpbnQzMl90IE1QVV91bFRhc2tOb3RpZnlUYWtlKCBCYXNlVHlwZV90IHhDbGVhckNvdW50T25FeGl0LCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCisJeworCXVpbnQzMl90IHVsUmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXVsUmV0dXJuID0gdWxUYXNrTm90aWZ5VGFrZSggeENsZWFyQ291bnRPbkV4aXQsIHhUaWNrc1RvV2FpdCApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHVsUmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyA9PSAxICkKKwlCYXNlVHlwZV90IE1QVV94VGFza05vdGlmeVN0YXRlQ2xlYXIoIFRhc2tIYW5kbGVfdCB4VGFzayApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFRhc2tOb3RpZnlTdGF0ZUNsZWFyKCB4VGFzayApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKwlRdWV1ZUhhbmRsZV90IE1QVV94UXVldWVHZW5lcmljQ3JlYXRlKCBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLCBVQmFzZVR5cGVfdCB1eEl0ZW1TaXplLCB1aW50OF90IHVjUXVldWVUeXBlICkKKwl7CisJUXVldWVIYW5kbGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4UXVldWVHZW5lcmljQ3JlYXRlKCB1eFF1ZXVlTGVuZ3RoLCB1eEl0ZW1TaXplLCB1Y1F1ZXVlVHlwZSApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCVF1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUdlbmVyaWNDcmVhdGVTdGF0aWMoIGNvbnN0IFVCYXNlVHlwZV90IHV4UXVldWVMZW5ndGgsIGNvbnN0IFVCYXNlVHlwZV90IHV4SXRlbVNpemUsIHVpbnQ4X3QgKnB1Y1F1ZXVlU3RvcmFnZSwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSwgY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSApCisJeworCVF1ZXVlSGFuZGxlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFF1ZXVlR2VuZXJpY0NyZWF0ZVN0YXRpYyggdXhRdWV1ZUxlbmd0aCwgdXhJdGVtU2l6ZSwgcHVjUXVldWVTdG9yYWdlLCBweFN0YXRpY1F1ZXVlLCB1Y1F1ZXVlVHlwZSApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlR2VuZXJpY1Jlc2V0KCBRdWV1ZUhhbmRsZV90IHB4UXVldWUsIEJhc2VUeXBlX3QgeE5ld1F1ZXVlICkKK3sKK0Jhc2VUeXBlX3QgeFJldHVybjsKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJeFJldHVybiA9IHhRdWV1ZUdlbmVyaWNSZXNldCggcHhRdWV1ZSwgeE5ld1F1ZXVlICk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlR2VuZXJpY1NlbmQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICogY29uc3QgcHZJdGVtVG9RdWV1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQsIEJhc2VUeXBlX3QgeENvcHlQb3NpdGlvbiApCit7CitCYXNlVHlwZV90IHhSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXhSZXR1cm4gPSB4UXVldWVHZW5lcmljU2VuZCggeFF1ZXVlLCBwdkl0ZW1Ub1F1ZXVlLCB4VGlja3NUb1dhaXQsIHhDb3B5UG9zaXRpb24gKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitVQmFzZVR5cGVfdCBNUFVfdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZyggY29uc3QgUXVldWVIYW5kbGVfdCBweFF1ZXVlICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworVUJhc2VUeXBlX3QgdXhSZXR1cm47CisKKwl1eFJldHVybiA9IHV4UXVldWVNZXNzYWdlc1dhaXRpbmcoIHB4UXVldWUgKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwlyZXR1cm4gdXhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVUJhc2VUeXBlX3QgTVBVX3V4UXVldWVTcGFjZXNBdmFpbGFibGUoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworVUJhc2VUeXBlX3QgdXhSZXR1cm47CisKKwl1eFJldHVybiA9IHV4UXVldWVTcGFjZXNBdmFpbGFibGUoIHhRdWV1ZSApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCXJldHVybiB1eFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IE1QVV94UXVldWVSZWNlaXZlKCBRdWV1ZUhhbmRsZV90IHB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQoreworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CitCYXNlVHlwZV90IHhSZXR1cm47CisKKwl4UmV0dXJuID0geFF1ZXVlUmVjZWl2ZSggcHhRdWV1ZSwgcHZCdWZmZXIsIHhUaWNrc1RvV2FpdCApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgTVBVX3hRdWV1ZVBlZWsoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCB2b2lkICogY29uc3QgcHZCdWZmZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworQmFzZVR5cGVfdCB4UmV0dXJuOworCisJeFJldHVybiA9IHhRdWV1ZVBlZWsoIHhRdWV1ZSwgcHZCdWZmZXIsIHhUaWNrc1RvV2FpdCApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgTVBVX3hRdWV1ZVNlbWFwaG9yZVRha2UoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCit7CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKK0Jhc2VUeXBlX3QgeFJldHVybjsKKworCXhSZXR1cm4gPSB4UXVldWVTZW1hcGhvcmVUYWtlKCB4UXVldWUsIHhUaWNrc1RvV2FpdCApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgTVBVX3hRdWV1ZVBlZWtGcm9tSVNSKCBRdWV1ZUhhbmRsZV90IHB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciApCit7CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKK0Jhc2VUeXBlX3QgeFJldHVybjsKKworCXhSZXR1cm4gPSB4UXVldWVQZWVrRnJvbUlTUiggcHhRdWV1ZSwgcHZCdWZmZXIgKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkKiBNUFVfeFF1ZXVlR2V0TXV0ZXhIb2xkZXIoIFF1ZXVlSGFuZGxlX3QgeFNlbWFwaG9yZSApCit7CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKK3ZvaWQgKiB4UmV0dXJuOworCisJeFJldHVybiA9ICggdm9pZCAqICkgeFF1ZXVlR2V0TXV0ZXhIb2xkZXIoIHhTZW1hcGhvcmUgKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKKwlRdWV1ZUhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVNdXRleCggY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSApCisJeworCVF1ZXVlSGFuZGxlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFF1ZXVlQ3JlYXRlTXV0ZXgoIHVjUXVldWVUeXBlICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCVF1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUNyZWF0ZU11dGV4U3RhdGljKCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlLCBTdGF0aWNRdWV1ZV90ICpweFN0YXRpY1F1ZXVlICkKKwl7CisJUXVldWVIYW5kbGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4UXVldWVDcmVhdGVNdXRleFN0YXRpYyggdWNRdWV1ZVR5cGUsIHB4U3RhdGljUXVldWUgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggKCBjb25maWdVU0VfQ09VTlRJTkdfU0VNQVBIT1JFUyA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCVF1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlKCBVQmFzZVR5cGVfdCB1eENvdW50VmFsdWUsIFVCYXNlVHlwZV90IHV4SW5pdGlhbENvdW50ICkKKwl7CisJUXVldWVIYW5kbGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4UXVldWVDcmVhdGVDb3VudGluZ1NlbWFwaG9yZSggdXhDb3VudFZhbHVlLCB1eEluaXRpYWxDb3VudCApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCAoIGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICkKKworCVF1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlU3RhdGljKCBjb25zdCBVQmFzZVR5cGVfdCB1eE1heENvdW50LCBjb25zdCBVQmFzZVR5cGVfdCB1eEluaXRpYWxDb3VudCwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSApCisJeworCVF1ZXVlSGFuZGxlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmVTdGF0aWMoIHV4TWF4Q291bnQsIHV4SW5pdGlhbENvdW50LCBweFN0YXRpY1F1ZXVlICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfUkVDVVJTSVZFX01VVEVYRVMgPT0gMSApCisJQmFzZVR5cGVfdCBNUFVfeFF1ZXVlVGFrZU11dGV4UmVjdXJzaXZlKCBRdWV1ZUhhbmRsZV90IHhNdXRleCwgVGlja1R5cGVfdCB4QmxvY2tUaW1lICkKKwl7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4UXVldWVUYWtlTXV0ZXhSZWN1cnNpdmUoIHhNdXRleCwgeEJsb2NrVGltZSApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTID09IDEgKQorCUJhc2VUeXBlX3QgTVBVX3hRdWV1ZUdpdmVNdXRleFJlY3Vyc2l2ZSggUXVldWVIYW5kbGVfdCB4TXV0ZXggKQorCXsKKwlCYXNlVHlwZV90IHhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJeFJldHVybiA9IHhRdWV1ZUdpdmVNdXRleFJlY3Vyc2l2ZSggeE11dGV4ICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnVVNFX1FVRVVFX1NFVFMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKKwlRdWV1ZVNldEhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVTZXQoIFVCYXNlVHlwZV90IHV4RXZlbnRRdWV1ZUxlbmd0aCApCisJeworCVF1ZXVlU2V0SGFuZGxlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFF1ZXVlQ3JlYXRlU2V0KCB1eEV2ZW50UXVldWVMZW5ndGggKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9RVUVVRV9TRVRTID09IDEgKQorCVF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgTVBVX3hRdWV1ZVNlbGVjdEZyb21TZXQoIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0LCBUaWNrVHlwZV90IHhCbG9ja1RpbWVUaWNrcyApCisJeworCVF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFF1ZXVlU2VsZWN0RnJvbVNldCggeFF1ZXVlU2V0LCB4QmxvY2tUaW1lVGlja3MgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9RVUVVRV9TRVRTID09IDEgKQorCUJhc2VUeXBlX3QgTVBVX3hRdWV1ZUFkZFRvU2V0KCBRdWV1ZVNldE1lbWJlckhhbmRsZV90IHhRdWV1ZU9yU2VtYXBob3JlLCBRdWV1ZVNldEhhbmRsZV90IHhRdWV1ZVNldCApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFF1ZXVlQWRkVG9TZXQoIHhRdWV1ZU9yU2VtYXBob3JlLCB4UXVldWVTZXQgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9RVUVVRV9TRVRTID09IDEgKQorCUJhc2VUeXBlX3QgTVBVX3hRdWV1ZVJlbW92ZUZyb21TZXQoIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgeFF1ZXVlT3JTZW1hcGhvcmUsIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0ICkKKwl7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4UXVldWVSZW1vdmVGcm9tU2V0KCB4UXVldWVPclNlbWFwaG9yZSwgeFF1ZXVlU2V0ICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDAKKwl2b2lkIE1QVV92UXVldWVBZGRUb1JlZ2lzdHJ5KCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgY29uc3QgY2hhciAqcGNOYW1lICkKKwl7CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJdlF1ZXVlQWRkVG9SZWdpc3RyeSggeFF1ZXVlLCBwY05hbWUgKTsKKworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDAKKwl2b2lkIE1QVV92UXVldWVVbnJlZ2lzdGVyUXVldWUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKKwl7CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJdlF1ZXVlVW5yZWdpc3RlclF1ZXVlKCB4UXVldWUgKTsKKworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDAKKwljb25zdCBjaGFyICpNUFVfcGNRdWV1ZUdldE5hbWUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKKwl7CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisJY29uc3QgY2hhciAqcGNSZXR1cm47CisKKwkJcGNSZXR1cm4gPSBwY1F1ZXVlR2V0TmFtZSggeFF1ZXVlICk7CisKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisJCXJldHVybiBwY1JldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIE1QVV92UXVldWVEZWxldGUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJdlF1ZXVlRGVsZXRlKCB4UXVldWUgKTsKKworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisJdm9pZCAqTVBVX3B2UG9ydE1hbGxvYyggc2l6ZV90IHhTaXplICkKKwl7CisJdm9pZCAqcHZSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJcHZSZXR1cm4gPSBwdlBvcnRNYWxsb2MoIHhTaXplICk7CisKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwkJcmV0dXJuIHB2UmV0dXJuOworCX0KKyNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisJdm9pZCBNUFVfdlBvcnRGcmVlKCB2b2lkICpwdiApCisJeworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXZQb3J0RnJlZSggcHYgKTsKKworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwl9CisjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCXZvaWQgTVBVX3ZQb3J0SW5pdGlhbGlzZUJsb2Nrcyggdm9pZCApCisJeworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXZQb3J0SW5pdGlhbGlzZUJsb2NrcygpOworCisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCX0KKyNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisJc2l6ZV90IE1QVV94UG9ydEdldEZyZWVIZWFwU2l6ZSggdm9pZCApCisJeworCXNpemVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4UG9ydEdldEZyZWVIZWFwU2l6ZSgpOworCisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdVU0VfVElNRVJTID09IDEgKSApCisJVGltZXJIYW5kbGVfdCBNUFVfeFRpbWVyQ3JlYXRlKCBjb25zdCBjaGFyICogY29uc3QgcGNUaW1lck5hbWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpbWVyUGVyaW9kSW5UaWNrcywgY29uc3QgVUJhc2VUeXBlX3QgdXhBdXRvUmVsb2FkLCB2b2lkICogY29uc3QgcHZUaW1lcklELCBUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCBweENhbGxiYWNrRnVuY3Rpb24gKQorCXsKKwlUaW1lckhhbmRsZV90IHhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJeFJldHVybiA9IHhUaW1lckNyZWF0ZSggcGNUaW1lck5hbWUsIHhUaW1lclBlcmlvZEluVGlja3MsIHV4QXV0b1JlbG9hZCwgcHZUaW1lcklELCBweENhbGxiYWNrRnVuY3Rpb24gKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkgKQorCVRpbWVySGFuZGxlX3QgTVBVX3hUaW1lckNyZWF0ZVN0YXRpYyggY29uc3QgY2hhciAqIGNvbnN0IHBjVGltZXJOYW1lLCBjb25zdCBUaWNrVHlwZV90IHhUaW1lclBlcmlvZEluVGlja3MsIGNvbnN0IFVCYXNlVHlwZV90IHV4QXV0b1JlbG9hZCwgdm9pZCAqIGNvbnN0IHB2VGltZXJJRCwgVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QgcHhDYWxsYmFja0Z1bmN0aW9uLCBTdGF0aWNUaW1lcl90ICpweFRpbWVyQnVmZmVyICkKKwl7CisJVGltZXJIYW5kbGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4VGltZXJDcmVhdGVTdGF0aWMoIHBjVGltZXJOYW1lLCB4VGltZXJQZXJpb2RJblRpY2tzLCB1eEF1dG9SZWxvYWQsIHB2VGltZXJJRCwgcHhDYWxsYmFja0Z1bmN0aW9uLCBweFRpbWVyQnVmZmVyICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkKKwl2b2lkICpNUFVfcHZUaW1lckdldFRpbWVySUQoIGNvbnN0IFRpbWVySGFuZGxlX3QgeFRpbWVyICkKKwl7CisJdm9pZCAqIHB2UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXB2UmV0dXJuID0gcHZUaW1lckdldFRpbWVySUQoIHhUaW1lciApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCQlyZXR1cm4gcHZSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfVElNRVJTID09IDEgKQorCXZvaWQgTVBVX3ZUaW1lclNldFRpbWVySUQoIFRpbWVySGFuZGxlX3QgeFRpbWVyLCB2b2lkICpwdk5ld0lEICkKKwl7CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJdlRpbWVyU2V0VGltZXJJRCggeFRpbWVyLCBwdk5ld0lEICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkKKwlCYXNlVHlwZV90IE1QVV94VGltZXJJc1RpbWVyQWN0aXZlKCBUaW1lckhhbmRsZV90IHhUaW1lciApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFRpbWVySXNUaW1lckFjdGl2ZSggeFRpbWVyICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkKKwlUYXNrSGFuZGxlX3QgTVBVX3hUaW1lckdldFRpbWVyRGFlbW9uVGFza0hhbmRsZSggdm9pZCApCisJeworCVRhc2tIYW5kbGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4VGltZXJHZXRUaW1lckRhZW1vblRhc2tIYW5kbGUoKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCAoIElOQ0xVREVfeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbCA9PSAxICkgJiYgKCBjb25maWdVU0VfVElNRVJTID09IDEgKSApCisJQmFzZVR5cGVfdCBNUFVfeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbCggUGVuZGVkRnVuY3Rpb25fdCB4RnVuY3Rpb25Ub1BlbmQsIHZvaWQgKnB2UGFyYW1ldGVyMSwgdWludDMyX3QgdWxQYXJhbWV0ZXIyLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbCggeEZ1bmN0aW9uVG9QZW5kLCBwdlBhcmFtZXRlcjEsIHVsUGFyYW1ldGVyMiwgeFRpY2tzVG9XYWl0ICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisJCXJldHVybiB4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkKKwljb25zdCBjaGFyICogTVBVX3BjVGltZXJHZXROYW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApCisJeworCWNvbnN0IGNoYXIgKiBwY1JldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQlwY1JldHVybiA9IHBjVGltZXJHZXROYW1lKCB4VGltZXIgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwkJcmV0dXJuIHBjUmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkKKwlUaWNrVHlwZV90IE1QVV94VGltZXJHZXRQZXJpb2QoIFRpbWVySGFuZGxlX3QgeFRpbWVyICkKKwl7CisJVGlja1R5cGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4VGltZXJHZXRQZXJpb2QoIHhUaW1lciApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApCisJVGlja1R5cGVfdCBNUFVfeFRpbWVyR2V0RXhwaXJ5VGltZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKQorCXsKKwlUaWNrVHlwZV90IHhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJeFJldHVybiA9IHhUaW1lckdldEV4cGlyeVRpbWUoIHhUaW1lciApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApCisJQmFzZVR5cGVfdCBNUFVfeFRpbWVyR2VuZXJpY0NvbW1hbmQoIFRpbWVySGFuZGxlX3QgeFRpbWVyLCBjb25zdCBCYXNlVHlwZV90IHhDb21tYW5kSUQsIGNvbnN0IFRpY2tUeXBlX3QgeE9wdGlvbmFsVmFsdWUsIEJhc2VUeXBlX3QgKiBjb25zdCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuLCBjb25zdCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFRpbWVyR2VuZXJpY0NvbW1hbmQoIHhUaW1lciwgeENvbW1hbmRJRCwgeE9wdGlvbmFsVmFsdWUsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4sIHhUaWNrc1RvV2FpdCApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCUV2ZW50R3JvdXBIYW5kbGVfdCBNUFVfeEV2ZW50R3JvdXBDcmVhdGUoIHZvaWQgKQorCXsKKwlFdmVudEdyb3VwSGFuZGxlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geEV2ZW50R3JvdXBDcmVhdGUoKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCUV2ZW50R3JvdXBIYW5kbGVfdCBNUFVfeEV2ZW50R3JvdXBDcmVhdGVTdGF0aWMoIFN0YXRpY0V2ZW50R3JvdXBfdCAqcHhFdmVudEdyb3VwQnVmZmVyICkKKwl7CisJRXZlbnRHcm91cEhhbmRsZV90IHhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJeFJldHVybiA9IHhFdmVudEdyb3VwQ3JlYXRlU3RhdGljKCBweEV2ZW50R3JvdXBCdWZmZXIgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRXZlbnRCaXRzX3QgTVBVX3hFdmVudEdyb3VwV2FpdEJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBjb25zdCBCYXNlVHlwZV90IHhDbGVhck9uRXhpdCwgY29uc3QgQmFzZVR5cGVfdCB4V2FpdEZvckFsbEJpdHMsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKK3sKK0V2ZW50Qml0c190IHhSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXhSZXR1cm4gPSB4RXZlbnRHcm91cFdhaXRCaXRzKCB4RXZlbnRHcm91cCwgdXhCaXRzVG9XYWl0Rm9yLCB4Q2xlYXJPbkV4aXQsIHhXYWl0Rm9yQWxsQml0cywgeFRpY2tzVG9XYWl0ICk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitFdmVudEJpdHNfdCBNUFVfeEV2ZW50R3JvdXBDbGVhckJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9DbGVhciApCit7CitFdmVudEJpdHNfdCB4UmV0dXJuOworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwl4UmV0dXJuID0geEV2ZW50R3JvdXBDbGVhckJpdHMoIHhFdmVudEdyb3VwLCB1eEJpdHNUb0NsZWFyICk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitFdmVudEJpdHNfdCBNUFVfeEV2ZW50R3JvdXBTZXRCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvU2V0ICkKK3sKK0V2ZW50Qml0c190IHhSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXhSZXR1cm4gPSB4RXZlbnRHcm91cFNldEJpdHMoIHhFdmVudEdyb3VwLCB1eEJpdHNUb1NldCApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRXZlbnRCaXRzX3QgTVBVX3hFdmVudEdyb3VwU3luYyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1NldCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCit7CitFdmVudEJpdHNfdCB4UmV0dXJuOworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwl4UmV0dXJuID0geEV2ZW50R3JvdXBTeW5jKCB4RXZlbnRHcm91cCwgdXhCaXRzVG9TZXQsIHV4Qml0c1RvV2FpdEZvciwgeFRpY2tzVG9XYWl0ICk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIE1QVV92RXZlbnRHcm91cERlbGV0ZSggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJdkV2ZW50R3JvdXBEZWxldGUoIHhFdmVudEdyb3VwICk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyU2VuZCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgY29uc3Qgdm9pZCAqcHZUeERhdGEsIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCit7CitzaXplX3QgeFJldHVybjsKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJeFJldHVybiA9IHhTdHJlYW1CdWZmZXJTZW5kKCB4U3RyZWFtQnVmZmVyLCBwdlR4RGF0YSwgeERhdGFMZW5ndGhCeXRlcywgeFRpY2tzVG9XYWl0ICk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzaXplX3QgTVBVX3hTdHJlYW1CdWZmZXJTZW5kRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgY29uc3Qgdm9pZCAqcHZUeERhdGEsIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLCBCYXNlVHlwZV90ICogY29uc3QgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApCit7CitzaXplX3QgeFJldHVybjsKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJeFJldHVybiA9IHhTdHJlYW1CdWZmZXJTZW5kRnJvbUlTUiggeFN0cmVhbUJ1ZmZlciwgcHZUeERhdGEsIHhEYXRhTGVuZ3RoQnl0ZXMsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclJlY2VpdmUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIHZvaWQgKnB2UnhEYXRhLCBzaXplX3QgeEJ1ZmZlckxlbmd0aEJ5dGVzLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCit7CitzaXplX3QgeFJldHVybjsKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJeFJldHVybiA9IHhTdHJlYW1CdWZmZXJSZWNlaXZlKCB4U3RyZWFtQnVmZmVyLCBwdlJ4RGF0YSwgeEJ1ZmZlckxlbmd0aEJ5dGVzLCB4VGlja3NUb1dhaXQgKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCB2b2lkICpwdlJ4RGF0YSwgc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKQoreworc2l6ZV90IHhSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXhSZXR1cm4gPSB4U3RyZWFtQnVmZmVyUmVjZWl2ZUZyb21JU1IoIHhTdHJlYW1CdWZmZXIsIHB2UnhEYXRhLCB4QnVmZmVyTGVuZ3RoQnl0ZXMsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgTVBVX3ZTdHJlYW1CdWZmZXJEZWxldGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKQoreworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwl2U3RyZWFtQnVmZmVyRGVsZXRlKCB4U3RyZWFtQnVmZmVyICk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCBNUFVfeFN0cmVhbUJ1ZmZlcklzRnVsbCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCit7CitCYXNlVHlwZV90IHhSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXhSZXR1cm4gPSB4U3RyZWFtQnVmZmVySXNGdWxsKCB4U3RyZWFtQnVmZmVyICk7CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IE1QVV94U3RyZWFtQnVmZmVySXNFbXB0eSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCit7CitCYXNlVHlwZV90IHhSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXhSZXR1cm4gPSB4U3RyZWFtQnVmZmVySXNFbXB0eSggeFN0cmVhbUJ1ZmZlciApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCBNUFVfeFN0cmVhbUJ1ZmZlclJlc2V0KCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKK3sKK0Jhc2VUeXBlX3QgeFJldHVybjsKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJeFJldHVybiA9IHhTdHJlYW1CdWZmZXJSZXNldCggeFN0cmVhbUJ1ZmZlciApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyU3BhY2VzQXZhaWxhYmxlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKK3sKK3NpemVfdCB4UmV0dXJuOworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwl4UmV0dXJuID0geFN0cmVhbUJ1ZmZlclNwYWNlc0F2YWlsYWJsZSggeFN0cmVhbUJ1ZmZlciApOworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyQnl0ZXNBdmFpbGFibGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKQoreworc2l6ZV90IHhSZXR1cm47CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXhSZXR1cm4gPSB4U3RyZWFtQnVmZmVyQnl0ZXNBdmFpbGFibGUoIHhTdHJlYW1CdWZmZXIgKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgTVBVX3hTdHJlYW1CdWZmZXJTZXRUcmlnZ2VyTGV2ZWwoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIHNpemVfdCB4VHJpZ2dlckxldmVsICkKK3sKK0Jhc2VUeXBlX3QgeFJldHVybjsKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJeFJldHVybiA9IHhTdHJlYW1CdWZmZXJTZXRUcmlnZ2VyTGV2ZWwoIHhTdHJlYW1CdWZmZXIsIHhUcmlnZ2VyTGV2ZWwgKTsKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisJU3RyZWFtQnVmZmVySGFuZGxlX3QgTVBVX3hTdHJlYW1CdWZmZXJHZW5lcmljQ3JlYXRlKCBzaXplX3QgeEJ1ZmZlclNpemVCeXRlcywgc2l6ZV90IHhUcmlnZ2VyTGV2ZWxCeXRlcywgQmFzZVR5cGVfdCB4SXNNZXNzYWdlQnVmZmVyICkKKwl7CisJU3RyZWFtQnVmZmVySGFuZGxlX3QgeFJldHVybjsKKwlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCQl4UmV0dXJuID0geFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGUoIHhCdWZmZXJTaXplQnl0ZXMsIHhUcmlnZ2VyTGV2ZWxCeXRlcywgeElzTWVzc2FnZUJ1ZmZlciApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisJU3RyZWFtQnVmZmVySGFuZGxlX3QgTVBVX3hTdHJlYW1CdWZmZXJHZW5lcmljQ3JlYXRlU3RhdGljKCBzaXplX3QgeEJ1ZmZlclNpemVCeXRlcywgc2l6ZV90IHhUcmlnZ2VyTGV2ZWxCeXRlcywgQmFzZVR5cGVfdCB4SXNNZXNzYWdlQnVmZmVyLCB1aW50OF90ICogY29uc3QgcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEsIFN0YXRpY1N0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdGF0aWNTdHJlYW1CdWZmZXIgKQorCXsKKwlTdHJlYW1CdWZmZXJIYW5kbGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4U3RyZWFtQnVmZmVyR2VuZXJpY0NyZWF0ZVN0YXRpYyggeEJ1ZmZlclNpemVCeXRlcywgeFRyaWdnZXJMZXZlbEJ5dGVzLCB4SXNNZXNzYWdlQnVmZmVyLCBwdWNTdHJlYW1CdWZmZXJTdG9yYWdlQXJlYSwgcHhTdGF0aWNTdHJlYW1CdWZmZXIgKTsKKwkJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qIEZ1bmN0aW9ucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgd2FudHMgdG8gZXhlY3V0ZSBpbiBwcml2aWxlZ2VkIG1vZGUKK2NhbiBiZSBkZWZpbmVkIGluIGFwcGxpY2F0aW9uX2RlZmluZWRfcHJpdmlsZWdlZF9mdW5jdGlvbnMuaC4gIFRoZSBmdW5jdGlvbnMKK211c3QgdGFrZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhvc2UgYWJvdmUgd2hlcmVieSB0aGUgcHJpdmlsZWdlIHN0YXRlIG9uIGV4aXQKK2VxdWFscyB0aGUgcHJpdmlsZWdlIHN0YXRlIG9uIGVudHJ5LiAgRm9yIGV4YW1wbGU6CisKK3ZvaWQgTVBVX0Z1bmN0aW9uTmFtZSggW3BhcmFtZXRlcnMgXSApCit7CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCUZ1bmN0aW9uTmFtZSggW3BhcmFtZXRlcnMgXSApOworCisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7Cit9CisqLworCisjaWYgY29uZmlnSU5DTFVERV9BUFBMSUNBVElPTl9ERUZJTkVEX1BSSVZJTEVHRURfRlVOQ1RJT05TID09IDEKKwkjaW5jbHVkZSAiYXBwbGljYXRpb25fZGVmaW5lZF9wcml2aWxlZ2VkX2Z1bmN0aW9ucy5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTAvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00wL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJjNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00wL3BvcnQuYwpAQCAtMCwwICsxLDU2MSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmggZm9yIHRoZSBBUk0gQ00wIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyNpZm5kZWYgY29uZmlnU1lTVElDS19DTE9DS19IWgorCSNkZWZpbmUgY29uZmlnU1lTVElDS19DTE9DS19IWiBjb25maWdDUFVfQ0xPQ0tfSFoKKyNlbmRpZgorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTlZJQy4gKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVFJMCQkoKiAoICggdm9sYXRpbGUgdWludDMyX3QgKikgMHhlMDAwZTAxMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FECQkoKiAoICggdm9sYXRpbGUgdWludDMyX3QgKikgMHhlMDAwZTAxNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFCSgqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApKQorI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTAkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKikgMHhlMDAwZWQwNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTIJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICopIDB4ZTAwMGVkMjAgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMSwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlQJCQkweDAwMDAwMDAyCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFCQkJMHgwMDAwMDAwMQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUcJKCAxVUwgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVAkJCQkweDEwMDAwMDAwCisjZGVmaW5lIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZCQkoIDI1NVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkoIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCSggcG9ydE1JTl9JTlRFUlJVUFRfUFJJT1JJVFkgPDwgMjRVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suICovCisjZGVmaW5lIHBvcnRJTklUSUFMX1hQU1IJCQkoIDB4MDEwMDAwMDAgKQorCisvKiBUaGUgc3lzdGljayBpcyBhIDI0LWJpdCBjb3VudGVyLiAqLworI2RlZmluZSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIJCQkJKCAweGZmZmZmZlVMICkKKworLyogQSBmaWRkbGUgZmFjdG9yIHRvIGVzdGltYXRlIHRoZSBudW1iZXIgb2YgU3lzVGljayBjb3VudHMgdGhhdCB3b3VsZCBoYXZlCitvY2N1cnJlZCB3aGlsZSB0aGUgU3lzVGljayBjb3VudGVyIGlzIHN0b3BwZWQgZHVyaW5nIHRpY2tsZXNzIGlkbGUKK2NhbGN1bGF0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SCQkJKCA0NVVMICkKKworLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBwcmUtbG9hZGluZyBvZiB0aGUgaW5pdGlhbCBMUiB3aXRoIHRoZSBhZGRyZXNzIG9mCitwcnZUYXNrRXhpdEVycm9yKCkgaW4gY2FzZSBpdCBtZXNzZXMgdXAgdW53aW5kaW5nIG9mIHRoZSBzdGFjayBpbiB0aGUKK2RlYnVnZ2VyLiAqLworI2lmZGVmIGNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MKKwkjZGVmaW5lIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTCWNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MKKyNlbHNlCisJI2RlZmluZSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUwlwcnZUYXNrRXhpdEVycm9yCisjZW5kaWYKKworLyoKKyAqIFNldHVwIHRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBwcnZTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CisKKy8qCisgKiBFeGNlcHRpb24gaGFuZGxlcnMuCisgKi8KK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApOwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKTsKKworLyoKKyAqIFN0YXJ0IGZpcnN0IHRhc2sgaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgdGVzdGVkIGluIGlzb2xhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgdlBvcnRTdGFydEZpcnN0VGFzayggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qCisgKiBVc2VkIHRvIGNhdGNoIHRhc2tzIHRoYXQgYXR0ZW1wdCB0byByZXR1cm4gZnJvbSB0aGVpciBpbXBsZW1lbnRpbmcgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCit2YXJpYWJsZS4gKi8KK3N0YXRpYyBVQmFzZVR5cGVfdCB1eENyaXRpY2FsTmVzdGluZyA9IDB4YWFhYWFhYWE7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhlIG51bWJlciBvZiBTeXNUaWNrIGluY3JlbWVudHMgdGhhdCBtYWtlIHVwIG9uZSB0aWNrIHBlcmlvZC4KKyAqLworI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrIHBlcmlvZHMgdGhhdCBjYW4gYmUgc3VwcHJlc3NlZCBpcyBsaW1pdGVkIGJ5IHRoZQorICogMjQgYml0IHJlc29sdXRpb24gb2YgdGhlIFN5c1RpY2sgdGltZXIuCisgKi8KKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisJc3RhdGljIHVuc2lnbmVkIGxvbmcgeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIENvbXBlbnNhdGUgZm9yIHRoZSBDUFUgY3ljbGVzIHRoYXQgcGFzcyB3aGlsZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIChsb3cKKyAqIHBvd2VyIGZ1bmN0aW9uYWxpdHkgb25seS4KKyAqLworI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZWUgaGVhZGVyIGZpbGUgZm9yIGRlc2NyaXB0aW9uLgorICovCitTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycyApCit7CisJLyogU2ltdWxhdGUgdGhlIHN0YWNrIGZyYW1lIGFzIGl0IHdvdWxkIGJlIGNyZWF0ZWQgYnkgYSBjb250ZXh0IHN3aXRjaAorCWludGVycnVwdC4gKi8KKwlweFRvcE9mU3RhY2stLTsgLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0IG9mIGludGVycnVwdHMuICovCisJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX1hQU1I7CS8qIHhQU1IgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4Q29kZTsJLyogUEMgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTOwkvKiBMUiAqLworCXB4VG9wT2ZTdGFjayAtPSA1OwkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CS8qIFIwICovCisJcHhUb3BPZlN0YWNrIC09IDg7IC8qIFIxMS4uUjQuICovCisKKwlyZXR1cm4gcHhUb3BPZlN0YWNrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKQorewordm9sYXRpbGUgdWludDMyX3QgdWxEdW1teSA9IDBVTDsKKworCS8qIEEgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIGEgdGFzayBtdXN0IG5vdCBleGl0IG9yIGF0dGVtcHQgdG8gcmV0dXJuIHRvCisJaXRzIGNhbGxlciBhcyB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiB0by4gIElmIGEgdGFzayB3YW50cyB0byBleGl0IGl0CisJc2hvdWxkIGluc3RlYWQgY2FsbCB2VGFza0RlbGV0ZSggTlVMTCApLgorCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydCgpIHRvIGJlIHRyaWdnZXJlZCBpZiBjb25maWdBU1NFUlQoKSBpcworCWRlZmluZWQsIHRoZW4gc3RvcCBoZXJlIHNvIGFwcGxpY2F0aW9uIHdyaXRlcnMgY2FuIGNhdGNoIHRoZSBlcnJvci4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IH4wVUwgKTsKKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJd2hpbGUoIHVsRHVtbXkgPT0gMCApCisJeworCQkvKiBUaGlzIGZpbGUgY2FsbHMgcHJ2VGFza0V4aXRFcnJvcigpIGFmdGVyIHRoZSBzY2hlZHVsZXIgaGFzIGJlZW4KKwkJc3RhcnRlZCB0byByZW1vdmUgYSBjb21waWxlciB3YXJuaW5nIGFib3V0IHRoZSBmdW5jdGlvbiBiZWluZyBkZWZpbmVkCisJCWJ1dCBuZXZlciBjYWxsZWQuICB1bER1bW15IGlzIHVzZWQgcHVyZWx5IHRvIHF1aWV0ZW4gb3RoZXIgd2FybmluZ3MKKwkJYWJvdXQgY29kZSBhcHBlYXJpbmcgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgLSBtYWtpbmcgdWxEdW1teQorCQl2b2xhdGlsZSBtYWtlcyB0aGUgY29tcGlsZXIgdGhpbmsgdGhlIGZ1bmN0aW9uIGNvdWxkIHJldHVybiBhbmQKKwkJdGhlcmVmb3JlIG5vdCBvdXRwdXQgYW4gJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgZm9yIGNvZGUgdGhhdCBhcHBlYXJzCisJCWFmdGVyIGl0LiAqLworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0U1ZDSGFuZGxlciggdm9pZCApCit7CisJLyogVGhpcyBmdW5jdGlvbiBpcyBubyBsb25nZXIgdXNlZCwgYnV0IHJldGFpbmVkIGZvciBiYWNrd2FyZAorCWNvbXBhdGliaWxpdHkuICovCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFN0YXJ0Rmlyc3RUYXNrKCB2b2lkICkKK3sKKwkvKiBUaGUgTVNQIHN0YWNrIGlzIG5vdCByZXNldCBhcywgdW5saWtlIG9uIE0zLzQgcGFydHMsIHRoZXJlIGlzIG5vIHZlY3RvcgorCXRhYmxlIG9mZnNldCByZWdpc3RlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvY2F0ZSB0aGUgaW5pdGlhbCBzdGFjayB2YWx1ZS4KKwlOb3QgYWxsIE0wIHBhcnRzIGhhdmUgdGhlIGFwcGxpY2F0aW9uIHZlY3RvciB0YWJsZSBhdCBhZGRyZXNzIDAuICovCisJX19hc20gdm9sYXRpbGUoCisJIgkuc3ludGF4IHVuaWZpZWQJCQkJXG4iCisJIglsZHIgIHIyLCBweEN1cnJlbnRUQ0JDb25zdDIJXG4iIC8qIE9idGFpbiBsb2NhdGlvbiBvZiBweEN1cnJlbnRUQ0IuICovCisJIglsZHIgIHIzLCBbcjJdCQkJCVxuIgorCSIJbGRyICByMCwgW3IzXQkJCQlcbiIgLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwkiCWFkZHMgcjAsICMzMgkJCQkJXG4iIC8qIERpc2NhcmQgZXZlcnl0aGluZyB1cCB0byByMC4gKi8KKwkiCW1zciAgcHNwLCByMAkJCQkJXG4iIC8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwkiCW1vdnMgcjAsICMyCQkJCQlcbiIgLyogU3dpdGNoIHRvIHRoZSBwc3Agc3RhY2suICovCisJIgltc3IgIENPTlRST0wsIHIwCQkJCVxuIgorCSIJaXNiCQkJCQkJCVxuIgorCSIJcG9wICB7cjAtcjV9CQkJCQlcbiIgLyogUG9wIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgc2F2ZWQgYXV0b21hdGljYWxseS4gKi8KKwkiCW1vdiAgbHIsIHI1CQkJCQlcbiIgLyogbHIgaXMgbm93IGluIHI1LiAqLworCSIJcG9wICB7cjN9CQkJCQlcbiIgLyogUmV0dXJuIGFkZHJlc3MgaXMgbm93IGluIHIzLiAqLworCSIJcG9wICB7cjJ9CQkJCQlcbiIgLyogUG9wIGFuZCBkaXNjYXJkIFhQU1IuICovCisJIgljcHNpZSBpCQkJCQkJXG4iIC8qIFRoZSBmaXJzdCB0YXNrIGhhcyBpdHMgY29udGV4dCBhbmQgaW50ZXJydXB0cyBjYW4gYmUgZW5hYmxlZC4gKi8KKwkiCWJ4ICAgcjMJCQkJCQlcbiIgLyogRmluYWxseSwganVtcCB0byB0aGUgdXNlciBkZWZpbmVkIHRhc2sgY29kZS4gKi8KKwkiCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQlcbiIKKwkicHhDdXJyZW50VENCQ29uc3QyOiAud29yZCBweEN1cnJlbnRUQ0IJICAiCisJCQkJICApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZWUgaGVhZGVyIGZpbGUgZm9yIGRlc2NyaXB0aW9uLgorICovCitCYXNlVHlwZV90IHhQb3J0U3RhcnRTY2hlZHVsZXIoIHZvaWQgKQoreworCS8qIE1ha2UgUGVuZFNWLCBDYWxsU1YgYW5kIFN5c1RpY2sgdGhlIHNhbWUgcHJpcm9pdHkgYXMgdGhlIGtlcm5lbC4gKi8KKwkqKHBvcnROVklDX1NZU1BSSTIpIHw9IHBvcnROVklDX1BFTkRTVl9QUkk7CisJKihwb3J0TlZJQ19TWVNQUkkyKSB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwlwcnZTZXR1cFRpbWVySW50ZXJydXB0KCk7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IHJlYWR5IGZvciB0aGUgZmlyc3QgdGFzay4gKi8KKwl1eENyaXRpY2FsTmVzdGluZyA9IDA7CisKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwl2UG9ydFN0YXJ0Rmlyc3RUYXNrKCk7CisKKwkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYXMgdGhlIHRhc2tzIHdpbGwgbm93IGJlIGV4ZWN1dGluZyEgIENhbGwgdGhlIHRhc2sKKwlleGl0IGVycm9yIGZ1bmN0aW9uIHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgYSBzdGF0aWMgZnVuY3Rpb24KKwlub3QgYmVpbmcgY2FsbGVkIGluIHRoZSBjYXNlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBvdmVycmlkZXMgdGhpcworCWZ1bmN0aW9uYWxpdHkgYnkgZGVmaW5pbmcgY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUy4gIENhbGwKKwl2VGFza1N3aXRjaENvbnRleHQoKSBzbyBsaW5rIHRpbWUgb3B0aW1pc2F0aW9uIGRvZXMgbm90IHJlbW92ZSB0aGUKKwlzeW1ib2wuICovCisJdlRhc2tTd2l0Y2hDb250ZXh0KCk7CisJcHJ2VGFza0V4aXRFcnJvcigpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSEgKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApCit7CisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkqKCBwb3J0TlZJQ19JTlRfQ1RSTCApID0gcG9ydE5WSUNfUEVORFNWU0VUOworCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzIGNvbXBsZXRlbHkKKwl3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkKK3sKKyAgICBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisgICAgdXhDcml0aWNhbE5lc3RpbmcrKzsKKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CisJX19hc20gdm9sYXRpbGUoICJpc2IiICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApCit7CisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyApOworICAgIHV4Q3JpdGljYWxOZXN0aW5nLS07CisgICAgaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDAgKQorICAgIHsKKyAgICAgICAgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisgICAgfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3VpbnQzMl90IHVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoIHZvaWQgKQoreworCV9fYXNtIHZvbGF0aWxlKAorCQkJCQkiIG1ycyByMCwgUFJJTUFTSwlcbiIKKwkJCQkJIiBjcHNpZCBpCQkJXG4iCisJCQkJCSIgYnggbHIJCQkJICAiCisJCQkJCTo6OiAibWVtb3J5IgorCQkJCSAgKTsKKworI2lmICFkZWZpbmVkIChfX0FSTUNDX1ZFUlNJT04pICYmIChfX0FSTUNDX1ZFUlNJT04gPj0gNjAxMDA1MCkKKwkvKiBUbyBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4gIFRoZSByZXR1cm4gc3RhdGVtZW50IHdpbGwgbmV2ZXJlIGJlIHJlYWNoZWQsCisJYnV0IHNvbWUgY29tcGlsZXJzIHdhcm4gaWYgaXQgaXMgbm90IGluY2x1ZGVkLCB3aGlsZSBvdGhlcnMgd29uJ3QgY29tcGlsZSBpZgorCWl0IGlzLiAqLworCXJldHVybiAwOworI2VuZGlmCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggX19hdHRyaWJ1dGVfXyggKCB1bnVzZWQgKSApIHVpbnQzMl90IHVsTWFzayApCit7CisJX19hc20gdm9sYXRpbGUoCisJCQkJCSIgbXNyIFBSSU1BU0ssIHIwCVxuIgorCQkJCQkiIGJ4IGxyCQkJCSAgIgorCQkJCQk6OjogIm1lbW9yeSIKKwkJCQkgICk7CisKKyNpZiAhZGVmaW5lZCAoX19BUk1DQ19WRVJTSU9OKSAmJiAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApCisJLyogSnVzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLiAgdWxNYXNrIGlzIHVzZWQgZnJvbSB0aGUgYXNtIGNvZGUgYnV0CisJdGhlIGNvbXBpbGVyIGNhbid0IHNlZSB0aGF0LiAgU29tZSBjb21waWxlcnMgZ2VuZXJhdGUgd2FybmluZ3Mgd2l0aG91dCB0aGUKKwlmb2xsb3dpbmcgbGluZSwgd2hpbGUgb3RoZXJzIGdlbmVyYXRlIHdhcm5pbmdzIGlmIHRoZSBsaW5lIGlzIGluY2x1ZGVkLiAqLworCSggdm9pZCApIHVsTWFzazsKKyNlbmRpZgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBUaGlzIGlzIGEgbmFrZWQgZnVuY3Rpb24uICovCisKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCS5zeW50YXggdW5pZmllZAkJCQkJCVxuIgorCSIJbXJzIHIwLCBwc3AJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCWxkcglyMywgcHhDdXJyZW50VENCQ29uc3QJCQlcbiIgLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJIglsZHIJcjIsIFtyM10JCQkJCQlcbiIKKwkiCQkJCQkJCQkJCVxuIgorCSIJc3VicyByMCwgcjAsICMzMgkJCQkJXG4iIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSByZW1haW5pbmcgbG93IHJlZ2lzdGVycy4gKi8KKwkiCXN0ciByMCwgW3IyXQkJCQkJCVxuIiAvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrLiAqLworCSIJc3RtaWEgcjAhLCB7cjQtcjd9CQkJCQlcbiIgLyogU3RvcmUgdGhlIGxvdyByZWdpc3RlcnMgdGhhdCBhcmUgbm90IHNhdmVkIGF1dG9tYXRpY2FsbHkuICovCisJIiAJbW92IHI0LCByOAkJCQkJCQlcbiIgLyogU3RvcmUgdGhlIGhpZ2ggcmVnaXN0ZXJzLiAqLworCSIgCW1vdiByNSwgcjkJCQkJCQkJXG4iCisJIiAJbW92IHI2LCByMTAJCQkJCQkJXG4iCisJIiAJbW92IHI3LCByMTEJCQkJCQkJXG4iCisJIiAJc3RtaWEgcjAhLCB7cjQtcjd9CQkJCQlcbiIKKwkiCQkJCQkJCQkJCVxuIgorCSIJcHVzaCB7cjMsIHIxNH0JCQkJCQlcbiIKKwkiCWNwc2lkIGkJCQkJCQkJCVxuIgorCSIJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CQkJCVxuIgorCSIJY3BzaWUgaQkJCQkJCQkJXG4iCisJIglwb3Age3IyLCByM30JCQkJCQlcbiIgLyogbHIgZ29lcyBpbiByMy4gcjIgbm93IGhvbGRzIHRjYiBwb2ludGVyLiAqLworCSIJCQkJCQkJCQkJXG4iCisJIglsZHIgcjEsIFtyMl0JCQkJCQlcbiIKKwkiCWxkciByMCwgW3IxXQkJCQkJCVxuIiAvKiBUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCSIJYWRkcyByMCwgcjAsICMxNgkJCQkJXG4iIC8qIE1vdmUgdG8gdGhlIGhpZ2ggcmVnaXN0ZXJzLiAqLworCSIJbGRtaWEgcjAhLCB7cjQtcjd9CQkJCQlcbiIgLyogUG9wIHRoZSBoaWdoIHJlZ2lzdGVycy4gKi8KKwkiIAltb3YgcjgsIHI0CQkJCQkJCVxuIgorCSIgCW1vdiByOSwgcjUJCQkJCQkJXG4iCisJIiAJbW92IHIxMCwgcjYJCQkJCQkJXG4iCisJIiAJbW92IHIxMSwgcjcJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCW1zciBwc3AsIHIwCQkJCQkJCVxuIiAvKiBSZW1lbWJlciB0aGUgbmV3IHRvcCBvZiBzdGFjayBmb3IgdGhlIHRhc2suICovCisJIgkJCQkJCQkJCQlcbiIKKwkiCXN1YnMgcjAsIHIwLCAjMzIJCQkJCVxuIiAvKiBHbyBiYWNrIGZvciB0aGUgbG93IHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSByZXN0b3JlZC4gKi8KKwkiIAlsZG1pYSByMCEsIHtyNC1yN30JCQkJCVxuIiAvKiBQb3AgbG93IHJlZ2lzdGVycy4gICovCisJIgkJCQkJCQkJCQlcbiIKKwkiCWJ4IHIzCQkJCQkJCQlcbiIKKwkiCQkJCQkJCQkJCVxuIgorCSIJLmFsaWduIDQJCQkJCQkJXG4iCisJInB4Q3VycmVudFRDQkNvbnN0OiAud29yZCBweEN1cnJlbnRUQ0IJICAiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKQorewordWludDMyX3QgdWxQcmV2aW91c01hc2s7CisKKwl1bFByZXZpb3VzTWFzayA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCS8qIEluY3JlbWVudCB0aGUgUlRPUyB0aWNrLiAqLworCQlpZiggeFRhc2tJbmNyZW1lbnRUaWNrKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIFBlbmQgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkJCSoocG9ydE5WSUNfSU5UX0NUUkwpID0gcG9ydE5WSUNfUEVORFNWU0VUOworCQl9CisJfQorCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdWxQcmV2aW91c01hc2sgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCisJX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKQorCXsKKwl1aW50MzJfdCB1bFJlbG9hZFZhbHVlLCB1bENvbXBsZXRlVGlja1BlcmlvZHMsIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMsIHVsU3lzVGlja0NUUkw7CisJVGlja1R5cGVfdCB4TW9kaWZpYWJsZUlkbGVUaW1lOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgU3lzVGljayByZWxvYWQgdmFsdWUgZG9lcyBub3Qgb3ZlcmZsb3cgdGhlIGNvdW50ZXIuICovCisJCWlmKCB4RXhwZWN0ZWRJZGxlVGltZSA+IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgKQorCQl7CisJCQl4RXhwZWN0ZWRJZGxlVGltZSA9IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3M7CisJCX0KKworCQkvKiBTdG9wIHRoZSBTeXNUaWNrIG1vbWVudGFyaWx5LiAgVGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IKKwkJaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiBiZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwKKwkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCisJCWtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgdGltZS4gKi8KKwkJcG9ydE5WSUNfU1lTVElDS19DVFJMICY9IH5wb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIHJlbG9hZCB2YWx1ZSByZXF1aXJlZCB0byB3YWl0IHhFeHBlY3RlZElkbGVUaW1lCisJCXRpY2sgcGVyaW9kcy4gIC0xIGlzIHVzZWQgYmVjYXVzZSB0aGlzIGNvZGUgd2lsbCBleGVjdXRlIHBhcnQgd2F5CisJCXRocm91Z2ggb25lIG9mIHRoZSB0aWNrIHBlcmlvZHMuICovCisJCXVsUmVsb2FkVmFsdWUgPSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgKyAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICogKCB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTCApICk7CisJCWlmKCB1bFJlbG9hZFZhbHVlID4gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKQorCQl7CisJCQl1bFJlbG9hZFZhbHVlIC09IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uOworCQl9CisKKwkJLyogRW50ZXIgYSBjcml0aWNhbCBzZWN0aW9uIGJ1dCBkb24ndCB1c2UgdGhlIHRhc2tFTlRFUl9DUklUSUNBTCgpCisJCW1ldGhvZCBhcyB0aGF0IHdpbGwgbWFzayBpbnRlcnJ1cHRzIHRoYXQgc2hvdWxkIGV4aXQgc2xlZXAgbW9kZS4gKi8KKwkJX19hc20gdm9sYXRpbGUoICJjcHNpZCBpIiApOworCisJCS8qIElmIGEgY29udGV4dCBzd2l0Y2ggaXMgcGVuZGluZyBvciBhIHRhc2sgaXMgd2FpdGluZyBmb3IgdGhlIHNjaGVkdWxlcgorCQl0byBiZSB1bnN1c3BlbmRlZCB0aGVuIGFiYW5kb24gdGhlIGxvdyBwb3dlciBlbnRyeS4gKi8KKwkJaWYoIGVUYXNrQ29uZmlybVNsZWVwTW9kZVN0YXR1cygpID09IGVBYm9ydFNsZWVwICkKKwkJeworCQkJLyogUmVzdGFydCBmcm9tIHdoYXRldmVyIGlzIGxlZnQgaW4gdGhlIGNvdW50IHJlZ2lzdGVyIHRvIGNvbXBsZXRlCisJCQl0aGlzIHRpY2sgcGVyaW9kLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkwgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7CisKKwkJCS8qIFJlc2V0IHRoZSByZWxvYWQgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciBub3JtYWwgdGljaworCQkJcGVyaW9kcy4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAtIHNlZSBjb21tZW50cyBhYm92ZSB0aGUgY3BzaWQgaW5zdHJ1Y3Rpb24oKQorCQkJYWJvdmUuICovCisJCQlfX2FzbSB2b2xhdGlsZSggImNwc2llIGkiICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTZXQgdGhlIG5ldyByZWxvYWQgdmFsdWUuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQUQgPSB1bFJlbG9hZFZhbHVlOworCisJCQkvKiBDbGVhciB0aGUgU3lzVGljayBjb3VudCBmbGFnIGFuZCBzZXQgdGhlIGNvdW50IHZhbHVlIGJhY2sgdG8KKwkJCXplcm8uICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgPSAwVUw7CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljay4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTCB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKworCQkJLyogU2xlZXAgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMuICBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORygpIGNhbgorCQkJc2V0IGl0cyBwYXJhbWV0ZXIgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IGl0cyBpbXBsZW1lbnRhdGlvbiBjb250YWlucworCQkJaXRzIG93biB3YWl0IGZvciBpbnRlcnJ1cHQgb3Igd2FpdCBmb3IgZXZlbnQgaW5zdHJ1Y3Rpb24sIGFuZCBzbyB3ZmkKKwkJCXNob3VsZCBub3QgYmUgZXhlY3V0ZWQgYWdhaW4uICBIb3dldmVyLCB0aGUgb3JpZ2luYWwgZXhwZWN0ZWQgaWRsZQorCQkJdGltZSB2YXJpYWJsZSBtdXN0IHJlbWFpbiB1bm1vZGlmaWVkLCBzbyBhIGNvcHkgaXMgdGFrZW4uICovCisJCQl4TW9kaWZpYWJsZUlkbGVUaW1lID0geEV4cGVjdGVkSWRsZVRpbWU7CisJCQljb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyggJnhNb2RpZmlhYmxlSWRsZVRpbWUgKTsKKwkJCWlmKCB4TW9kaWZpYWJsZUlkbGVUaW1lID4gMCApCisJCQl7CisJCQkJX19hc20gdm9sYXRpbGUoICJkc2IiICk7CisJCQkJX19hc20gdm9sYXRpbGUoICJ3ZmkiICk7CisJCQkJX19hc20gdm9sYXRpbGUoICJpc2IiICk7CisJCQl9CisJCQljb25maWdQT1NUX1NMRUVQX1BST0NFU1NJTkcoICZ4RXhwZWN0ZWRJZGxlVGltZSApOworCisJCQkvKiBTdG9wIFN5c1RpY2suICBBZ2FpbiwgdGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IgaXMKKwkJCWFjY291bnRlZCBmb3IgYXMgYmVzdCBpdCBjYW4gYmUsIGJ1dCB1c2luZyB0aGUgdGlja2xlc3MgbW9kZSB3aWxsCisJCQlpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkgZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUKKwkJCWtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgdGltZS4gKi8KKwkJCXVsU3lzVGlja0NUUkwgPSBwb3J0TlZJQ19TWVNUSUNLX0NUUkw7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkwgPSAoIHVsU3lzVGlja0NUUkwgJiB+cG9ydE5WSUNfU1lTVElDS19FTkFCTEUgKTsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgLSBzZWUgY29tbWVudHMgYWJvdmUgdGhlIGNwc2lkIGluc3RydWN0aW9uKCkKKwkJCWFib3ZlLiAqLworCQkJX19hc20gdm9sYXRpbGUoICJjcHNpZSBpIiApOworCisJCQlpZiggKCB1bFN5c1RpY2tDVFJMICYgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHICkgIT0gMCApCisJCQl7CisJCQkJdWludDMyX3QgdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogVGhlIHRpY2sgaW50ZXJydXB0IGhhcyBhbHJlYWR5IGV4ZWN1dGVkLCBhbmQgdGhlIFN5c1RpY2sKKwkJCQljb3VudCByZWxvYWRlZCB3aXRoIHVsUmVsb2FkVmFsdWUuICBSZXNldCB0aGUKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQUQgd2l0aCB3aGF0ZXZlciByZW1haW5zIG9mIHRoaXMgdGljaworCQkJCXBlcmlvZC4gKi8KKwkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICkgLSAoIHVsUmVsb2FkVmFsdWUgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgKTsKKworCQkJCS8qIERvbid0IGFsbG93IGEgdGlueSB2YWx1ZSwgb3IgdmFsdWVzIHRoYXQgaGF2ZSBzb21laG93CisJCQkJdW5kZXJmbG93ZWQgYmVjYXVzZSB0aGUgcG9zdCBzbGVlcCBob29rIGRpZCBzb21ldGhpbmcKKwkJCQl0aGF0IHRvb2sgdG9vIGxvbmcuICovCisJCQkJaWYoICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlIDwgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKSB8fCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA+IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgKQorCQkJCXsKKwkJCQkJdWxDYWxjdWxhdGVkTG9hZFZhbHVlID0gKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTCApOworCQkJCX0KKworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBoYW5kbGVyIHdpbGwgYWxyZWFkeSBoYXZlIHBlbmRlZCB0aGUgdGljaworCQkJCXByb2Nlc3NpbmcgaW4gdGhlIGtlcm5lbC4gIEFzIHRoZSBwZW5kaW5nIHRpY2sgd2lsbCBiZQorCQkJCXByb2Nlc3NlZCBhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gZXhpdHMsIHRoZSB0aWNrIHZhbHVlCisJCQkJbWFpbnRhaW5lZCBieSB0aGUgdGljayBpcyBzdGVwcGVkIGZvcndhcmQgYnkgb25lIGxlc3MgdGhhbiB0aGUKKwkJCQl0aW1lIHNwZW50IHdhaXRpbmcuICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0geEV4cGVjdGVkSWRsZVRpbWUgLSAxVUw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogU29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHRpY2sgaW50ZXJydXB0IGVuZGVkIHRoZSBzbGVlcC4KKwkJCQlXb3JrIG91dCBob3cgbG9uZyB0aGUgc2xlZXAgbGFzdGVkIHJvdW5kZWQgdG8gY29tcGxldGUgdGljaworCQkJCXBlcmlvZHMgKG5vdCB0aGUgdWxSZWxvYWQgdmFsdWUgd2hpY2ggYWNjb3VudGVkIGZvciBwYXJ0CisJCQkJdGlja3MpLiAqLworCQkJCXVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgPSAoIHhFeHBlY3RlZElkbGVUaW1lICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRTsKKworCQkJCS8qIEhvdyBtYW55IGNvbXBsZXRlIHRpY2sgcGVyaW9kcyBwYXNzZWQgd2hpbGUgdGhlIHByb2Nlc3NvcgorCQkJCXdhcyB3YWl0aW5nPyAqLworCQkJCXVsQ29tcGxldGVUaWNrUGVyaW9kcyA9IHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKworCQkJCS8qIFRoZSByZWxvYWQgdmFsdWUgaXMgc2V0IHRvIHdoYXRldmVyIGZyYWN0aW9uIG9mIGEgc2luZ2xlIHRpY2sKKwkJCQlwZXJpb2QgcmVtYWlucy4gKi8KKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQUQgPSAoICggdWxDb21wbGV0ZVRpY2tQZXJpb2RzICsgMSApICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHM7CisJCQl9CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljayBzbyBpdCBydW5zIGZyb20gcG9ydE5WSUNfU1lTVElDS19MT0FECisJCQlhZ2FpbiwgdGhlbiBzZXQgcG9ydE5WSUNfU1lTVElDS19MT0FEIGJhY2sgdG8gaXRzIHN0YW5kYXJkCisJCQl2YWx1ZS4gIFRoZSBjcml0aWNhbCBzZWN0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoZSB0aWNrIGludGVycnVwdAorCQkJY2FuIG9ubHkgZXhlY3V0ZSBvbmNlIGluIHRoZSBjYXNlIHRoYXQgdGhlIHJlbG9hZCByZWdpc3RlciBpcyBuZWFyCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFID0gMFVMOworCQkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7CisJCQl7CisJCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworCQkJCXZUYXNrU3RlcFRpY2soIHVsQ29tcGxldGVUaWNrUGVyaW9kcyApOworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCQkJfQorCQkJcG9ydEVYSVRfQ1JJVElDQUwoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qICNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZXR1cCB0aGUgc3lzdGljayB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzIGF0IHRoZSByZXF1aXJlZAorICogZnJlcXVlbmN5LgorICovCit2b2lkIHBydlNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKQoreworIC8qIENhbGN1bGF0ZSB0aGUgY29uc3RhbnRzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgdGljayBpbnRlcnJ1cHQuICovCisgI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKKyB7CisgICB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApOworICAgeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IHBvcnRNQVhfMjRfQklUX05VTUJFUiAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworICAgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKKyB9CisgI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qIFN0b3AgYW5kIHJlc2V0IHRoZSBTeXNUaWNrLiAqLworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTCA9IDBVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgPSAwVUw7CisKKyAvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworIHBvcnROVklDX1NZU1RJQ0tfTE9BRCA9ICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisgcG9ydE5WSUNfU1lTVElDS19DVFJMID0gcG9ydE5WSUNfU1lTVElDS19DTEsgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMC9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMC9wb3J0bWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2E0Y2I5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00wL3BvcnRtYWNyby5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyogU2NoZWR1bGVyIHV0aWxpdGllcy4gKi8KK2V4dGVybiB2b2lkIHZQb3J0WWllbGQoIHZvaWQgKTsKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkxfUkVHCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCQkoIDFVTCA8PCAyOFVMICkKKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJCXZQb3J0WWllbGQoKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApIGlmKCB4U3dpdGNoUmVxdWlyZWQgKSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuICovCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIF9fYXR0cmlidXRlX18oKG5ha2VkKSk7CitleHRlcm4gdm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdWludDMyX3QgdWxNYXNrICkgIF9fYXR0cmlidXRlX18oKG5ha2VkKSk7CisKKyNkZWZpbmUgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpCQl1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCkKKyNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKHgpCXZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCB4ICkKKyNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCV9fYXNtIHZvbGF0aWxlIAkoICIgY3BzaWQgaSAiIDo6OiAibWVtb3J5IiApCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQlfX2FzbSB2b2xhdGlsZSAJKCAiIGNwc2llIGkgIiA6OjogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRpY2tsZXNzIGlkbGUvbG93IHBvd2VyIGZ1bmN0aW9uYWxpdHkuICovCisjaWZuZGVmIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAKKwlleHRlcm4gdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApOworCSNkZWZpbmUgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCggeEV4cGVjdGVkSWRsZVRpbWUgKSB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggeEV4cGVjdGVkSWRsZVRpbWUgKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4gKi8KKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorCisjZGVmaW5lIHBvcnROT1AoKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogUE9SVE1BQ1JPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMy9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3MDljMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMy9wb3J0LmMKQEAgLTAsMCArMSw3MTcgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiBwb3J0YWJsZS5oIGZvciB0aGUgQVJNIENNMyBwb3J0LgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisvKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgZW5zdXJlIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgaXMKK2RlZmluZWQuICBUaGUgdmFsdWUgc2hvdWxkIGFsc28gZW5zdXJlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitGcmVlUlRPUy5vcmcgdmVyc2lvbnMgcHJpb3IgdG8gVjQuNC4wIGRpZCBub3QgaW5jbHVkZSB0aGlzIGRlZmluaXRpb24uICovCisjaWZuZGVmIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkKKwkjZGVmaW5lIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgMjU1CisjZW5kaWYKKworI2lmbmRlZiBjb25maWdTWVNUSUNLX0NMT0NLX0haCisJI2RlZmluZSBjb25maWdTWVNUSUNLX0NMT0NLX0haIGNvbmZpZ0NQVV9DTE9DS19IWgorCS8qIEVuc3VyZSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGF0IHRoZSBzYW1lIGZyZXF1ZW5jeSBhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDFVTCA8PCAyVUwgKQorI2Vsc2UKKwkvKiBUaGUgd2F5IHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgaXMgbm90IG1vZGlmaWVkIGluIGNhc2UgaXQgaXMgbm90IHRoZSBzYW1lCisJYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQJKCAwICkKKyNlbmRpZgorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29yZS4gIFJlZ2lzdGVycyBmaXJzdC4uLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTQgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMl9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApICkKKy8qIC4uLnRoZW4gYml0cyBpbiB0aGUgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0lOVF9CSVQJCQkoIDFVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQJCQkoIDFVTCA8PCAwVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUdfQklUCQkoIDFVTCA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWQ0xFQVJfQklUIAkJCSggMVVMIDw8IDI3VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EX1NZU1RJQ0tfQ0xFQVJfQklUCQkoIDFVTCA8PCAyNVVMICkKKworI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZfUFJJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMjRVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgYW4gaW50ZXJydXB0IHByaW9yaXR5LiAqLworI2RlZmluZSBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSCQkoIDE2ICkKKyNkZWZpbmUgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiAJKCAweEUwMDBFM0YwICkKKyNkZWZpbmUgcG9ydEFJUkNSX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4RTAwMEVEMEMgKSApCisjZGVmaW5lIHBvcnRNQVhfOF9CSVRfVkFMVUUJCQkJCSggKCB1aW50OF90ICkgMHhmZiApCisjZGVmaW5lIHBvcnRUT1BfQklUX09GX0JZVEUJCQkJCSggKCB1aW50OF90ICkgMHg4MCApCisjZGVmaW5lIHBvcnRNQVhfUFJJR1JPVVBfQklUUwkJCQkoICggdWludDhfdCApIDcgKQorI2RlZmluZSBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSwkJCQkoIDB4MDdVTCA8PCA4VUwgKQorI2RlZmluZSBwb3J0UFJJR1JPVVBfU0hJRlQJCQkJCSggOFVMICkKKworLyogTWFza3Mgb2ZmIGFsbCBiaXRzIGJ1dCB0aGUgVkVDVEFDVElWRSBiaXRzIGluIHRoZSBJQ1NSIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0VkVDVEFDVElWRV9NQVNLCQkJCQkoIDB4RkZVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suICovCisjZGVmaW5lIHBvcnRJTklUSUFMX1hQU1IJCQkJCSggMHgwMTAwMDAwMFVMICkKKworLyogVGhlIHN5c3RpY2sgaXMgYSAyNC1iaXQgY291bnRlci4gKi8KKyNkZWZpbmUgcG9ydE1BWF8yNF9CSVRfTlVNQkVSCQkJCSggMHhmZmZmZmZVTCApCisKKy8qIEEgZmlkZGxlIGZhY3RvciB0byBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIFN5c1RpY2sgY291bnRzIHRoYXQgd291bGQgaGF2ZQorb2NjdXJyZWQgd2hpbGUgdGhlIFN5c1RpY2sgY291bnRlciBpcyBzdG9wcGVkIGR1cmluZyB0aWNrbGVzcyBpZGxlCitjYWxjdWxhdGlvbnMuICovCisjZGVmaW5lIHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUgkJCSggNDVVTCApCisKKy8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCitoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KKyNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHByZS1sb2FkaW5nIG9mIHRoZSBpbml0aWFsIExSIHdpdGggdGhlIGFkZHJlc3Mgb2YKK3BydlRhc2tFeGl0RXJyb3IoKSBpbiBjYXNlIGl0IG1lc3NlcyB1cCB1bndpbmRpbmcgb2YgdGhlIHN0YWNrIGluIHRoZQorZGVidWdnZXIuICovCisjaWZkZWYgY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUworCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUworI2Vsc2UKKwkjZGVmaW5lIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTCXBydlRhc2tFeGl0RXJyb3IKKyNlbmRpZgorCisvKgorICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuICBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcworICogZmlsZSBpcyB3ZWFrIHRvIGFsbG93IGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gY2hhbmdlIHRoZSB0aW1lciB1c2VkIHRvCisgKiBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CisKKy8qCisgKiBFeGNlcHRpb24gaGFuZGxlcnMuCisgKi8KK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApOwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKgorICogU3RhcnQgZmlyc3QgdGFzayBpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSB0ZXN0ZWQgaW4gaXNvbGF0aW9uLgorICovCitzdGF0aWMgdm9pZCBwcnZQb3J0U3RhcnRGaXJzdFRhc2soIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKgorICogVXNlZCB0byBjYXRjaCB0YXNrcyB0aGF0IGF0dGVtcHQgdG8gcmV0dXJuIGZyb20gdGhlaXIgaW1wbGVtZW50aW5nIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZwordmFyaWFibGUuICovCitzdGF0aWMgVUJhc2VUeXBlX3QgdXhDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhOworCisvKgorICogVGhlIG51bWJlciBvZiBTeXNUaWNrIGluY3JlbWVudHMgdGhhdCBtYWtlIHVwIG9uZSB0aWNrIHBlcmlvZC4KKyAqLworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwlzdGF0aWMgdWludDMyX3QgdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGljayBwZXJpb2RzIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgaXMgbGltaXRlZCBieSB0aGUKKyAqIDI0IGJpdCByZXNvbHV0aW9uIG9mIHRoZSBTeXNUaWNrIHRpbWVyLgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogQ29tcGVuc2F0ZSBmb3IgdGhlIENQVSBjeWNsZXMgdGhhdCBwYXNzIHdoaWxlIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgKGxvdworICogcG93ZXIgZnVuY3Rpb25hbGl0eSBvbmx5LgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFVzZWQgYnkgdGhlIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSBtYWNybyB0byBlbnN1cmUKKyAqIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgYXJlIG5vdCBjYWxsZWQgZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkCisgKiBhIHByaW9yaXR5IGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKyAqLworI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwkgc3RhdGljIHVpbnQ4X3QgdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSAwOworCSBzdGF0aWMgdWludDMyX3QgdWxNYXhQUklHUk9VUFZhbHVlID0gMDsKKwkgc3RhdGljIGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzID0gKCBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgKSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2OworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMgKQoreworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwlpbnRlcnJ1cHQuICovCisJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkvKiB4UFNSICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggKCBTdGFja1R5cGVfdCApIHB4Q29kZSApICYgcG9ydFNUQVJUX0FERFJFU1NfTUFTSzsJLyogUEMgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTOwkvKiBMUiAqLworCXB4VG9wT2ZTdGFjayAtPSA1OwkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CS8qIFIwICovCisJcHhUb3BPZlN0YWNrIC09IDg7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKK3ZvbGF0aWxlIHVpbnQzMl90IHVsRHVtbXkgPSAwVUw7CisKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCWl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uICBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCXNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4KKworCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQoKSB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMKKwlkZWZpbmVkLCB0aGVuIHN0b3AgaGVyZSBzbyBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXdoaWxlKCB1bER1bW15ID09IDAgKQorCXsKKwkJLyogVGhpcyBmaWxlIGNhbGxzIHBydlRhc2tFeGl0RXJyb3IoKSBhZnRlciB0aGUgc2NoZWR1bGVyIGhhcyBiZWVuCisJCXN0YXJ0ZWQgdG8gcmVtb3ZlIGEgY29tcGlsZXIgd2FybmluZyBhYm91dCB0aGUgZnVuY3Rpb24gYmVpbmcgZGVmaW5lZAorCQlidXQgbmV2ZXIgY2FsbGVkLiAgdWxEdW1teSBpcyB1c2VkIHB1cmVseSB0byBxdWlldGVuIG90aGVyIHdhcm5pbmdzCisJCWFib3V0IGNvZGUgYXBwZWFyaW5nIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIC0gbWFraW5nIHVsRHVtbXkKKwkJdm9sYXRpbGUgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoZSBmdW5jdGlvbiBjb3VsZCByZXR1cm4gYW5kCisJCXRoZXJlZm9yZSBub3Qgb3V0cHV0IGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGZvciBjb2RlIHRoYXQgYXBwZWFycworCQlhZnRlciBpdC4gKi8KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKQoreworCV9fYXNtIHZvbGF0aWxlICgKKwkJCQkJIglsZHIJcjMsIHB4Q3VycmVudFRDQkNvbnN0MgkJXG4iIC8qIFJlc3RvcmUgdGhlIGNvbnRleHQuICovCisJCQkJCSIJbGRyIHIxLCBbcjNdCQkJCQlcbiIgLyogVXNlIHB4Q3VycmVudFRDQkNvbnN0IHRvIGdldCB0aGUgcHhDdXJyZW50VENCIGFkZHJlc3MuICovCisJCQkJCSIJbGRyIHIwLCBbcjFdCQkJCQlcbiIgLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwkJCQkJIglsZG1pYSByMCEsIHtyNC1yMTF9CQkJCVxuIiAvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCBvbiBleGNlcHRpb24gZW50cnkgYW5kIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50LiAqLworCQkJCQkiCW1zciBwc3AsIHIwCQkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIHRhc2sgc3RhY2sgcG9pbnRlci4gKi8KKwkJCQkJIglpc2IJCQkJCQkJCVxuIgorCQkJCQkiCW1vdiByMCwgIzAgCQkJCQkJXG4iCisJCQkJCSIJbXNyCWJhc2VwcmksIHIwCQkJCQlcbiIKKwkJCQkJIglvcnIgcjE0LCAjMHhkCQkJCQlcbiIKKwkJCQkJIglieCByMTQJCQkJCQkJXG4iCisJCQkJCSIJCQkJCQkJCQlcbiIKKwkJCQkJIgkuYWxpZ24gNAkJCQkJCVxuIgorCQkJCQkicHhDdXJyZW50VENCQ29uc3QyOiAud29yZCBweEN1cnJlbnRUQ0IJCQkJXG4iCisJCQkJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZQb3J0U3RhcnRGaXJzdFRhc2soIHZvaWQgKQoreworCV9fYXNtIHZvbGF0aWxlKAorCQkJCQkiIGxkciByMCwgPTB4RTAwMEVEMDggCVxuIiAvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJCQkJCSIgbGRyIHIwLCBbcjBdIAkJCVxuIgorCQkJCQkiIGxkciByMCwgW3IwXSAJCQlcbiIKKwkJCQkJIiBtc3IgbXNwLCByMAkJCVxuIiAvKiBTZXQgdGhlIG1zcCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJCQkJCSIgY3BzaWUgaQkJCQlcbiIgLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJCQkJCSIgY3BzaWUgZgkJCQlcbiIKKwkJCQkJIiBkc2IJCQkJCVxuIgorCQkJCQkiIGlzYgkJCQkJXG4iCisJCQkJCSIgc3ZjIDAJCQkJCVxuIiAvKiBTeXN0ZW0gY2FsbCB0byBzdGFydCBmaXJzdCB0YXNrLiAqLworCQkJCQkiIG5vcAkJCQkJXG4iCisJCQkJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgbXVzdCBub3QgYmUgc2V0IHRvIDAuCisJU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwljb25maWdBU1NFUlQoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOworCisJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwl7CisJCXZvbGF0aWxlIHVpbnQzMl90IHVsT3JpZ2luYWxQcmlvcml0eTsKKwkJdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSAoIHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCApICggcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiArIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKTsKKwkJdm9sYXRpbGUgdWludDhfdCB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHByaW9yaXR5IGZyb20gd2hpY2ggSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCWZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiAgSVNSIHNhZmUgZnVuY3Rpb25zIGFyZSB0aG9zZSB0aGF0IGVuZCBpbgorCQkiRnJvbUlTUiIuICBGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0bworCQllbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQlTYXZlIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkgdmFsdWUgdGhhdCBpcyBhYm91dCB0byBiZSBjbG9iYmVyZWQuICovCisJCXVsT3JpZ2luYWxQcmlvcml0eSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYXZhaWxhYmxlLiAgRmlyc3Qgd3JpdGUgdG8gYWxsCisJCXBvc3NpYmxlIGJpdHMuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gcG9ydE1BWF84X0JJVF9WQUxVRTsKKworCQkvKiBSZWFkIHRoZSB2YWx1ZSBiYWNrIHRvIHNlZSBob3cgbWFueSBiaXRzIHN0dWNrLiAqLworCQl1Y01heFByaW9yaXR5VmFsdWUgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCSNpZmRlZiBfX05WSUNfUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBDTVNJUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IF9fTlZJQ19QUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkjaWZkZWYgY29uZmlnUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBGcmVlUlRPUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IGNvbmZpZ1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCXBydlBvcnRTdGFydEZpcnN0VGFzaygpOworCisJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlIGFzIHRoZSB0YXNrcyB3aWxsIG5vdyBiZSBleGVjdXRpbmchICBDYWxsIHRoZSB0YXNrCisJZXhpdCBlcnJvciBmdW5jdGlvbiB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGEgc3RhdGljIGZ1bmN0aW9uCisJbm90IGJlaW5nIGNhbGxlZCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgb3ZlcnJpZGVzIHRoaXMKKwlmdW5jdGlvbmFsaXR5IGJ5IGRlZmluaW5nIGNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MuICBDYWxsCisJdlRhc2tTd2l0Y2hDb250ZXh0KCkgc28gbGluayB0aW1lIG9wdGltaXNhdGlvbiBkb2VzIG5vdCByZW1vdmUgdGhlCisJc3ltYm9sLiAqLworCXZUYXNrU3dpdGNoQ29udGV4dCgpOworCXBydlRhc2tFeGl0RXJyb3IoKTsKKworCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUhICovCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApCit7CisJLyogTm90IGltcGxlbWVudGVkIGluIHBvcnRzIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLgorCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxMDAwVUwgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApCit7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXV4Q3JpdGljYWxOZXN0aW5nKys7CisKKwkvKiBUaGlzIGlzIG5vdCB0aGUgaW50ZXJydXB0IHNhZmUgdmVyc2lvbiBvZiB0aGUgZW50ZXIgY3JpdGljYWwgZnVuY3Rpb24gc28KKwlhc3NlcnQoKSBpZiBpdCBpcyBiZWluZyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dC4gIE9ubHkgQVBJCisJZnVuY3Rpb25zIHRoYXQgZW5kIGluICJGcm9tSVNSIiBjYW4gYmUgdXNlZCBpbiBhbiBpbnRlcnJ1cHQuICBPbmx5IGFzc2VydCBpZgorCXRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IGlzIDEgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlY3Vyc2l2ZSBjYWxscyBpZiB0aGUKKwlhc3NlcnQgZnVuY3Rpb24gYWxzbyB1c2VzIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwlpZiggdXhDcml0aWNhbE5lc3RpbmcgPT0gMSApCisJeworCQljb25maWdBU1NFUlQoICggcG9ydE5WSUNfSU5UX0NUUkxfUkVHICYgcG9ydFZFQ1RBQ1RJVkVfTUFTSyApID09IDAgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApCit7CisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyApOworCXV4Q3JpdGljYWxOZXN0aW5nLS07CisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDAgKQorCXsKKwkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBUaGlzIGlzIGEgbmFrZWQgZnVuY3Rpb24uICovCisKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgcHNwCQkJCQkJCVxuIgorCSIJaXNiCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCWxkcglyMywgcHhDdXJyZW50VENCQ29uc3QJCQlcbiIgLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJIglsZHIJcjIsIFtyM10JCQkJCQlcbiIKKwkiCQkJCQkJCQkJCVxuIgorCSIJc3RtZGIgcjAhLCB7cjQtcjExfQkJCQkJXG4iIC8qIFNhdmUgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMuICovCisJIglzdHIgcjAsIFtyMl0JCQkJCQlcbiIgLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbnRvIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIFRDQi4gKi8KKwkiCQkJCQkJCQkJCVxuIgorCSIJc3RtZGIgc3AhLCB7cjMsIHIxNH0JCQkJXG4iCisJIgltb3YgcjAsICUwCQkJCQkJCVxuIgorCSIJbXNyIGJhc2VwcmksIHIwCQkJCQkJXG4iCisJIglibCB2VGFza1N3aXRjaENvbnRleHQJCQkJXG4iCisJIgltb3YgcjAsICMwCQkJCQkJCVxuIgorCSIJbXNyIGJhc2VwcmksIHIwCQkJCQkJXG4iCisJIglsZG1pYSBzcCEsIHtyMywgcjE0fQkJCQlcbiIKKwkiCQkJCQkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSBjb250ZXh0LCBpbmNsdWRpbmcgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQuICovCisJIglsZHIgcjEsIFtyM10JCQkJCQlcbiIKKwkiCWxkciByMCwgW3IxXQkJCQkJCVxuIiAvKiBUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCSIJbGRtaWEgcjAhLCB7cjQtcjExfQkJCQkJXG4iIC8qIFBvcCB0aGUgcmVnaXN0ZXJzLiAqLworCSIJbXNyIHBzcCwgcjAJCQkJCQkJXG4iCisJIglpc2IJCQkJCQkJCQlcbiIKKwkiCWJ4IHIxNAkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCVxuIgorCSJweEN1cnJlbnRUQ0JDb25zdDogLndvcmQgcHhDdXJyZW50VENCCVxuIgorCTo6ImkiKGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSkKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApCit7CisJLyogVGhlIFN5c1RpY2sgcnVucyBhdCB0aGUgbG93ZXN0IGludGVycnVwdCBwcmlvcml0eSwgc28gd2hlbiB0aGlzIGludGVycnVwdAorCWV4ZWN1dGVzIGFsbCBpbnRlcnJ1cHRzIG11c3QgYmUgdW5tYXNrZWQuICBUaGVyZSBpcyB0aGVyZWZvcmUgbm8gbmVlZCB0bworCXNhdmUgYW5kIHRoZW4gcmVzdG9yZSB0aGUgaW50ZXJydXB0IG1hc2sgdmFsdWUgYXMgaXRzIHZhbHVlIGlzIGFscmVhZHkKKwlrbm93bi4gKi8KKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBBIGNvbnRleHQgc3dpdGNoIGlzIHJlcXVpcmVkLiAgQ29udGV4dCBzd2l0Y2hpbmcgaXMgcGVyZm9ybWVkIGluCisJCQl0aGUgUGVuZFNWIGludGVycnVwdC4gIFBlbmQgdGhlIFBlbmRTViBpbnRlcnJ1cHQuICovCisJCQlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQl9CisJfQorCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisKKwlfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApCisJeworCXVpbnQzMl90IHVsUmVsb2FkVmFsdWUsIHVsQ29tcGxldGVUaWNrUGVyaW9kcywgdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50czsKKwlUaWNrVHlwZV90IHhNb2RpZmlhYmxlSWRsZVRpbWU7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBTeXNUaWNrIHJlbG9hZCB2YWx1ZSBkb2VzIG5vdCBvdmVyZmxvdyB0aGUgY291bnRlci4gKi8KKwkJaWYoIHhFeHBlY3RlZElkbGVUaW1lID4geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyApCisJCXsKKwkJCXhFeHBlY3RlZElkbGVUaW1lID0geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrczsKKwkJfQorCisJCS8qIFN0b3AgdGhlIFN5c1RpY2sgbW9tZW50YXJpbHkuICBUaGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvcgorCQlpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIGJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbAorCQlpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkgZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUKKwkJa2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhciB0aW1lLiAqLworCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHICY9IH5wb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSByZWxvYWQgdmFsdWUgcmVxdWlyZWQgdG8gd2FpdCB4RXhwZWN0ZWRJZGxlVGltZQorCQl0aWNrIHBlcmlvZHMuICAtMSBpcyB1c2VkIGJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgZXhlY3V0ZSBwYXJ0IHdheQorCQl0aHJvdWdoIG9uZSBvZiB0aGUgdGljayBwZXJpb2RzLiAqLworCQl1bFJlbG9hZFZhbHVlID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyArICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKiAoIHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMICkgKTsKKwkJaWYoIHVsUmVsb2FkVmFsdWUgPiB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApCisJCXsKKwkJCXVsUmVsb2FkVmFsdWUgLT0gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb247CisJCX0KKworCQkvKiBFbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYnV0IGRvbid0IHVzZSB0aGUgdGFza0VOVEVSX0NSSVRJQ0FMKCkKKwkJbWV0aG9kIGFzIHRoYXQgd2lsbCBtYXNrIGludGVycnVwdHMgdGhhdCBzaG91bGQgZXhpdCBzbGVlcCBtb2RlLiAqLworCQlfX2FzbSB2b2xhdGlsZSggImNwc2lkIGkiIDo6OiAibWVtb3J5IiApOworCQlfX2FzbSB2b2xhdGlsZSggImRzYiIgKTsKKwkJX19hc20gdm9sYXRpbGUoICJpc2IiICk7CisKKwkJLyogSWYgYSBjb250ZXh0IHN3aXRjaCBpcyBwZW5kaW5nIG9yIGEgdGFzayBpcyB3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGVyCisJCXRvIGJlIHVuc3VzcGVuZGVkIHRoZW4gYWJhbmRvbiB0aGUgbG93IHBvd2VyIGVudHJ5LiAqLworCQlpZiggZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgPT0gZUFib3J0U2xlZXAgKQorCQl7CisJCQkvKiBSZXN0YXJ0IGZyb20gd2hhdGV2ZXIgaXMgbGVmdCBpbiB0aGUgY291bnQgcmVnaXN0ZXIgdG8gY29tcGxldGUKKwkJCXRoaXMgdGljayBwZXJpb2QuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFJlc2V0IHRoZSByZWxvYWQgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciBub3JtYWwgdGljaworCQkJcGVyaW9kcy4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgLSBzZWUgY29tbWVudHMgYWJvdmUgdGhlIGNwc2lkIGluc3RydWN0aW9uKCkKKwkJCWFib3ZlLiAqLworCQkJX19hc20gdm9sYXRpbGUoICJjcHNpZSBpIiA6OjogIm1lbW9yeSIgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFNldCB0aGUgbmV3IHJlbG9hZCB2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFJlbG9hZFZhbHVlOworCisJCQkvKiBDbGVhciB0aGUgU3lzVGljayBjb3VudCBmbGFnIGFuZCBzZXQgdGhlIGNvdW50IHZhbHVlIGJhY2sgdG8KKwkJCXplcm8uICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKworCQkJLyogU2xlZXAgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMuICBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORygpIGNhbgorCQkJc2V0IGl0cyBwYXJhbWV0ZXIgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IGl0cyBpbXBsZW1lbnRhdGlvbiBjb250YWlucworCQkJaXRzIG93biB3YWl0IGZvciBpbnRlcnJ1cHQgb3Igd2FpdCBmb3IgZXZlbnQgaW5zdHJ1Y3Rpb24sIGFuZCBzbyB3ZmkKKwkJCXNob3VsZCBub3QgYmUgZXhlY3V0ZWQgYWdhaW4uICBIb3dldmVyLCB0aGUgb3JpZ2luYWwgZXhwZWN0ZWQgaWRsZQorCQkJdGltZSB2YXJpYWJsZSBtdXN0IHJlbWFpbiB1bm1vZGlmaWVkLCBzbyBhIGNvcHkgaXMgdGFrZW4uICovCisJCQl4TW9kaWZpYWJsZUlkbGVUaW1lID0geEV4cGVjdGVkSWRsZVRpbWU7CisJCQljb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyggJnhNb2RpZmlhYmxlSWRsZVRpbWUgKTsKKwkJCWlmKCB4TW9kaWZpYWJsZUlkbGVUaW1lID4gMCApCisJCQl7CisJCQkJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCQkJCV9fYXNtIHZvbGF0aWxlKCAid2ZpIiApOworCQkJCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworCQkJfQorCQkJY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HKCAmeEV4cGVjdGVkSWRsZVRpbWUgKTsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgdG8gYWxsb3cgdGhlIGludGVycnVwdCB0aGF0IGJyb3VnaHQgdGhlIE1DVQorCQkJb3V0IG9mIHNsZWVwIG1vZGUgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseS4gIHNlZSBjb21tZW50cyBhYm92ZQorCQkJX19kaXNhYmxlX2ludGVycnVwdCgpIGNhbGwgYWJvdmUuICovCisJCQlfX2FzbSB2b2xhdGlsZSggImNwc2llIGkiIDo6OiAibWVtb3J5IiApOworCQkJX19hc20gdm9sYXRpbGUoICJkc2IiICk7CisJCQlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKKworCQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluIGJlY2F1c2UgdGhlIGNsb2NrIGlzIGFib3V0IHRvIGJlIHN0b3BwZWQKKwkJCWFuZCBpbnRlcnJ1cHRzIHRoYXQgZXhlY3V0ZSB3aGlsZSB0aGUgY2xvY2sgaXMgc3RvcHBlZCB3aWxsIGluY3JlYXNlCisJCQlhbnkgc2xpcHBhZ2UgYmV0d2VlbiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZSBSVE9TIGFuZCBjYWxlbmRhcgorCQkJdGltZS4gKi8KKwkJCV9fYXNtIHZvbGF0aWxlKCAiY3BzaWQgaSIgOjo6ICJtZW1vcnkiICk7CisJCQlfX2FzbSB2b2xhdGlsZSggImRzYiIgKTsKKwkJCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworCisJCQkvKiBEaXNhYmxlIHRoZSBTeXNUaWNrIGNsb2NrIHdpdGhvdXQgcmVhZGluZyB0aGUKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgcmVnaXN0ZXIgdG8gZW5zdXJlIHRoZQorCQkJcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVCBpcyBub3QgY2xlYXJlZCBpZiBpdCBpcyBzZXQuICBBZ2FpbiwKKwkJCXRoZSB0aW1lIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgZm9yIGlzIGFjY291bnRlZCBmb3IgYXMgYmVzdCBpdCBjYW4KKwkJCWJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbCBpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkKKwkJCWRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlIGtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIKKwkJCXRpbWUqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9ICggcG9ydE5WSUNfU1lTVElDS19DTEtfQklUIHwgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUICk7CisKKwkJCS8qIERldGVybWluZSBpZiB0aGUgU3lzVGljayBjbG9jayBoYXMgYWxyZWFkeSBjb3VudGVkIHRvIHplcm8gYW5kCisJCQliZWVuIHNldCBiYWNrIHRvIHRoZSBjdXJyZW50IHJlbG9hZCB2YWx1ZSAodGhlIHJlbG9hZCBiYWNrIGJlaW5nCisJCQljb3JyZWN0IGZvciB0aGUgZW50aXJlIGV4cGVjdGVkIGlkbGUgdGltZSkgb3IgaWYgdGhlIFN5c1RpY2sgaXMgeWV0CisJCQl0byBjb3VudCB0byB6ZXJvIChpbiB3aGljaCBjYXNlIGFuIGludGVycnVwdCBvdGhlciB0aGFuIHRoZSBTeXNUaWNrCisJCQltdXN0IGhhdmUgYnJvdWdodCB0aGUgc3lzdGVtIG91dCBvZiBzbGVlcCBtb2RlKS4gKi8KKwkJCWlmKCAoIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgJiBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUdfQklUICkgIT0gMCApCisJCQl7CisJCQkJdWludDMyX3QgdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogVGhlIHRpY2sgaW50ZXJydXB0IGlzIGFscmVhZHkgcGVuZGluZywgYW5kIHRoZSBTeXNUaWNrIGNvdW50CisJCQkJcmVsb2FkZWQgd2l0aCB1bFJlbG9hZFZhbHVlLiAgUmVzZXQgdGhlCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyB3aXRoIHdoYXRldmVyIHJlbWFpbnMgb2YgdGhpcyB0aWNrCisJCQkJcGVyaW9kLiAqLworCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKSAtICggdWxSZWxvYWRWYWx1ZSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgKTsKKworCQkJCS8qIERvbid0IGFsbG93IGEgdGlueSB2YWx1ZSwgb3IgdmFsdWVzIHRoYXQgaGF2ZSBzb21laG93CisJCQkJdW5kZXJmbG93ZWQgYmVjYXVzZSB0aGUgcG9zdCBzbGVlcCBob29rIGRpZCBzb21ldGhpbmcKKwkJCQl0aGF0IHRvb2sgdG9vIGxvbmcuICovCisJCQkJaWYoICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlIDwgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKSB8fCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA+IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgKQorCQkJCXsKKwkJCQkJdWxDYWxjdWxhdGVkTG9hZFZhbHVlID0gKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTCApOworCQkJCX0KKworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bENhbGN1bGF0ZWRMb2FkVmFsdWU7CisKKwkJCQkvKiBBcyB0aGUgcGVuZGluZyB0aWNrIHdpbGwgYmUgcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhpcworCQkJCWZ1bmN0aW9uIGV4aXRzLCB0aGUgdGljayB2YWx1ZSBtYWludGFpbmVkIGJ5IHRoZSB0aWNrIGlzIHN0ZXBwZWQKKwkJCQlmb3J3YXJkIGJ5IG9uZSBsZXNzIHRoYW4gdGhlIHRpbWUgc3BlbnQgd2FpdGluZy4gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBTb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgdGljayBpbnRlcnJ1cHQgZW5kZWQgdGhlIHNsZWVwLgorCQkJCVdvcmsgb3V0IGhvdyBsb25nIHRoZSBzbGVlcCBsYXN0ZWQgcm91bmRlZCB0byBjb21wbGV0ZSB0aWNrCisJCQkJcGVyaW9kcyAobm90IHRoZSB1bFJlbG9hZCB2YWx1ZSB3aGljaCBhY2NvdW50ZWQgZm9yIHBhcnQKKwkJCQl0aWNrcykuICovCisJCQkJdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cyA9ICggeEV4cGVjdGVkSWRsZVRpbWUgKiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApIC0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJCS8qIEhvdyBtYW55IGNvbXBsZXRlIHRpY2sgcGVyaW9kcyBwYXNzZWQgd2hpbGUgdGhlIHByb2Nlc3NvcgorCQkJCXdhcyB3YWl0aW5nPyAqLworCQkJCXVsQ29tcGxldGVUaWNrUGVyaW9kcyA9IHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKworCQkJCS8qIFRoZSByZWxvYWQgdmFsdWUgaXMgc2V0IHRvIHdoYXRldmVyIGZyYWN0aW9uIG9mIGEgc2luZ2xlIHRpY2sKKwkJCQlwZXJpb2QgcmVtYWlucy4gKi8KKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCAoIHVsQ29tcGxldGVUaWNrUGVyaW9kcyArIDFVTCApICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHM7CisJCQl9CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljayBzbyBpdCBydW5zIGZyb20gcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRworCQkJYWdhaW4sIHRoZW4gc2V0IHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgYmFjayB0byBpdHMgc3RhbmRhcmQKKwkJCXZhbHVlLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOworCQkJdlRhc2tTdGVwVGljayggdWxDb21wbGV0ZVRpY2tQZXJpb2RzICk7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUw7CisKKwkJCS8qIEV4aXQgd2l0aCBpbnRlcnJwdHMgZW5hYmxlZC4gKi8KKwkJCV9fYXNtIHZvbGF0aWxlKCAiY3BzaWUgaSIgOjo6ICJtZW1vcnkiICk7CisJCX0KKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZXR1cCB0aGUgc3lzdGljayB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzIGF0IHRoZSByZXF1aXJlZAorICogZnJlcXVlbmN5LgorICovCitfX2F0dHJpYnV0ZV9fKCggd2VhayApKSB2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCit7CisJLyogQ2FsY3VsYXRlIHRoZSBjb25zdGFudHMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSB0aWNrIGludGVycnVwdC4gKi8KKwkjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXsKKwkJdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKTsKKwkJeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IHBvcnRNQVhfMjRfQklUX05VTUJFUiAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCQl1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUiAvICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnU1lTVElDS19DTE9DS19IWiApOworCX0KKwkjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworCS8qIFN0b3AgYW5kIGNsZWFyIHRoZSBTeXNUaWNrLiAqLworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAwVUw7CisJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCS8qIENvbmZpZ3VyZSBTeXNUaWNrIHRvIGludGVycnVwdCBhdCB0aGUgcmVxdWVzdGVkIHJhdGUuICovCisJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC0gMVVMOworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApCisJeworCXVpbnQzMl90IHVsQ3VycmVudEludGVycnVwdDsKKwl1aW50OF90IHVjQ3VycmVudFByaW9yaXR5OworCisJCS8qIE9idGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGludGVycnVwdC4gKi8KKwkJX19hc20gdm9sYXRpbGUoICJtcnMgJTAsIGlwc3IiIDogIj1yIiggdWxDdXJyZW50SW50ZXJydXB0ICkgOjogIm1lbW9yeSIgKTsKKworCQkvKiBJcyB0aGUgaW50ZXJydXB0IG51bWJlciBhIHVzZXIgZGVmaW5lZCBpbnRlcnJ1cHQ/ICovCisJCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPj0gcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApCisJCXsKKwkJCS8qIExvb2sgdXAgdGhlIGludGVycnVwdCdzIHByaW9yaXR5LiAqLworCQkJdWNDdXJyZW50UHJpb3JpdHkgPSBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzWyB1bEN1cnJlbnRJbnRlcnJ1cHQgXTsKKworCQkJLyogVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmIGEgc2VydmljZSByb3V0aW5lIChJU1IpIGZvcgorCQkJYW4gaW50ZXJydXB0IHRoYXQgaGFzIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhYm92ZQorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIGNhbGxzIGFuIElTUiBzYWZlIEZyZWVSVE9TIEFQSQorCQkJZnVuY3Rpb24uICBJU1Igc2FmZSBGcmVlUlRPUyBBUEkgZnVuY3Rpb25zIG11c3QgKm9ubHkqIGJlIGNhbGxlZAorCQkJZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgYmVsb3cKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJTnVtZXJpY2FsbHkgbG93IGludGVycnVwdCBwcmlvcml0eSBudW1iZXJzIHJlcHJlc2VudCBsb2dpY2FsbHkgaGlnaAorCQkJaW50ZXJydXB0IHByaW9yaXRpZXMsIHRoZXJlZm9yZSB0aGUgcHJpb3JpdHkgb2YgdGhlIGludGVycnVwdCBtdXN0CisJCQliZSBzZXQgdG8gYSB2YWx1ZSBlcXVhbCB0byBvciBudW1lcmljYWxseSAqaGlnaGVyKiB0aGFuCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCUludGVycnVwdHMgdGhhdAl1c2UgdGhlIEZyZWVSVE9TIEFQSSBtdXN0IG5vdCBiZSBsZWZ0IGF0IHRoZWlyCisJCQlkZWZhdWx0IHByaW9yaXR5IG9mCXplcm8gYXMgdGhhdCBpcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBwcmlvcml0eSwKKwkJCXdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLAorCQkJYW5kCXRoZXJlZm9yZSBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgaW52YWxpZC4KKworCQkJRnJlZVJUT1MgbWFpbnRhaW5zIHNlcGFyYXRlIHRocmVhZCBhbmQgSVNSIEFQSSBmdW5jdGlvbnMgdG8gZW5zdXJlCisJCQlpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCQlUaGUgZm9sbG93aW5nIGxpbmtzIHByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb246CisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9GQVFIZWxwLmh0bWwgKi8KKwkJCWNvbmZpZ0FTU0VSVCggdWNDdXJyZW50UHJpb3JpdHkgPj0gdWNNYXhTeXNDYWxsUHJpb3JpdHkgKTsKKwkJfQorCisJCS8qIFByaW9yaXR5IGdyb3VwaW5nOiAgVGhlIGludGVycnVwdCBjb250cm9sbGVyIChOVklDKSBhbGxvd3MgdGhlIGJpdHMKKwkJdGhhdCBkZWZpbmUgZWFjaCBpbnRlcnJ1cHQncyBwcmlvcml0eSB0byBiZSBzcGxpdCBiZXR3ZWVuIGJpdHMgdGhhdAorCQlkZWZpbmUgdGhlIGludGVycnVwdCdzIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMgYW5kIGJpdHMgdGhhdCBkZWZpbmUKKwkJdGhlIGludGVycnVwdCdzIHN1Yi1wcmlvcml0eS4gIEZvciBzaW1wbGljaXR5IGFsbCBiaXRzIG11c3QgYmUgZGVmaW5lZAorCQl0byBiZSBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzLiAgVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmCisJCXRoaXMgaXMgbm90IHRoZSBjYXNlIChpZiBzb21lIGJpdHMgcmVwcmVzZW50IGEgc3ViLXByaW9yaXR5KS4KKworCQlJZiB0aGUgYXBwbGljYXRpb24gb25seSB1c2VzIENNU0lTIGxpYnJhcmllcyBmb3IgaW50ZXJydXB0CisJCWNvbmZpZ3VyYXRpb24gdGhlbiB0aGUgY29ycmVjdCBzZXR0aW5nIGNhbiBiZSBhY2hpZXZlZCBvbiBhbGwgQ29ydGV4LU0KKwkJZGV2aWNlcyBieSBjYWxsaW5nIE5WSUNfU2V0UHJpb3JpdHlHcm91cGluZyggMCApOyBiZWZvcmUgc3RhcnRpbmcgdGhlCisJCXNjaGVkdWxlci4gIE5vdGUgaG93ZXZlciB0aGF0IHNvbWUgdmVuZG9yIHNwZWNpZmljIHBlcmlwaGVyYWwgbGlicmFyaWVzCisJCWFzc3VtZSBhIG5vbi16ZXJvIHByaW9yaXR5IGdyb3VwIHNldHRpbmcsIGluIHdoaWNoIGNhc2VzIHVzaW5nIGEgdmFsdWUKKwkJb2YgemVybyB3aWxsIHJlc3VsdCBpbiB1bnByZWRpY3RhYmxlIGJlaGF2aW91ci4gKi8KKwkJY29uZmlnQVNTRVJUKCAoIHBvcnRBSVJDUl9SRUcgJiBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSyApIDw9IHVsTWF4UFJJR1JPVVBWYWx1ZSApOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhNWQyNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMy9wb3J0bWFjcm8uaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKworI2lmbmRlZiBQT1JUTUFDUk9fSAorI2RlZmluZSBQT1JUTUFDUk9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnQgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgKgorICogVGhlIHNldHRpbmdzIGluIHRoaXMgZmlsZSBjb25maWd1cmUgRnJlZVJUT1MgY29ycmVjdGx5IGZvciB0aGUKKyAqIGdpdmVuIGhhcmR3YXJlIGFuZCBjb21waWxlci4KKyAqCisgKiBUaGVzZSBzZXR0aW5ncyBzaG91bGQgbm90IGJlIGFsdGVyZWQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogVHlwZSBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydENIQVIJCWNoYXIKKyNkZWZpbmUgcG9ydEZMT0FUCQlmbG9hdAorI2RlZmluZSBwb3J0RE9VQkxFCQlkb3VibGUKKyNkZWZpbmUgcG9ydExPTkcJCWxvbmcKKyNkZWZpbmUgcG9ydFNIT1JUCQlzaG9ydAorI2RlZmluZSBwb3J0U1RBQ0tfVFlQRQl1aW50MzJfdAorI2RlZmluZSBwb3J0QkFTRV9UWVBFCWxvbmcKKwordHlwZWRlZiBwb3J0U1RBQ0tfVFlQRSBTdGFja1R5cGVfdDsKK3R5cGVkZWYgbG9uZyBCYXNlVHlwZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVCYXNlVHlwZV90OworCisjaWYoIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMSApCisJdHlwZWRlZiB1aW50MTZfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmYKKyNlbHNlCisJdHlwZWRlZiB1aW50MzJfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmZmZmZmVUwKKworCS8qIDMyLWJpdCB0aWNrIHR5cGUgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyByZWFkcyBvZiB0aGUgdGljayBjb3VudCBkbworCW5vdCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQyAxCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWNzLiAqLworI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCTgKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTY2hlZHVsZXIgdXRpbGl0aWVzLiAqLworI2RlZmluZSBwb3J0WUlFTEQoKSAJCQkJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8JCQkJCQkJCVwKKwlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOwkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzIGNvbXBsZXRlbHkJXAorCXdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8JCQkJCQlcCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOwkJCQkJCQkJCQlcCisJX19hc20gdm9sYXRpbGUoICJpc2IiICk7CQkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVF9CSVQJCSggMVVMIDw8IDI4VUwgKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApIGlmKCB4U3dpdGNoUmVxdWlyZWQgIT0gcGRGQUxTRSApIHBvcnRZSUVMRCgpCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LiAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApOworI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCXVsUG9ydFJhaXNlQkFTRVBSSSgpCisjZGVmaW5lIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUih4KQl2UG9ydFNldEJBU0VQUkkoeCkKKyNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCXZQb3J0UmFpc2VCQVNFUFJJKCkKKyNkZWZpbmUgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCkJCQkJCXZQb3J0U2V0QkFTRVBSSSgwKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRhc2sgZnVuY3Rpb24gbWFjcm9zIGFzIGRlc2NyaWJlZCBvbiB0aGUgRnJlZVJUT1Mub3JnIFdFQiBzaXRlLiAgVGhlc2UgYXJlCitub3QgbmVjZXNzYXJ5IGZvciB0byB1c2UgdGhpcyBwb3J0LiAgVGhleSBhcmUgZGVmaW5lZCBzbyB0aGUgY29tbW9uIGRlbW8gZmlsZXMKKyh3aGljaCBidWlsZCB3aXRoIGFsbCB0aGUgcG9ydHMpIHdpbGwgYnVpbGQuICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaWNrbGVzcyBpZGxlL2xvdyBwb3dlciBmdW5jdGlvbmFsaXR5LiAqLworI2lmbmRlZiBwb3J0U1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQCisJZXh0ZXJuIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKTsKKwkjZGVmaW5lIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAoIHhFeHBlY3RlZElkbGVUaW1lICkgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIHhFeHBlY3RlZElkbGVUaW1lICkKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBvcHRpbWlzYXRpb25zLiAqLworI2lmbmRlZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04KKwkjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAxCisjZW5kaWYKKworI2lmIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiA9PSAxCisKKwkvKiBHZW5lcmljIGhlbHBlciBmdW5jdGlvbi4gKi8KKwlfX2F0dHJpYnV0ZV9fKCAoIGFsd2F5c19pbmxpbmUgKSApIHN0YXRpYyBpbmxpbmUgdWludDhfdCB1Y1BvcnRDb3VudExlYWRpbmdaZXJvcyggdWludDMyX3QgdWxCaXRtYXAgKQorCXsKKwl1aW50OF90IHVjUmV0dXJuOworCisJCV9fYXNtIHZvbGF0aWxlICggImNseiAlMCwgJTEiIDogIj1yIiAoIHVjUmV0dXJuICkgOiAiciIgKCB1bEJpdG1hcCApIDogIm1lbW9yeSIgKTsKKwkJcmV0dXJuIHVjUmV0dXJuOworCX0KKworCS8qIENoZWNrIHRoZSBjb25maWd1cmF0aW9uLiAqLworCSNpZiggY29uZmlnTUFYX1BSSU9SSVRJRVMgPiAzMiApCisJCSNlcnJvciBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gY2FuIG9ubHkgYmUgc2V0IHRvIDEgd2hlbiBjb25maWdNQVhfUFJJT1JJVElFUyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzIuICBJdCBpcyB2ZXJ5IHJhcmUgdGhhdCBhIHN5c3RlbSByZXF1aXJlcyBtb3JlIHRoYW4gMTAgdG8gMTUgZGlmZmVyZW5jZSBwcmlvcml0aWVzIGFzIHRhc2tzIHRoYXQgc2hhcmUgYSBwcmlvcml0eSB3aWxsIHRpbWUgc2xpY2UuCisJI2VuZGlmCisKKwkvKiBTdG9yZS9jbGVhciB0aGUgcmVhZHkgcHJpb3JpdGllcyBpbiBhIGJpdCBtYXAuICovCisJI2RlZmluZSBwb3J0UkVDT1JEX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSB8PSAoIDFVTCA8PCAoIHV4UHJpb3JpdHkgKSApCisJI2RlZmluZSBwb3J0UkVTRVRfUkVBRFlfUFJJT1JJVFkoIHV4UHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgKCB1eFJlYWR5UHJpb3JpdGllcyApICY9IH4oIDFVTCA8PCAoIHV4UHJpb3JpdHkgKSApCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCSNkZWZpbmUgcG9ydEdFVF9ISUdIRVNUX1BSSU9SSVRZKCB1eFRvcFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApIHV4VG9wUHJpb3JpdHkgPSAoIDMxVUwgLSAoIHVpbnQzMl90ICkgdWNQb3J0Q291bnRMZWFkaW5nWmVyb3MoICggdXhSZWFkeVByaW9yaXRpZXMgKSApICkKKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIGNvbmZpZ0FTU0VSVAorCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICk7CisJI2RlZmluZSBwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCkgCXZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSgpCisjZW5kaWYKKworLyogcG9ydE5PUCgpIGlzIG5vdCByZXF1aXJlZCBieSB0aGlzIHBvcnQuICovCisjZGVmaW5lIHBvcnROT1AoKQorCisjZGVmaW5lIHBvcnRJTkxJTkUJX19pbmxpbmUKKworI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCisJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FIGlubGluZSBfX2F0dHJpYnV0ZV9fKCggYWx3YXlzX2lubGluZSkpCisjZW5kaWYKKworcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgQmFzZVR5cGVfdCB4UG9ydElzSW5zaWRlSW50ZXJydXB0KCB2b2lkICkKK3sKK3VpbnQzMl90IHVsQ3VycmVudEludGVycnVwdDsKK0Jhc2VUeXBlX3QgeFJldHVybjsKKworCS8qIE9idGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGludGVycnVwdC4gKi8KKwlfX2FzbSB2b2xhdGlsZSggIm1ycyAlMCwgaXBzciIgOiAiPXIiKCB1bEN1cnJlbnRJbnRlcnJ1cHQgKSA6OiAibWVtb3J5IiApOworCisJaWYoIHVsQ3VycmVudEludGVycnVwdCA9PSAwICkKKwl7CisJCXhSZXR1cm4gPSBwZEZBTFNFOworCX0KKwllbHNlCisJeworCQl4UmV0dXJuID0gcGRUUlVFOworCX0KKworCXJldHVybiB4UmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgdm9pZCB2UG9ydFJhaXNlQkFTRVBSSSggdm9pZCApCit7Cit1aW50MzJfdCB1bE5ld0JBU0VQUkk7CisKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIgltb3YgJTAsICUxCQkJCQkJCQkJCQkJXG4iIFwKKwkJIgltc3IgYmFzZXByaSwgJTAJCQkJCQkJCQkJCVxuIiBcCisJCSIJaXNiCQkJCQkJCQkJCQkJCQlcbiIgXAorCQkiCWRzYgkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJOiI9ciIgKHVsTmV3QkFTRVBSSSkgOiAiaSIgKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA6ICJtZW1vcnkiCisJKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHVpbnQzMl90IHVsUG9ydFJhaXNlQkFTRVBSSSggdm9pZCApCit7Cit1aW50MzJfdCB1bE9yaWdpbmFsQkFTRVBSSSwgdWxOZXdCQVNFUFJJOworCisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbXJzICUwLCBiYXNlcHJpCQkJCQkJCQkJCQlcbiIgXAorCQkiCW1vdiAlMSwgJTIJCQkJCQkJCQkJCQlcbiIgXAorCQkiCW1zciBiYXNlcHJpLCAlMQkJCQkJCQkJCQkJXG4iIFwKKwkJIglpc2IJCQkJCQkJCQkJCQkJCVxuIiBcCisJCSIJZHNiCQkJCQkJCQkJCQkJCQlcbiIgXAorCQk6Ij1yIiAodWxPcmlnaW5hbEJBU0VQUkkpLCAiPXIiICh1bE5ld0JBU0VQUkkpIDogImkiICggY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZICkgOiAibWVtb3J5IgorCSk7CisKKwkvKiBUaGlzIHJldHVybiB3aWxsIG5vdCBiZSByZWFjaGVkIGJ1dCBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBjb21waWxlcgorCXdhcm5pbmdzLiAqLworCXJldHVybiB1bE9yaWdpbmFsQkFTRVBSSTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitwb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyB2b2lkIHZQb3J0U2V0QkFTRVBSSSggdWludDMyX3QgdWxOZXdNYXNrVmFsdWUgKQoreworCV9fYXNtIHZvbGF0aWxlCisJKAorCQkiCW1zciBiYXNlcHJpLCAlMAkiIDo6ICJyIiAoIHVsTmV3TWFza1ZhbHVlICkgOiAibWVtb3J5IgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogUE9SVE1BQ1JPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zX01QVS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTNfTVBVL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWNmYmZjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zX01QVS9wb3J0LmMKQEAgLTAsMCArMSw3NjMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiBwb3J0YWJsZS5oIGZvciB0aGUgQVJNIENNMyBwb3J0LgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiAgVGhhdCBzaG91bGQgb25seSBiZSBkb25lIHdoZW4KK3Rhc2suaCBpcyBpbmNsdWRlZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZpbGUuICovCisjZGVmaW5lIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKyNpZm5kZWYgY29uZmlnU1lTVElDS19DTE9DS19IWgorCSNkZWZpbmUgY29uZmlnU1lTVElDS19DTE9DS19IWiBjb25maWdDUFVfQ0xPQ0tfSFoKKwkvKiBFbnN1cmUgdGhlIFN5c1RpY2sgaXMgY2xvY2tlZCBhdCB0aGUgc2FtZSBmcmVxdWVuY3kgYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMSwkoIDFVTCA8PCAyVUwgKQorI2Vsc2UKKwkvKiBUaGUgd2F5IHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgaXMgbm90IG1vZGlmaWVkIGluIGNhc2UgaXQgaXMgbm90IHRoZSBzYW1lCisJYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMSwkoIDAgKQorI2VuZGlmCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgdGhlIE5WSUMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyX1JFRwkJCQkJKCAqCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMWMgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU19DVFJMX1NUQVRFX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDI0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19NRU1fRkFVTFRfRU5BQkxFCQkJCSggMVVMIDw8IDE2VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoZSBNUFUuICovCisjZGVmaW5lIHBvcnRNUFVfVFlQRV9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDkwICkgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5QyApICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkQTAgKSApCisjZGVmaW5lIHBvcnRNUFVfQ1RSTF9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk0ICkgKQorI2RlZmluZSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUJCQkJKCA4VUwgPDwgOFVMICkgLyogOCByZWdpb25zLCB1bmlmaWVkLiAqLworI2RlZmluZSBwb3J0TVBVX0VOQUJMRQkJCQkJCQkoIDB4MDFVTCApCisjZGVmaW5lIHBvcnRNUFVfQkFDS0dST1VORF9FTkFCTEUJCQkJKCAxVUwgPDwgMlVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfRVhFQ1VUSU9OX1NUQVJUX0FERFJFU1MJKCAwVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9WQUxJRAkJCQkJKCAweDEwVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FTkFCTEUJCQkJCSggMHgwMVVMICkKKyNkZWZpbmUgcG9ydFBFUklQSEVSQUxTX1NUQVJUX0FERFJFU1MJCQkweDQwMDAwMDAwVUwKKyNkZWZpbmUgcG9ydFBFUklQSEVSQUxTX0VORF9BRERSRVNTCQkJCTB4NUZGRkZGRkZVTAorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoZSBTeXNUaWNrLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0lOVAkJCQkJKCAweDAwMDAwMDAyVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRQkJCQkJKCAweDAwMDAwMDAxVUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZfUFJJCQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1ZDX1BSSQkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIC0gMVVMICkgPDwgMjRVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suICovCisjZGVmaW5lIHBvcnRJTklUSUFMX1hQU1IJCQkJCQkoIDB4MDEwMDAwMDAgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRAkJKCAweDAzICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9QUklWSUxFR0VECQkoIDB4MDIgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFuIGludGVycnVwdCBwcmlvcml0eS4gKi8KKyNkZWZpbmUgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUgkJKCAxNiApCisjZGVmaW5lIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgCSggMHhFMDAwRTNGMCApCisjZGVmaW5lIHBvcnRBSVJDUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBFRDBDICkgKQorI2RlZmluZSBwb3J0TUFYXzhfQklUX1ZBTFVFCQkJCQkoICggdWludDhfdCApIDB4ZmYgKQorI2RlZmluZSBwb3J0VE9QX0JJVF9PRl9CWVRFCQkJCQkoICggdWludDhfdCApIDB4ODAgKQorI2RlZmluZSBwb3J0TUFYX1BSSUdST1VQX0JJVFMJCQkJKCAoIHVpbnQ4X3QgKSA3ICkKKyNkZWZpbmUgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sJCQkJKCAweDA3VUwgPDwgOFVMICkKKyNkZWZpbmUgcG9ydFBSSUdST1VQX1NISUZUCQkJCQkoIDhVTCApCisKKy8qIE9mZnNldHMgaW4gdGhlIHN0YWNrIHRvIHRoZSBwYXJhbWV0ZXJzIHdoZW4gaW5zaWRlIHRoZSBTVkMgaGFuZGxlci4gKi8KKyNkZWZpbmUgcG9ydE9GRlNFVF9UT19QQwkJCQkJCSggNiApCisKKy8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCitoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KKyNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKgorICogQ29uZmlndXJlIGEgbnVtYmVyIG9mIHN0YW5kYXJkIE1QVSByZWdpb25zIHRoYXQgYXJlIHVzZWQgYnkgYWxsIHRhc2tzLgorICovCitzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBSZXR1cm4gdGhlIHNtYWxsZXN0IE1QVSByZWdpb24gc2l6ZSB0aGF0IGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIHdpbGwgZml0CisgKiBpbnRvLiAgVGhlIHJlZ2lvbiBzaXplIGlzIHJldHVybmVkIGFzIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBwcm9ncmFtbWVkCisgKiBpbnRvIHRoZSByZWdpb24gYXR0cmlidXRlIHJlZ2lzdGVyIGZvciB0aGF0IHJlZ2lvbi4KKyAqLworc3RhdGljIHVpbnQzMl90IHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1aW50MzJfdCB1bEFjdHVhbFNpemVJbkJ5dGVzICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIENoZWNrcyB0byBzZWUgaWYgYmVpbmcgY2FsbGVkIGZyb20gdGhlIGNvbnRleHQgb2YgYW4gdW5wcml2aWxlZ2VkIHRhc2ssIGFuZAorICogaWYgc28gcmFpc2VzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYW5kIHJldHVybnMgZmFsc2UgLSBvdGhlcndpc2UgZG9lcyBub3RoaW5nCisgKiBvdGhlciB0aGFuIHJldHVybiB0cnVlLgorICovCitCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSk7CisKKy8qCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzCisgKiBmaWxlIGlzIHdlYWsgdG8gYWxsb3cgYXBwbGljYXRpb24gd3JpdGVycyB0byBjaGFuZ2UgdGhlIHRpbWVyIHVzZWQgdG8KKyAqIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdC4KKyAqLwordm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKTsKKworLyoKKyAqIFN0YW5kYXJkIEZyZWVSVE9TIGV4Y2VwdGlvbiBoYW5kbGVycy4KKyAqLwordm9pZCB4UG9ydFBlbmRTVkhhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047Cit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKSAgX19hdHRyaWJ1dGVfXyAoKG9wdGltaXplKCIzIikpKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBTdGFydHMgdGhlIHNjaGVkdWxlciBieSByZXN0b3JpbmcgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgdG8gcnVuLgorICovCitzdGF0aWMgdm9pZCBwcnZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBDIHBvcnRpb24gb2YgdGhlIFNWQyBoYW5kbGVyLiAgVGhlIFNWQyBoYW5kbGVyIGlzIHNwbGl0IGJldHdlZW4gYW4gYXNtIGVudHJ5CisgKiBhbmQgYSBDIHdyYXBwZXIgZm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nIGFuZCBtYWludGVuYW5jZS4KKyAqLworc3RhdGljIHZvaWQgcHJ2U1ZDSGFuZGxlciggdWludDMyX3QgKnB1bFJlZ2lzdGVycyApIF9fYXR0cmlidXRlX18oKCBub2lubGluZSApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKK3ZhcmlhYmxlLiAgTm90ZSB0aGlzIGlzIG5vdCBzYXZlZCBhcyBwYXJ0IG9mIHRoZSB0YXNrIGNvbnRleHQgYXMgY29udGV4dAorc3dpdGNoZXMgY2FuIG9ubHkgb2NjdXIgd2hlbiB1eENyaXRpY2FsTmVzdGluZyBpcyB6ZXJvLiAqLworc3RhdGljIFVCYXNlVHlwZV90IHV4Q3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYTsKKworLyoKKyAqIFVzZWQgYnkgdGhlIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSBtYWNybyB0byBlbnN1cmUKKyAqIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgYXJlIG5vdCBjYWxsZWQgZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkCisgKiBhIHByaW9yaXR5IGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKyAqLworI2lmICggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJIHN0YXRpYyB1aW50OF90IHVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gMDsKKwkgc3RhdGljIHVpbnQzMl90IHVsTWF4UFJJR1JPVVBWYWx1ZSA9IDA7CisJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggY29uc3Qgdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0ICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK1N0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzLCBCYXNlVHlwZV90IHhSdW5Qcml2aWxlZ2VkICkKK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJaW50ZXJydXB0LiAqLworCXB4VG9wT2ZTdGFjay0tOyAvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQgb2YgaW50ZXJydXB0cy4gKi8KKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJLyogeFBTUiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoICggU3RhY2tUeXBlX3QgKSBweENvZGUgKSAmIHBvcnRTVEFSVF9BRERSRVNTX01BU0s7CS8qIFBDICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9IDA7CS8qIExSICovCisJcHhUb3BPZlN0YWNrIC09IDU7CS8qIFIxMiwgUjMsIFIyIGFuZCBSMS4gKi8KKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJLyogUjAgKi8KKwlweFRvcE9mU3RhY2sgLT0gOTsJLyogUjExLCBSMTAsIFI5LCBSOCwgUjcsIFI2LCBSNSBhbmQgUjQuICovCisKKwlpZiggeFJ1blByaXZpbGVnZWQgPT0gcGRUUlVFICkKKwl7CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1BSSVZJTEVHRUQ7CisJfQorCWVsc2UKKwl7CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRDsKKwl9CisKKwlyZXR1cm4gcHhUb3BPZlN0YWNrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRTVkNIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBBc3N1bWVzIHBzcCB3YXMgaW4gdXNlLiAqLworCV9fYXNtIHZvbGF0aWxlCisJKAorCQkjaWZuZGVmIFVTRV9QUk9DRVNTX1NUQUNLCS8qIENvZGUgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBpZiBhIG1haW4oKSBpcyB1c2luZyB0aGUgcHJvY2VzcyBzdGFjay4gKi8KKwkJCSIJdHN0IGxyLCAjNAkJCQkJCVxuIgorCQkJIglpdGUgZXEJCQkJCQkJXG4iCisJCQkiCW1yc2VxIHIwLCBtc3AJCQkJCVxuIgorCQkJIgltcnNuZSByMCwgcHNwCQkJCQlcbiIKKwkJI2Vsc2UKKwkJCSIJbXJzIHIwLCBwc3AJCQkJCQlcbiIKKwkJI2VuZGlmCisJCQkiCWIgJTAJCQkJCQkJXG4iCisJCQk6OiJpIihwcnZTVkNIYW5kbGVyKToicjAiLCAibWVtb3J5IgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2U1ZDSGFuZGxlcigJdWludDMyX3QgKnB1bFBhcmFtICkKK3sKK3VpbnQ4X3QgdWNTVkNOdW1iZXI7CisKKwkvKiBUaGUgc3RhY2sgY29udGFpbnM6IHIwLCByMSwgcjIsIHIzLCByMTIsIHIxNCwgdGhlIHJldHVybiBhZGRyZXNzIGFuZAorCXhQU1IuICBUaGUgZmlyc3QgYXJndW1lbnQgKHIwKSBpcyBwdWxQYXJhbVsgMCBdLiAqLworCXVjU1ZDTnVtYmVyID0gKCAoIHVpbnQ4X3QgKiApIHB1bFBhcmFtWyBwb3J0T0ZGU0VUX1RPX1BDIF0gKVsgLTIgXTsKKwlzd2l0Y2goIHVjU1ZDTnVtYmVyICkKKwl7CisJCWNhc2UgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIJOglwb3J0TlZJQ19TWVNQUkkxX1JFRyB8PSBwb3J0TlZJQ19TVkNfUFJJOworCQkJCQkJCQkJCQlwcnZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCk7CisJCQkJCQkJCQkJCWJyZWFrOworCisJCWNhc2UgcG9ydFNWQ19ZSUVMRAkJCQk6CXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCQkJCQkJCQkJCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQKKwkJCQkJCQkJCQkJYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CisJCQkJCQkJCQkJCXdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlCisJCQkJCQkJCQkJCWFyY2hpdGVjdHVyZS4gKi8KKwkJCQkJCQkJCQkJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCQkJCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKKworCQkJCQkJCQkJCQlicmVhazsKKworCQljYXNlIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCToJX19hc20gdm9sYXRpbGUKKwkJCQkJCQkJCQkJKAorCQkJCQkJCQkJCQkJIgltcnMgcjEsIGNvbnRyb2wJCVxuIiAvKiBPYnRhaW4gY3VycmVudCBjb250cm9sIHZhbHVlLiAqLworCQkJCQkJCQkJCQkJIgliaWMgcjEsICMxCQkJXG4iIC8qIFNldCBwcml2aWxlZ2UgYml0LiAqLworCQkJCQkJCQkJCQkJIgltc3IgY29udHJvbCwgcjEJCVxuIiAvKiBXcml0ZSBiYWNrIG5ldyBjb250cm9sIHZhbHVlLiAqLworCQkJCQkJCQkJCQkJOjo6ICJyMSIsICJtZW1vcnkiCisJCQkJCQkJCQkJCSk7CisJCQkJCQkJCQkJCWJyZWFrOworCisJCWRlZmF1bHQJCQkJCQkJOgkvKiBVbmtub3duIFNWQyBjYWxsLiAqLworCQkJCQkJCQkJCQlicmVhazsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzayggdm9pZCApCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbGRyIHIwLCA9MHhFMDAwRUQwOAkJCQlcbiIgLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCQkiCWxkciByMCwgW3IwXQkJCQkJXG4iCisJCSIJbGRyIHIwLCBbcjBdCQkJCQlcbiIKKwkJIgltc3IgbXNwLCByMAkJCQkJCVxuIiAvKiBTZXQgdGhlIG1zcCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJCSIJbGRyCXIzLCBweEN1cnJlbnRUQ0JDb25zdDIJCVxuIiAvKiBSZXN0b3JlIHRoZSBjb250ZXh0LiAqLworCQkiCWxkciByMSwgW3IzXQkJCQkJXG4iCisJCSIJbGRyIHIwLCBbcjFdCQkJCQlcbiIgLyogVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJCSIJYWRkIHIxLCByMSwgIzQJCQkJCVxuIiAvKiBNb3ZlIG9udG8gdGhlIHNlY29uZCBpdGVtIGluIHRoZSBUQ0IuLi4gKi8KKwkJIglsZHIgcjIsID0weGUwMDBlZDljCQkJCVxuIiAvKiBSZWdpb24gQmFzZSBBZGRyZXNzIHJlZ2lzdGVyLiAqLworCQkiCWxkbWlhIHIxISwge3I0LXIxMX0JCQkJXG4iIC8qIFJlYWQgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJCSIJc3RtaWEgcjIhLCB7cjQtcjExfQkJCQlcbiIgLyogV3JpdGUgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJCSIJbGRtaWEgcjAhLCB7cjMsIHI0LXIxMX0JCQlcbiIgLyogUG9wIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgc2F2ZWQgb24gZXhjZXB0aW9uIGVudHJ5LiAqLworCQkiCW1zciBjb250cm9sLCByMwkJCQkJXG4iCisJCSIJbXNyIHBzcCwgcjAJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgdGFzayBzdGFjayBwb2ludGVyLiAqLworCQkiCW1vdiByMCwgIzAJCQkJCQlcbiIKKwkJIgltc3IJYmFzZXByaSwgcjAJCQkJCVxuIgorCQkiCWxkciByMTQsID0weGZmZmZmZmZkCQkJXG4iIC8qIExvYWQgZXhlYyByZXR1cm4gY29kZS4gKi8KKwkJIglieCByMTQJCQkJCQkJXG4iCisJCSIJCQkJCQkJCQlcbiIKKwkJIgkuYWxpZ24gNAkJCQkJCVxuIgorCQkicHhDdXJyZW50VENCQ29uc3QyOiAud29yZCBweEN1cnJlbnRUQ0IJXG4iCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgbXVzdCBub3QgYmUgc2V0IHRvIDAuICBTZWUKKwlodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCisJY29uZmlnQVNTRVJUKCAoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApICk7CisKKwkjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCXsKKwkJdm9sYXRpbGUgdWludDMyX3QgdWxPcmlnaW5hbFByaW9yaXR5OworCQl2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9ICggdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0ICkgKCBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2ICsgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApOworCQl2b2xhdGlsZSB1aW50OF90IHVjTWF4UHJpb3JpdHlWYWx1ZTsKKworCQkvKiBEZXRlcm1pbmUgdGhlIG1heGltdW0gcHJpb3JpdHkgZnJvbSB3aGljaCBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQuICBJU1Igc2FmZSBmdW5jdGlvbnMgYXJlIHRob3NlIHRoYXQgZW5kIGluCisJCSJGcm9tSVNSIi4gIEZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvCisJCWVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCVNhdmUgdGhlIGludGVycnVwdCBwcmlvcml0eSB2YWx1ZSB0aGF0IGlzIGFib3V0IHRvIGJlIGNsb2JiZXJlZC4gKi8KKwkJdWxPcmlnaW5hbFByaW9yaXR5ID0gKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXI7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhdmFpbGFibGUuICBGaXJzdCB3cml0ZSB0byBhbGwKKwkJcG9zc2libGUgYml0cy4gKi8KKwkJKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSBwb3J0TUFYXzhfQklUX1ZBTFVFOworCisJCS8qIFJlYWQgdGhlIHZhbHVlIGJhY2sgdG8gc2VlIGhvdyBtYW55IGJpdHMgc3R1Y2suICovCisJCXVjTWF4UHJpb3JpdHlWYWx1ZSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIFVzZSB0aGUgc2FtZSBtYXNrIG9uIHRoZSBtYXhpbXVtIHN5c3RlbSBjYWxsIHByaW9yaXR5LiAqLworCQl1Y01heFN5c0NhbGxQcmlvcml0eSA9IGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSAmIHVjTWF4UHJpb3JpdHlWYWx1ZTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBwcmlvcml0eSBncm91cCB2YWx1ZSBmb3IgdGhlIG51bWJlcgorCQlvZiBiaXRzIHJlYWQgYmFjay4gKi8KKwkJdWxNYXhQUklHUk9VUFZhbHVlID0gcG9ydE1BWF9QUklHUk9VUF9CSVRTOworCQl3aGlsZSggKCB1Y01heFByaW9yaXR5VmFsdWUgJiBwb3J0VE9QX0JJVF9PRl9CWVRFICkgPT0gcG9ydFRPUF9CSVRfT0ZfQllURSApCisJCXsKKwkJCXVsTWF4UFJJR1JPVVBWYWx1ZS0tOworCQkJdWNNYXhQcmlvcml0eVZhbHVlIDw8PSAoIHVpbnQ4X3QgKSAweDAxOworCQl9CisKKwkJI2lmZGVmIF9fTlZJQ19QUklPX0JJVFMKKwkJeworCQkJLyogQ2hlY2sgdGhlIENNU0lTIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSBudW1iZXIgb2YKKwkJCXByaW9yaXR5IGJpdHMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYWN0dWFsbHkgcXVlcmllZAorCQkJZnJvbSB0aGUgaGFyZHdhcmUuICovCisJCQljb25maWdBU1NFUlQoICggcG9ydE1BWF9QUklHUk9VUF9CSVRTIC0gdWxNYXhQUklHUk9VUFZhbHVlICkgPT0gX19OVklDX1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCSNpZmRlZiBjb25maWdQUklPX0JJVFMKKwkJeworCQkJLyogQ2hlY2sgdGhlIEZyZWVSVE9TIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSBudW1iZXIgb2YKKwkJCXByaW9yaXR5IGJpdHMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYWN0dWFsbHkgcXVlcmllZAorCQkJZnJvbSB0aGUgaGFyZHdhcmUuICovCisJCQljb25maWdBU1NFUlQoICggcG9ydE1BWF9QUklHUk9VUF9CSVRTIC0gdWxNYXhQUklHUk9VUFZhbHVlICkgPT0gY29uZmlnUFJJT19CSVRTICk7CisJCX0KKwkJI2VuZGlmCisKKwkJLyogU2hpZnQgdGhlIHByaW9yaXR5IGdyb3VwIHZhbHVlIGJhY2sgdG8gaXRzIHBvc2l0aW9uIHdpdGhpbiB0aGUgQUlSQ1IKKwkJcmVnaXN0ZXIuICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA8PD0gcG9ydFBSSUdST1VQX1NISUZUOworCQl1bE1heFBSSUdST1VQVmFsdWUgJj0gcG9ydFBSSU9SSVRZX0dST1VQX01BU0s7CisKKwkJLyogUmVzdG9yZSB0aGUgY2xvYmJlcmVkIGludGVycnVwdCBwcmlvcml0eSByZWdpc3RlciB0byBpdHMgb3JpZ2luYWwKKwkJdmFsdWUuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gdWxPcmlnaW5hbFByaW9yaXR5OworCX0KKwkjZW5kaWYgLyogY29uaWZnQVNTRVJUX0RFRklORUQgKi8KKworCS8qIE1ha2UgUGVuZFNWIGFuZCBTeXNUaWNrIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBrZXJuZWwsIGFuZCB0aGUgU1ZDCisJaGFuZGxlciBoaWdoZXIgcHJpb3JpdHkgc28gaXQgY2FuIGJlIHVzZWQgdG8gZXhpdCBhIGNyaXRpY2FsIHNlY3Rpb24gKHdoZXJlCisJbG93ZXIgcHJpb3JpdGllcyBhcmUgbWFza2VkKS4gKi8KKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOworCXBvcnROVklDX1NZU1BSSTJfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfUFJJOworCisJLyogQ29uZmlndXJlIHRoZSByZWdpb25zIGluIHRoZSBNUFUgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCB0YXNrcy4gKi8KKwlwcnZTZXR1cE1QVSgpOworCisJLyogU3RhcnQgdGhlIHRpbWVyIHRoYXQgZ2VuZXJhdGVzIHRoZSB0aWNrIElTUi4gIEludGVycnVwdHMgYXJlIGRpc2FibGVkCisJaGVyZSBhbHJlYWR5LiAqLworCXZQb3J0U2V0dXBUaW1lckludGVycnVwdCgpOworCisJLyogSW5pdGlhbGlzZSB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCByZWFkeSBmb3IgdGhlIGZpcnN0IHRhc2suICovCisJdXhDcml0aWNhbE5lc3RpbmcgPSAwOworCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJX19hc20gdm9sYXRpbGUoCisJCQkJCSIgbGRyIHIwLCA9MHhFMDAwRUQwOCAJXG4iIC8qIFVzZSB0aGUgTlZJQyBvZmZzZXQgcmVnaXN0ZXIgdG8gbG9jYXRlIHRoZSBzdGFjay4gKi8KKwkJCQkJIiBsZHIgcjAsIFtyMF0gCQkJXG4iCisJCQkJCSIgbGRyIHIwLCBbcjBdIAkJCVxuIgorCQkJCQkiIG1zciBtc3AsIHIwCQkJXG4iIC8qIFNldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwkJCQkJIiBjcHNpZSBpCQkJCVxuIiAvKiBHbG9iYWxseSBlbmFibGUgaW50ZXJydXB0cy4gKi8KKwkJCQkJIiBjcHNpZSBmCQkJCVxuIgorCQkJCQkiIGRzYgkJCQkJXG4iCisJCQkJCSIgaXNiCQkJCQlcbiIKKwkJCQkJIiBzdmMgJTAJCQkJXG4iIC8qIFN5c3RlbSBjYWxsIHRvIHN0YXJ0IGZpcnN0IHRhc2suICovCisJCQkJCSIgbm9wCQkJCQlcbiIKKwkJCQkJOjogImkiIChwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUikgOiAibWVtb3J5IiApOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSEgKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXV4Q3JpdGljYWxOZXN0aW5nKys7CisKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyApOworCXV4Q3JpdGljYWxOZXN0aW5nLS07CisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDAgKQorCXsKKwkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisJfQorCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBUaGlzIGlzIGEgbmFrZWQgZnVuY3Rpb24uICovCisKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIgltcnMgcjAsIHBzcAkJCQkJCQlcbiIKKwkJIgkJCQkJCQkJCQlcbiIKKwkJIglsZHIJcjMsIHB4Q3VycmVudFRDQkNvbnN0CQkJXG4iIC8qIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgVENCLiAqLworCQkiCWxkcglyMiwgW3IzXQkJCQkJCVxuIgorCQkiCQkJCQkJCQkJCVxuIgorCQkiCW1ycyByMSwgY29udHJvbAkJCQkJCVxuIgorCQkiCXN0bWRiIHIwISwge3IxLCByNC1yMTF9CQkJCVxuIiAvKiBTYXZlIHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzLiAqLworCQkiCXN0ciByMCwgW3IyXQkJCQkJCVxuIiAvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGludG8gdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgVENCLiAqLworCQkiCQkJCQkJCQkJCVxuIgorCQkiCXN0bWRiIHNwISwge3IzLCByMTR9CQkJCVxuIgorCQkiCW1vdiByMCwgJTAJCQkJCQkJXG4iCisJCSIJbXNyIGJhc2VwcmksIHIwCQkJCQkJXG4iCisJCSIJZHNiCQkJCQkJCQkJXG4iCisJCSIJaXNiCQkJCQkJCQkJXG4iCisJCSIJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CQkJCVxuIgorCQkiCW1vdiByMCwgIzAJCQkJCQkJXG4iCisJCSIJbXNyIGJhc2VwcmksIHIwCQkJCQkJXG4iCisJCSIJbGRtaWEgc3AhLCB7cjMsIHIxNH0JCQkJXG4iCisJCSIJCQkJCQkJCQkJXG4iCS8qIFJlc3RvcmUgdGhlIGNvbnRleHQuICovCisJCSIJbGRyIHIxLCBbcjNdCQkJCQkJXG4iCisJCSIJbGRyIHIwLCBbcjFdCQkJCQkJXG4iIC8qIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCQkiCWFkZCByMSwgcjEsICM0CQkJCQkJXG4iIC8qIE1vdmUgb250byB0aGUgc2Vjb25kIGl0ZW0gaW4gdGhlIFRDQi4uLiAqLworCQkiCWxkciByMiwgPTB4ZTAwMGVkOWMJCQkJCVxuIiAvKiBSZWdpb24gQmFzZSBBZGRyZXNzIHJlZ2lzdGVyLiAqLworCQkiCWxkbWlhIHIxISwge3I0LXIxMX0JCQkJCVxuIiAvKiBSZWFkIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCQkiCXN0bWlhIHIyISwge3I0LXIxMX0JCQkJCVxuIiAvKiBXcml0ZSA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwkJIglsZG1pYSByMCEsIHtyMywgcjQtcjExfQkJCQlcbiIgLyogUG9wIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgc2F2ZWQgb24gZXhjZXB0aW9uIGVudHJ5LiAqLworCQkiCW1zciBjb250cm9sLCByMwkJCQkJCVxuIgorCQkiCQkJCQkJCQkJCVxuIgorCQkiCW1zciBwc3AsIHIwCQkJCQkJCVxuIgorCQkiCWJ4IHIxNAkJCQkJCQkJXG4iCisJCSIJCQkJCQkJCQkJXG4iCisJCSIJLmFsaWduIDQJCQkJCQkJXG4iCisJCSJweEN1cnJlbnRUQ0JDb25zdDogLndvcmQgcHhDdXJyZW50VENCCVxuIgorCQk6OiJpIihjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkpCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKQorewordWludDMyX3QgdWxEdW1teTsKKworCXVsRHVtbXkgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBQZW5kIGEgY29udGV4dCBzd2l0Y2guICovCisJCQlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQl9CisJfQorCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdWxEdW1teSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZXR1cCB0aGUgc3lzdGljayB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzIGF0IHRoZSByZXF1aXJlZAorICogZnJlcXVlbmN5LgorICovCitfX2F0dHJpYnV0ZV9fKCggd2VhayApKSB2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCit7CisJLyogU3RvcCBhbmQgY2xlYXIgdGhlIFN5c1RpY2suICovCisJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9IDBVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCisJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9ICggcG9ydE5WSUNfU1lTVElDS19DTEsgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2U2V0dXBNUFUoIHZvaWQgKQoreworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX19bXTsKK2V4dGVybiB1aW50MzJfdCBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfX1tdOworZXh0ZXJuIHVpbnQzMl90IF9fRkxBU0hfc2VnbWVudF9lbmRfX1tdOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X19bXTsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfX1tdOworCisJLyogQ2hlY2sgdGhlIGV4cGVjdGVkIE1QVSBpcyBwcmVzZW50LiAqLworCWlmKCBwb3J0TVBVX1RZUEVfUkVHID09IHBvcnRFWFBFQ1RFRF9NUFVfVFlQRV9WQUxVRSApCisJeworCQkvKiBGaXJzdCBzZXR1cCB0aGUgZW50aXJlIGZsYXNoIGZvciB1bnByaXZpbGVnZWQgcmVhZCBvbmx5IGFjY2Vzcy4gKi8KKwkJcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRyA9CSggKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9zdGFydF9fICkgfCAvKiBCYXNlIGFkZHJlc3MuICovCisJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkJCQkJCSggcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT04gKTsKKworCQlwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHID0JKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQkJCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X2VuZF9fIC0gKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9zdGFydF9fICkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBTZXR1cCB0aGUgZmlyc3QgMTZLIGZvciBwcml2aWxlZ2VkIG9ubHkgYWNjZXNzIChldmVuIHRob3VnaCBsZXNzCisJCXRoYW4gMTBLIGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQpLiAgVGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGNvZGUgaXMKKwkJcGxhY2VkLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT04gKTsKKworCQlwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHID0JKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCQkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fIC0gKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9zdGFydF9fICkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBTZXR1cCB0aGUgcHJpdmlsZWdlZCBkYXRhIFJBTSByZWdpb24uICBUaGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgZGF0YQorCQlpcyBwbGFjZWQuICovCisJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fICkgfCAvKiBCYXNlIGFkZHJlc3MuICovCisJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkJCQkJCSggcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCQkJCQkJCXBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2RhdGFfZW5kX18gLSAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXyApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIEJ5IGRlZmF1bHQgYWxsb3cgZXZlcnl0aGluZyB0byBhY2Nlc3MgdGhlIGdlbmVyYWwgcGVyaXBoZXJhbHMuICBUaGUKKwkJc3lzdGVtIHBlcmlwaGVyYWxzIGFuZCByZWdpc3RlcnMgYXJlIHByb3RlY3RlZC4gKi8KKwkJcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRyA9CSggcG9ydFBFUklQSEVSQUxTX1NUQVJUX0FERFJFU1MgKSB8CisJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkJCQkJCSggcG9ydEdFTkVSQUxfUEVSSVBIRVJBTFNfUkVHSU9OICk7CisKKwkJcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRyA9CSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSB8IHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKSB8CisJCQkJCQkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggcG9ydFBFUklQSEVSQUxTX0VORF9BRERSRVNTIC0gcG9ydFBFUklQSEVSQUxTX1NUQVJUX0FERFJFU1MgKSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIEVuYWJsZSB0aGUgbWVtb3J5IGZhdWx0IGV4Y2VwdGlvbi4gKi8KKwkJcG9ydE5WSUNfU1lTX0NUUkxfU1RBVEVfUkVHIHw9IHBvcnROVklDX01FTV9GQVVMVF9FTkFCTEU7CisKKwkJLyogRW5hYmxlIHRoZSBNUFUgd2l0aCB0aGUgYmFja2dyb3VuZCByZWdpb24gY29uZmlndXJlZC4gKi8KKwkJcG9ydE1QVV9DVFJMX1JFRyB8PSAoIHBvcnRNUFVfRU5BQkxFIHwgcG9ydE1QVV9CQUNLR1JPVU5EX0VOQUJMRSApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKQorewordWludDMyX3QgdWxSZWdpb25TaXplLCB1bFJldHVyblZhbHVlID0gNDsKKworCS8qIDMyIGlzIHRoZSBzbWFsbGVzdCByZWdpb24gc2l6ZSwgMzEgaXMgdGhlIGxhcmdlc3QgdmFsaWQgdmFsdWUgZm9yCisJdWxSZXR1cm5WYWx1ZS4gKi8KKwlmb3IoIHVsUmVnaW9uU2l6ZSA9IDMyVUw7IHVsUmV0dXJuVmFsdWUgPCAzMVVMOyAoIHVsUmVnaW9uU2l6ZSA8PD0gMVVMICkgKQorCXsKKwkJaWYoIHVsQWN0dWFsU2l6ZUluQnl0ZXMgPD0gdWxSZWdpb25TaXplICkKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJZWxzZQorCQl7CisJCQl1bFJldHVyblZhbHVlKys7CisJCX0KKwl9CisKKwkvKiBTaGlmdCB0aGUgY29kZSBieSBvbmUgYmVmb3JlIHJldHVybmluZyBzbyBpdCBjYW4gYmUgd3JpdHRlbiBkaXJlY3RseQorCWludG8gdGhlIHRoZSBjb3JyZWN0IGJpdCBwb3NpdGlvbiBvZiB0aGUgYXR0cmlidXRlIHJlZ2lzdGVyLiAqLworCXJldHVybiAoIHVsUmV0dXJuVmFsdWUgPDwgMVVMICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4UG9ydFJhaXNlUHJpdmlsZWdlKCB2b2lkICkKK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIgltcnMgcjAsIGNvbnRyb2wJCQkJCQlcbiIKKwkJIgl0c3QgcjAsICMxCQkJCQkJCVxuIiAvKiBJcyB0aGUgdGFzayBydW5uaW5nIHByaXZpbGVnZWQ/ICovCisJCSIJaXR0ZSBuZQkJCQkJCQkJXG4iCisJCSIJbW92bmUgcjAsICMwCQkJCQkJXG4iIC8qIENPTlRST0xbMF0hPTAsIHJldHVybiBmYWxzZS4gKi8KKwkJIglzdmNuZSAlMAkJCQkJCQlcbiIgLyogU3dpdGNoIHRvIHByaXZpbGVnZWQuICovCisJCSIJbW92ZXEgcjAsICMxCQkJCQkJXG4iIC8qIENPTlRST0xbMF09PTAsIHJldHVybiB0cnVlLiAqLworCQkiCWJ4IGxyCQkJCQkJCQlcbiIKKwkJOjogImkiIChwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRSkgOiAicjAiLCAibWVtb3J5IgorCSk7CisKKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0U3RvcmVUYXNrTVBVU2V0dGluZ3MoIHhNUFVfU0VUVElOR1MgKnhNUFVTZXR0aW5ncywgY29uc3Qgc3RydWN0IHhNRU1PUllfUkVHSU9OICogY29uc3QgeFJlZ2lvbnMsIFN0YWNrVHlwZV90ICpweEJvdHRvbU9mU3RhY2ssIHVpbnQzMl90IHVsU3RhY2tEZXB0aCApCit7CitleHRlcm4gdWludDMyX3QgX19TUkFNX3NlZ21lbnRfc3RhcnRfX1tdOworZXh0ZXJuIHVpbnQzMl90IF9fU1JBTV9zZWdtZW50X2VuZF9fW107CitleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfX1tdOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fW107CitpbnQzMl90IGxJbmRleDsKK3VpbnQzMl90IHVsOworCisJaWYoIHhSZWdpb25zID09IE5VTEwgKQorCXsKKwkJLyogTm8gTVBVIHJlZ2lvbnMgYXJlIHNwZWNpZmllZCBzbyBhbGxvdyBhY2Nlc3MgdG8gYWxsIFJBTS4gKi8KKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJKCAoIHVpbnQzMl90ICkgX19TUkFNX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJKCBwb3J0U1RBQ0tfUkVHSU9OICk7CisKKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApIHwKKwkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX1NSQU1fc2VnbWVudF9lbmRfXyAtICggdWludDMyX3QgKSBfX1NSQU1fc2VnbWVudF9zdGFydF9fICkgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBSZS1pbnN0YXRlIHRoZSBwcml2aWxlZ2VkIG9ubHkgUkFNIHJlZ2lvbiBhcyB4UmVnaW9uWyAwIF0gd2lsbCBoYXZlCisJCWp1c3QgcmVtb3ZlZCB0aGUgcHJpdmlsZWdlZCBvbmx5IHBhcmFtZXRlcnMuICovCisJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMSBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPQorCQkJCSggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCSggcG9ydFNUQUNLX1JFR0lPTiArIDEgKTsKKworCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDEgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQlwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fIC0gKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBJbnZhbGlkYXRlIGFsbCBvdGhlciByZWdpb25zLiAqLworCQlmb3IoIHVsID0gMjsgdWwgPD0gcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUzsgdWwrKyApCisJCXsKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0gKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKSB8IHBvcnRNUFVfUkVHSU9OX1ZBTElEOworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQXR0cmlidXRlID0gMFVMOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdGFzayBpcyBjcmVhdGVkIC0gaW4KKwkJd2hpY2ggY2FzZSB0aGUgc3RhY2sgcmVnaW9uIHBhcmFtZXRlcnMgd2lsbCBiZSB2YWxpZC4gIEF0IGFsbCBvdGhlcgorCQl0aW1lcyB0aGUgc3RhY2sgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSB2YWxpZCBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZQorCQlzdGFjayByZWdpb24gaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLiAqLworCQlpZiggdWxTdGFja0RlcHRoID4gMCApCisJCXsKKwkJCS8qIERlZmluZSB0aGUgcmVnaW9uIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgc3RhY2suICovCisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDAgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0KKwkJCQkJKCAoIHVpbnQzMl90ICkgcHhCb3R0b21PZlN0YWNrICkgfAorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkoIHBvcnRTVEFDS19SRUdJT04gKTsgLyogUmVnaW9uIG51bWJlci4gKi8KKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8IC8qIFJlYWQgYW5kIHdyaXRlLiAqLworCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1bFN0YWNrRGVwdGggKiAoIHVpbnQzMl90ICkgc2l6ZW9mKCBTdGFja1R5cGVfdCApICkgKSB8CisJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisJCX0KKworCQlsSW5kZXggPSAwOworCisJCWZvciggdWwgPSAxOyB1bCA8PSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TOyB1bCsrICkKKwkJeworCQkJaWYoICggeFJlZ2lvbnNbIGxJbmRleCBdICkudWxMZW5ndGhJbkJ5dGVzID4gMFVMICkKKwkJCXsKKwkJCQkvKiBUcmFuc2xhdGUgdGhlIGdlbmVyaWMgcmVnaW9uIGRlZmluaXRpb24gY29udGFpbmVkIGluCisJCQkJeFJlZ2lvbnMgaW50byB0aGUgQ00zIHNwZWNpZmljIE1QVSBzZXR0aW5ncyB0aGF0IGFyZSB0aGVuCisJCQkJc3RvcmVkIGluIHhNUFVTZXR0aW5ncy4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJCQkoICggdWludDMyX3QgKSB4UmVnaW9uc1sgbEluZGV4IF0ucHZCYXNlQWRkcmVzcyApIHwKKwkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkoIHBvcnRTVEFDS19SRUdJT04gKyB1bCApOyAvKiBSZWdpb24gbnVtYmVyLiAqLworCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQXR0cmlidXRlID0KKwkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgKSApIHwKKwkJCQkJCSggeFJlZ2lvbnNbIGxJbmRleCBdLnVsUGFyYW1ldGVycyApIHwKKwkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogSW52YWxpZGF0ZSB0aGUgcmVnaW9uLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0gKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKSB8IHBvcnRNUFVfUkVHSU9OX1ZBTElEOworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9IDBVTDsKKwkJCX0KKworCQkJbEluZGV4Kys7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKworCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICkKKwl7CisJdWludDMyX3QgdWxDdXJyZW50SW50ZXJydXB0OworCXVpbnQ4X3QgdWNDdXJyZW50UHJpb3JpdHk7CisKKwkJLyogT2J0YWluIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW50ZXJydXB0LiAqLworCQlfX2FzbSB2b2xhdGlsZSggIm1ycyAlMCwgaXBzciIgOiAiPXIiKCB1bEN1cnJlbnRJbnRlcnJ1cHQgKSA6OiAibWVtb3J5IiApOworCisJCS8qIElzIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGEgdXNlciBkZWZpbmVkIGludGVycnVwdD8gKi8KKwkJaWYoIHVsQ3VycmVudEludGVycnVwdCA+PSBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSICkKKwkJeworCQkJLyogTG9vayB1cCB0aGUgaW50ZXJydXB0J3MgcHJpb3JpdHkuICovCisJCQl1Y0N1cnJlbnRQcmlvcml0eSA9IHBjSW50ZXJydXB0UHJpb3JpdHlSZWdpc3RlcnNbIHVsQ3VycmVudEludGVycnVwdCBdOworCisJCQkvKiBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYgYSBzZXJ2aWNlIHJvdXRpbmUgKElTUikgZm9yCisJCQlhbiBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgY2FsbHMgYW4gSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCQlmdW5jdGlvbi4gIElTUiBzYWZlIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgbXVzdCAqb25seSogYmUgY2FsbGVkCisJCQlmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhdCBvciBiZWxvdworCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlOdW1lcmljYWxseSBsb3cgaW50ZXJydXB0IHByaW9yaXR5IG51bWJlcnMgcmVwcmVzZW50IGxvZ2ljYWxseSBoaWdoCisJCQlpbnRlcnJ1cHQgcHJpb3JpdGllcywgdGhlcmVmb3JlIHRoZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0IG11c3QKKwkJCWJlIHNldCB0byBhIHZhbHVlIGVxdWFsIHRvIG9yIG51bWVyaWNhbGx5ICpoaWdoZXIqIHRoYW4KKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJSW50ZXJydXB0cyB0aGF0CXVzZSB0aGUgRnJlZVJUT1MgQVBJIG11c3Qgbm90IGJlIGxlZnQgYXQgdGhlaXIKKwkJCWRlZmF1bHQgcHJpb3JpdHkgb2YJemVybyBhcyB0aGF0IGlzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHByaW9yaXR5LAorCQkJd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBhYm92ZSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFksCisJCQlhbmQJdGhlcmVmb3JlIGFsc28gZ3VhcmFudGVlZCB0byBiZSBpbnZhbGlkLgorCisJCQlGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0byBlbnN1cmUKKwkJCWludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBzaW1wbGUgYXMgcG9zc2libGUuCisKKwkJCVRoZSBmb2xsb3dpbmcgbGlua3MgcHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbjoKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL0ZBUUhlbHAuaHRtbCAqLworCQkJY29uZmlnQVNTRVJUKCB1Y0N1cnJlbnRQcmlvcml0eSA+PSB1Y01heFN5c0NhbGxQcmlvcml0eSApOworCQl9CisKKwkJLyogUHJpb3JpdHkgZ3JvdXBpbmc6ICBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKE5WSUMpIGFsbG93cyB0aGUgYml0cworCQl0aGF0IGRlZmluZSBlYWNoIGludGVycnVwdCdzIHByaW9yaXR5IHRvIGJlIHNwbGl0IGJldHdlZW4gYml0cyB0aGF0CisJCWRlZmluZSB0aGUgaW50ZXJydXB0J3MgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cyBhbmQgYml0cyB0aGF0IGRlZmluZQorCQl0aGUgaW50ZXJydXB0J3Mgc3ViLXByaW9yaXR5LiAgRm9yIHNpbXBsaWNpdHkgYWxsIGJpdHMgbXVzdCBiZSBkZWZpbmVkCisJCXRvIGJlIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMuICBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYKKwkJdGhpcyBpcyBub3QgdGhlIGNhc2UgKGlmIHNvbWUgYml0cyByZXByZXNlbnQgYSBzdWItcHJpb3JpdHkpLgorCisJCUlmIHRoZSBhcHBsaWNhdGlvbiBvbmx5IHVzZXMgQ01TSVMgbGlicmFyaWVzIGZvciBpbnRlcnJ1cHQKKwkJY29uZmlndXJhdGlvbiB0aGVuIHRoZSBjb3JyZWN0IHNldHRpbmcgY2FuIGJlIGFjaGlldmVkIG9uIGFsbCBDb3J0ZXgtTQorCQlkZXZpY2VzIGJ5IGNhbGxpbmcgTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKCAwICk7IGJlZm9yZSBzdGFydGluZyB0aGUKKwkJc2NoZWR1bGVyLiAgTm90ZSBob3dldmVyIHRoYXQgc29tZSB2ZW5kb3Igc3BlY2lmaWMgcGVyaXBoZXJhbCBsaWJyYXJpZXMKKwkJYXNzdW1lIGEgbm9uLXplcm8gcHJpb3JpdHkgZ3JvdXAgc2V0dGluZywgaW4gd2hpY2ggY2FzZXMgdXNpbmcgYSB2YWx1ZQorCQlvZiB6ZXJvIHdpbGwgcmVzdWx0IGluIHVucHJlZGljYWJsZSBiZWhhdmlvdXIuICovCisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0QUlSQ1JfUkVHICYgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sgKSA8PSB1bE1heFBSSUdST1VQVmFsdWUgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zX01QVS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNM19NUFUvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1N2YxYwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNM19NUFUvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisKKyNpZm5kZWYgUE9SVE1BQ1JPX0gKKyNkZWZpbmUgUE9SVE1BQ1JPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb3J0IHNwZWNpZmljIGRlZmluaXRpb25zLgorICoKKyAqIFRoZSBzZXR0aW5ncyBpbiB0aGlzIGZpbGUgY29uZmlndXJlIEZyZWVSVE9TIGNvcnJlY3RseSBmb3IgdGhlCisgKiBnaXZlbiBoYXJkd2FyZSBhbmQgY29tcGlsZXIuCisgKgorICogVGhlc2Ugc2V0dGluZ3Mgc2hvdWxkIG5vdCBiZSBhbHRlcmVkLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIFR5cGUgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIHBvcnRDSEFSCQljaGFyCisjZGVmaW5lIHBvcnRGTE9BVAkJZmxvYXQKKyNkZWZpbmUgcG9ydERPVUJMRQkJZG91YmxlCisjZGVmaW5lIHBvcnRMT05HCQlsb25nCisjZGVmaW5lIHBvcnRTSE9SVAkJc2hvcnQKKyNkZWZpbmUgcG9ydFNUQUNLX1RZUEUJdWludDMyX3QKKyNkZWZpbmUgcG9ydEJBU0VfVFlQRQlsb25nCisKK3R5cGVkZWYgcG9ydFNUQUNLX1RZUEUgU3RhY2tUeXBlX3Q7Cit0eXBlZGVmIGxvbmcgQmFzZVR5cGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVQmFzZVR5cGVfdDsKKworI2lmKCBjb25maWdVU0VfMTZfQklUX1RJQ0tTID09IDEgKQorCXR5cGVkZWYgdWludDE2X3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkgMHhmZmZmCisjZWxzZQorCXR5cGVkZWYgdWludDMyX3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkgMHhmZmZmZmZmZlVMCisKKwkvKiAzMi1iaXQgdGljayB0eXBlIG9uIGEgMzItYml0IGFyY2hpdGVjdHVyZSwgc28gcmVhZHMgb2YgdGhlIHRpY2sgY291bnQgZG8KKwlub3QgbmVlZCB0byBiZSBndWFyZGVkIHdpdGggYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCSNkZWZpbmUgcG9ydFRJQ0tfVFlQRV9JU19BVE9NSUMgMQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTVBVIHNwZWNpZmljIGNvbnN0YW50cy4gKi8KKyNkZWZpbmUgcG9ydFVTSU5HX01QVV9XUkFQUEVSUwkJMQorI2RlZmluZSBwb3J0UFJJVklMRUdFX0JJVAkJCSggMHg4MDAwMDAwMFVMICkKKworI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFCQkJCSggMHgwM1VMIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWQkJKCAweDA1VUwgPDwgMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWQkJCQkoIDB4MDZVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFCSggMHgwMVVMIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRQkJKCAweDA3VUwgPDwgMTZVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIJCQkoIDB4MDFVTCA8PCAyOFVMICkKKworI2RlZmluZSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJKCAwVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkoIDFVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT04JCQkoIDJVTCApCisjZGVmaW5lIHBvcnRHRU5FUkFMX1BFUklQSEVSQUxTX1JFR0lPTgkJKCAzVUwgKQorI2RlZmluZSBwb3J0U1RBQ0tfUkVHSU9OCQkJCQkoIDRVTCApCisjZGVmaW5lIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OCSAgICAoIDVVTCApCisjZGVmaW5lIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04JCSggN1VMICkKKyNkZWZpbmUgcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUwkJKCAoIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04gLSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTiApICsgMSApCisjZGVmaW5lIHBvcnRUT1RBTF9OVU1fUkVHSU9OUwkJCQkoIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMgKyAxICkgLyogUGx1cyBvbmUgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIHN0YWNrIHJlZ2lvbi4gKi8KKworI2RlZmluZSBwb3J0U1dJVENIX1RPX1VTRVJfTU9ERSgpIF9fYXNtIHZvbGF0aWxlICggIiBtcnMgcjAsIGNvbnRyb2wgXG4gb3JyIHIwLCAjMSBcbiBtc3IgY29udHJvbCwgcjAgIiA6OjogInIwIiwgIm1lbW9yeSIgKQorCit0eXBlZGVmIHN0cnVjdCBNUFVfUkVHSU9OX1JFR0lTVEVSUworeworCXVpbnQzMl90IHVsUmVnaW9uQmFzZUFkZHJlc3M7CisJdWludDMyX3QgdWxSZWdpb25BdHRyaWJ1dGU7Cit9IHhNUFVfUkVHSU9OX1JFR0lTVEVSUzsKKworLyogUGx1cyAxIHRvIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIHN0YWNrIHJlZ2lvbi4gKi8KK3R5cGVkZWYgc3RydWN0IE1QVV9TRVRUSU5HUworeworCXhNUFVfUkVHSU9OX1JFR0lTVEVSUyB4UmVnaW9uWyBwb3J0VE9UQUxfTlVNX1JFR0lPTlMgXTsKK30geE1QVV9TRVRUSU5HUzsKKworLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljcy4gKi8KKyNkZWZpbmUgcG9ydFNUQUNLX0dST1dUSAkJCSggLTEgKQorI2RlZmluZSBwb3J0VElDS19QRVJJT0RfTVMJCQkoICggVGlja1R5cGVfdCApIDEwMDAgLyBjb25maWdUSUNLX1JBVEVfSFogKQorI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlQJCQk4CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU1ZDIG51bWJlcnMgZm9yIHZhcmlvdXMgc2VydmljZXMuICovCisjZGVmaW5lIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSCQkJCTAKKyNkZWZpbmUgcG9ydFNWQ19ZSUVMRAkJCQkJCTEKKyNkZWZpbmUgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UJCQkJMgorCisvKiBTY2hlZHVsZXIgdXRpbGl0aWVzLiAqLworCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCV9fYXNtIHZvbGF0aWxlICggIglTVkMJJTAJXG4iIDo6ICJpIiAocG9ydFNWQ19ZSUVMRCkgOiAibWVtb3J5IiApCisjZGVmaW5lIHBvcnRZSUVMRF9XSVRISU5fQVBJKCkgCQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLwkJCQkJCQkJXAorCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMgY29tcGxldGVseQlcCisJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLwkJCQkJCVwKKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CQkJCQkJCQkJCVwKKwlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsJCQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUX0JJVAkJKCAxVUwgPDwgMjhVTCApCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkgaWYoIHhTd2l0Y2hSZXF1aXJlZCApIHBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuICovCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICk7CisjZGVmaW5lIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQkJdWxQb3J0UmFpc2VCQVNFUFJJKCkKKyNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKHgpCXZQb3J0U2V0QkFTRVBSSSh4KQorI2RlZmluZSBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkJCQkJdlBvcnRSYWlzZUJBU0VQUkkoKQorI2RlZmluZSBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQkJCQkJdlBvcnRTZXRCQVNFUFJJKDApCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQkJCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGFzayBmdW5jdGlvbiBtYWNyb3MgYXMgZGVzY3JpYmVkIG9uIHRoZSBGcmVlUlRPUy5vcmcgV0VCIHNpdGUuICBUaGVzZSBhcmUKK25vdCBuZWNlc3NhcnkgZm9yIHRvIHVzZSB0aGlzIHBvcnQuICBUaGV5IGFyZSBkZWZpbmVkIHNvIHRoZSBjb21tb24gZGVtbyBmaWxlcworKHdoaWNoIGJ1aWxkIHdpdGggYWxsIHRoZSBwb3J0cykgd2lsbCBidWlsZC4gKi8KKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBvcHRpbWlzYXRpb25zLiAqLworI2lmbmRlZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04KKwkjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAxCisjZW5kaWYKKworI2lmIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiA9PSAxCisKKwkvKiBHZW5lcmljIGhlbHBlciBmdW5jdGlvbi4gKi8KKwlfX2F0dHJpYnV0ZV9fKCAoIGFsd2F5c19pbmxpbmUgKSApIHN0YXRpYyBpbmxpbmUgdWludDhfdCB1Y1BvcnRDb3VudExlYWRpbmdaZXJvcyggdWludDMyX3QgdWxCaXRtYXAgKQorCXsKKwl1aW50OF90IHVjUmV0dXJuOworCisJCV9fYXNtIHZvbGF0aWxlICggImNseiAlMCwgJTEiIDogIj1yIiAoIHVjUmV0dXJuICkgOiAiciIgKCB1bEJpdG1hcCApIDogIm1lbW9yeSIgKTsKKwkJcmV0dXJuIHVjUmV0dXJuOworCX0KKworCS8qIENoZWNrIHRoZSBjb25maWd1cmF0aW9uLiAqLworCSNpZiggY29uZmlnTUFYX1BSSU9SSVRJRVMgPiAzMiApCisJCSNlcnJvciBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gY2FuIG9ubHkgYmUgc2V0IHRvIDEgd2hlbiBjb25maWdNQVhfUFJJT1JJVElFUyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzIuICBJdCBpcyB2ZXJ5IHJhcmUgdGhhdCBhIHN5c3RlbSByZXF1aXJlcyBtb3JlIHRoYW4gMTAgdG8gMTUgZGlmZmVyZW5jZSBwcmlvcml0aWVzIGFzIHRhc2tzIHRoYXQgc2hhcmUgYSBwcmlvcml0eSB3aWxsIHRpbWUgc2xpY2UuCisJI2VuZGlmCisKKwkvKiBTdG9yZS9jbGVhciB0aGUgcmVhZHkgcHJpb3JpdGllcyBpbiBhIGJpdCBtYXAuICovCisJI2RlZmluZSBwb3J0UkVDT1JEX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSB8PSAoIDFVTCA8PCAoIHV4UHJpb3JpdHkgKSApCisJI2RlZmluZSBwb3J0UkVTRVRfUkVBRFlfUFJJT1JJVFkoIHV4UHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgKCB1eFJlYWR5UHJpb3JpdGllcyApICY9IH4oIDFVTCA8PCAoIHV4UHJpb3JpdHkgKSApCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCSNkZWZpbmUgcG9ydEdFVF9ISUdIRVNUX1BSSU9SSVRZKCB1eFRvcFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApIHV4VG9wUHJpb3JpdHkgPSAoIDMxVUwgLSAoIHVpbnQzMl90ICkgdWNQb3J0Q291bnRMZWFkaW5nWmVyb3MoICggdXhSZWFkeVByaW9yaXRpZXMgKSApICkKKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIGNvbmZpZ0FTU0VSVAorCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICk7CisJI2RlZmluZSBwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCkgCXZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSgpCisjZW5kaWYKKworLyogcG9ydE5PUCgpIGlzIG5vdCByZXF1aXJlZCBieSB0aGlzIHBvcnQuICovCisjZGVmaW5lIHBvcnROT1AoKQorCisjZGVmaW5lIHBvcnRJTkxJTkUJX19pbmxpbmUKKworI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCisJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FIGlubGluZSBfX2F0dHJpYnV0ZV9fKCggYWx3YXlzX2lubGluZSkpCisjZW5kaWYKKworLyogU2V0IHRoZSBwcml2aWxlZ2UgbGV2ZWwgdG8gdXNlciBtb2RlIGlmIHhSdW5uaW5nUHJpdmlsZWdlZCBpcyBmYWxzZS4gKi8KK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKQoreworCWlmKCB4UnVubmluZ1ByaXZpbGVnZWQgIT0gcGRUUlVFICkKKwl7CisJCV9fYXNtIHZvbGF0aWxlICggIiBtcnMgcjAsIGNvbnRyb2wgCVxuIiBcCisJCQkJCQkgIiBvcnIgcjAsICMxIAkJXG4iIFwKKwkJCQkJCSAiIG1zciBjb250cm9sLCByMAlcbiIJXAorCQkJCQkJIDo6OiJyMCIsICJtZW1vcnkiICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIEJhc2VUeXBlX3QgeFBvcnRJc0luc2lkZUludGVycnVwdCggdm9pZCApCit7Cit1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CitCYXNlVHlwZV90IHhSZXR1cm47CisKKwkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJX19hc20gdm9sYXRpbGUoICJtcnMgJTAsIGlwc3IiIDogIj1yIiggdWxDdXJyZW50SW50ZXJydXB0ICkgOjogIm1lbW9yeSIgKTsKKworCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPT0gMCApCisJeworCQl4UmV0dXJuID0gcGRGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IHBkVFJVRTsKKwl9CisKKwlyZXR1cm4geFJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxOZXdCQVNFUFJJOworCisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbW92ICUwLCAlMQkJCQkJCQkJCQkJCVxuIglcCisJCSIJbXNyIGJhc2VwcmksICUwCQkJCQkJCQkJCQlcbiIgXAorCQkiCWlzYgkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJIglkc2IJCQkJCQkJCQkJCQkJCVxuIiBcCisJCToiPXIiICh1bE5ld0JBU0VQUkkpIDogImkiICggY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZICkgOiAibWVtb3J5IgorCSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitwb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyB1aW50MzJfdCB1bFBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxPcmlnaW5hbEJBU0VQUkksIHVsTmV3QkFTRVBSSTsKKworCV9fYXNtIHZvbGF0aWxlCisJKAorCQkiCW1ycyAlMCwgYmFzZXByaQkJCQkJCQkJCQkJXG4iIFwKKwkJIgltb3YgJTEsICUyCQkJCQkJCQkJCQkJXG4iCVwKKwkJIgltc3IgYmFzZXByaSwgJTEJCQkJCQkJCQkJCVxuIiBcCisJCSIJaXNiCQkJCQkJCQkJCQkJCQlcbiIgXAorCQkiCWRzYgkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJOiI9ciIgKHVsT3JpZ2luYWxCQVNFUFJJKSwgIj1yIiAodWxOZXdCQVNFUFJJKSA6ICJpIiAoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApIDogIm1lbW9yeSIKKwkpOworCisJLyogVGhpcyByZXR1cm4gd2lsbCBub3QgYmUgcmVhY2hlZCBidXQgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgY29tcGlsZXIKKwl3YXJuaW5ncy4gKi8KKwlyZXR1cm4gdWxPcmlnaW5hbEJBU0VQUkk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgdm9pZCB2UG9ydFNldEJBU0VQUkkoIHVpbnQzMl90IHVsTmV3TWFza1ZhbHVlICkKK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIgltc3IgYmFzZXByaSwgJTAJIiA6OiAiciIgKCB1bE5ld01hc2tWYWx1ZSApIDogIm1lbW9yeSIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNEYvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ000Ri9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5NmI0YwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNEYvcG9ydC5jCkBAIC0wLDAgKzEsNzc1IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gcG9ydGFibGUuaCBmb3IgdGhlIEFSTSBDTTRGIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyNpZm5kZWYgX19WRlBfRlBfXworCSNlcnJvciBUaGlzIHBvcnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgdG8gZW5hYmxlIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQuCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdTWVNUSUNLX0NMT0NLX0haCisJI2RlZmluZSBjb25maWdTWVNUSUNLX0NMT0NLX0haIGNvbmZpZ0NQVV9DTE9DS19IWgorCS8qIEVuc3VyZSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGF0IHRoZSBzYW1lIGZyZXF1ZW5jeSBhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDFVTCA8PCAyVUwgKQorI2Vsc2UKKwkvKiBUaGUgd2F5IHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgaXMgbm90IG1vZGlmaWVkIGluIGNhc2UgaXQgaXMgbm90IHRoZSBzYW1lCisJYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQJKCAwICkKKyNlbmRpZgorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29yZS4gIFJlZ2lzdGVycyBmaXJzdC4uLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTQgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMl9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApICkKKy8qIC4uLnRoZW4gYml0cyBpbiB0aGUgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0lOVF9CSVQJCQkoIDFVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQJCQkoIDFVTCA8PCAwVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUdfQklUCQkoIDFVTCA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWQ0xFQVJfQklUIAkJCSggMVVMIDw8IDI3VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EX1NZU1RJQ0tfQ0xFQVJfQklUCQkoIDFVTCA8PCAyNVVMICkKKworLyogQ29uc3RhbnRzIHVzZWQgdG8gZGV0ZWN0IGEgQ29ydGV4LU03IHIwcDEgY29yZSwgd2hpY2ggc2hvdWxkIHVzZSB0aGUgQVJNX0NNNworcjBwMSBwb3J0LiAqLworI2RlZmluZSBwb3J0Q1BVSUQJCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhFMDAwZWQwMCApICkKKyNkZWZpbmUgcG9ydENPUlRFWF9NN19yMHAxX0lECQkJCSggMHg0MTBGQzI3MVVMICkKKyNkZWZpbmUgcG9ydENPUlRFWF9NN19yMHAwX0lECQkJCSggMHg0MTBGQzI3MFVMICkKKworI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZfUFJJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMjRVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgYW4gaW50ZXJydXB0IHByaW9yaXR5LiAqLworI2RlZmluZSBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSCQkoIDE2ICkKKyNkZWZpbmUgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiAJKCAweEUwMDBFM0YwICkKKyNkZWZpbmUgcG9ydEFJUkNSX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4RTAwMEVEMEMgKSApCisjZGVmaW5lIHBvcnRNQVhfOF9CSVRfVkFMVUUJCQkJCSggKCB1aW50OF90ICkgMHhmZiApCisjZGVmaW5lIHBvcnRUT1BfQklUX09GX0JZVEUJCQkJCSggKCB1aW50OF90ICkgMHg4MCApCisjZGVmaW5lIHBvcnRNQVhfUFJJR1JPVVBfQklUUwkJCQkoICggdWludDhfdCApIDcgKQorI2RlZmluZSBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSwkJCQkoIDB4MDdVTCA8PCA4VUwgKQorI2RlZmluZSBwb3J0UFJJR1JPVVBfU0hJRlQJCQkJCSggOFVMICkKKworLyogTWFza3Mgb2ZmIGFsbCBiaXRzIGJ1dCB0aGUgVkVDVEFDVElWRSBiaXRzIGluIHRoZSBJQ1NSIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0VkVDVEFDVElWRV9NQVNLCQkJCQkoIDB4RkZVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBWRlAuICovCisjZGVmaW5lIHBvcnRGUENDUgkJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVmMzQgKSAvKiBGbG9hdGluZyBwb2ludCBjb250ZXh0IGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUwkJCSggMHgzVUwgPDwgMzBVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suICovCisjZGVmaW5lIHBvcnRJTklUSUFMX1hQU1IJCQkJCSggMHgwMTAwMDAwMCApCisjZGVmaW5lIHBvcnRJTklUSUFMX0VYQ19SRVRVUk4JCQkJKCAweGZmZmZmZmZkICkKKworLyogVGhlIHN5c3RpY2sgaXMgYSAyNC1iaXQgY291bnRlci4gKi8KKyNkZWZpbmUgcG9ydE1BWF8yNF9CSVRfTlVNQkVSCQkJCSggMHhmZmZmZmZVTCApCisKKy8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCitoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KKyNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJKCAoIFN0YWNrVHlwZV90ICkgMHhmZmZmZmZmZVVMICkKKworLyogQSBmaWRkbGUgZmFjdG9yIHRvIGVzdGltYXRlIHRoZSBudW1iZXIgb2YgU3lzVGljayBjb3VudHMgdGhhdCB3b3VsZCBoYXZlCitvY2N1cnJlZCB3aGlsZSB0aGUgU3lzVGljayBjb3VudGVyIGlzIHN0b3BwZWQgZHVyaW5nIHRpY2tsZXNzIGlkbGUKK2NhbGN1bGF0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SCQkJKCA0NVVMICkKKworLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBwcmUtbG9hZGluZyBvZiB0aGUgaW5pdGlhbCBMUiB3aXRoIHRoZSBhZGRyZXNzIG9mCitwcnZUYXNrRXhpdEVycm9yKCkgaW4gY2FzZSBpdCBtZXNzZXMgdXAgdW53aW5kaW5nIG9mIHRoZSBzdGFjayBpbiB0aGUKK2RlYnVnZ2VyLiAqLworI2lmZGVmIGNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MKKwkjZGVmaW5lIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTCWNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MKKyNlbHNlCisJI2RlZmluZSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUwlwcnZUYXNrRXhpdEVycm9yCisjZW5kaWYKKworLyoKKyAqIFNldHVwIHRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzLiAgVGhlIGltcGxlbWVudGF0aW9uIGluIHRoaXMKKyAqIGZpbGUgaXMgd2VhayB0byBhbGxvdyBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvIGNoYW5nZSB0aGUgdGltZXIgdXNlZCB0bworICogZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0LgorICovCit2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApOworCisvKgorICogRXhjZXB0aW9uIGhhbmRsZXJzLgorICovCit2b2lkIHhQb3J0UGVuZFNWSGFuZGxlciggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7Cit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKTsKK3ZvaWQgdlBvcnRTVkNIYW5kbGVyKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoKKyAqIFN0YXJ0IGZpcnN0IHRhc2sgaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgdGVzdGVkIGluIGlzb2xhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcHJ2UG9ydFN0YXJ0Rmlyc3RUYXNrKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoKKyAqIEZ1bmN0aW9uIHRvIGVuYWJsZSB0aGUgVkZQLgorICovCitzdGF0aWMgdm9pZCB2UG9ydEVuYWJsZVZGUCggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qCisgKiBVc2VkIHRvIGNhdGNoIHRhc2tzIHRoYXQgYXR0ZW1wdCB0byByZXR1cm4gZnJvbSB0aGVpciBpbXBsZW1lbnRpbmcgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCit2YXJpYWJsZS4gKi8KK3N0YXRpYyBVQmFzZVR5cGVfdCB1eENyaXRpY2FsTmVzdGluZyA9IDB4YWFhYWFhYWE7CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIFN5c1RpY2sgaW5jcmVtZW50cyB0aGF0IG1ha2UgdXAgb25lIHRpY2sgcGVyaW9kLgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrIHBlcmlvZHMgdGhhdCBjYW4gYmUgc3VwcHJlc3NlZCBpcyBsaW1pdGVkIGJ5IHRoZQorICogMjQgYml0IHJlc29sdXRpb24gb2YgdGhlIFN5c1RpY2sgdGltZXIuCisgKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJc3RhdGljIHVpbnQzMl90IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBDb21wZW5zYXRlIGZvciB0aGUgQ1BVIGN5Y2xlcyB0aGF0IHBhc3Mgd2hpbGUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCAobG93CisgKiBwb3dlciBmdW5jdGlvbmFsaXR5IG9ubHkuCisgKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJc3RhdGljIHVpbnQzMl90IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogVXNlZCBieSB0aGUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIG1hY3JvIHRvIGVuc3VyZQorICogRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBhcmUgbm90IGNhbGxlZCBmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQKKyAqIGEgcHJpb3JpdHkgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorICovCisjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCSBzdGF0aWMgdWludDhfdCB1Y01heFN5c0NhbGxQcmlvcml0eSA9IDA7CisJIHN0YXRpYyB1aW50MzJfdCB1bE1heFBSSUdST1VQVmFsdWUgPSAwOworCSBzdGF0aWMgY29uc3Qgdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHBjSW50ZXJydXB0UHJpb3JpdHlSZWdpc3RlcnMgPSAoIGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCApIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTY7CisjZW5kaWYgLyogY29uZmlnQVNTRVJUX0RFRklORUQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZWUgaGVhZGVyIGZpbGUgZm9yIGRlc2NyaXB0aW9uLgorICovCitTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycyApCit7CisJLyogU2ltdWxhdGUgdGhlIHN0YWNrIGZyYW1lIGFzIGl0IHdvdWxkIGJlIGNyZWF0ZWQgYnkgYSBjb250ZXh0IHN3aXRjaAorCWludGVycnVwdC4gKi8KKworCS8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdAorCW9mIGludGVycnVwdHMsIGFuZCB0byBlbnN1cmUgYWxpZ25tZW50LiAqLworCXB4VG9wT2ZTdGFjay0tOworCisJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX1hQU1I7CS8qIHhQU1IgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCAoIFN0YWNrVHlwZV90ICkgcHhDb2RlICkgJiBwb3J0U1RBUlRfQUREUkVTU19NQVNLOwkvKiBQQyAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1M7CS8qIExSICovCisKKwkvKiBTYXZlIGNvZGUgc3BhY2UgYnkgc2tpcHBpbmcgcmVnaXN0ZXIgaW5pdGlhbGlzYXRpb24uICovCisJcHhUb3BPZlN0YWNrIC09IDU7CS8qIFIxMiwgUjMsIFIyIGFuZCBSMS4gKi8KKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJLyogUjAgKi8KKworCS8qIEEgc2F2ZSBtZXRob2QgaXMgYmVpbmcgdXNlZCB0aGF0IHJlcXVpcmVzIGVhY2ggdGFzayB0byBtYWludGFpbiBpdHMKKwlvd24gZXhlYyByZXR1cm4gdmFsdWUuICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0VYQ19SRVRVUk47CisKKwlweFRvcE9mU3RhY2sgLT0gODsJLyogUjExLCBSMTAsIFI5LCBSOCwgUjcsIFI2LCBSNSBhbmQgUjQuICovCisKKwlyZXR1cm4gcHhUb3BPZlN0YWNrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKQorewordm9sYXRpbGUgdWludDMyX3QgdWxEdW1teSA9IDA7CisKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCWl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uICBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCXNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4KKworCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQoKSB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMKKwlkZWZpbmVkLCB0aGVuIHN0b3AgaGVyZSBzbyBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXdoaWxlKCB1bER1bW15ID09IDAgKQorCXsKKwkJLyogVGhpcyBmaWxlIGNhbGxzIHBydlRhc2tFeGl0RXJyb3IoKSBhZnRlciB0aGUgc2NoZWR1bGVyIGhhcyBiZWVuCisJCXN0YXJ0ZWQgdG8gcmVtb3ZlIGEgY29tcGlsZXIgd2FybmluZyBhYm91dCB0aGUgZnVuY3Rpb24gYmVpbmcgZGVmaW5lZAorCQlidXQgbmV2ZXIgY2FsbGVkLiAgdWxEdW1teSBpcyB1c2VkIHB1cmVseSB0byBxdWlldGVuIG90aGVyIHdhcm5pbmdzCisJCWFib3V0IGNvZGUgYXBwZWFyaW5nIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIC0gbWFraW5nIHVsRHVtbXkKKwkJdm9sYXRpbGUgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoZSBmdW5jdGlvbiBjb3VsZCByZXR1cm4gYW5kCisJCXRoZXJlZm9yZSBub3Qgb3V0cHV0IGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGZvciBjb2RlIHRoYXQgYXBwZWFycworCQlhZnRlciBpdC4gKi8KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKQoreworCV9fYXNtIHZvbGF0aWxlICgKKwkJCQkJIglsZHIJcjMsIHB4Q3VycmVudFRDQkNvbnN0MgkJXG4iIC8qIFJlc3RvcmUgdGhlIGNvbnRleHQuICovCisJCQkJCSIJbGRyIHIxLCBbcjNdCQkJCQlcbiIgLyogVXNlIHB4Q3VycmVudFRDQkNvbnN0IHRvIGdldCB0aGUgcHhDdXJyZW50VENCIGFkZHJlc3MuICovCisJCQkJCSIJbGRyIHIwLCBbcjFdCQkJCQlcbiIgLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwkJCQkJIglsZG1pYSByMCEsIHtyNC1yMTEsIHIxNH0JCVxuIiAvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCBvbiBleGNlcHRpb24gZW50cnkgYW5kIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50LiAqLworCQkJCQkiCW1zciBwc3AsIHIwCQkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIHRhc2sgc3RhY2sgcG9pbnRlci4gKi8KKwkJCQkJIglpc2IJCQkJCQkJCVxuIgorCQkJCQkiCW1vdiByMCwgIzAgCQkJCQkJXG4iCisJCQkJCSIJbXNyCWJhc2VwcmksIHIwCQkJCQlcbiIKKwkJCQkJIglieCByMTQJCQkJCQkJXG4iCisJCQkJCSIJCQkJCQkJCQlcbiIKKwkJCQkJIgkuYWxpZ24gNAkJCQkJCVxuIgorCQkJCQkicHhDdXJyZW50VENCQ29uc3QyOiAud29yZCBweEN1cnJlbnRUQ0IJCQkJXG4iCisJCQkJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZQb3J0U3RhcnRGaXJzdFRhc2soIHZvaWQgKQoreworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAgVGhpcyBhbHNvIGNsZWFycyB0aGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoZSBGUFUgaXMKKwlpbiB1c2UgaW4gY2FzZSB0aGUgRlBVIHdhcyB1c2VkIGJlZm9yZSB0aGUgc2NoZWR1bGVyIHdhcyBzdGFydGVkIC0gd2hpY2gKKwl3b3VsZCBvdGhlcndpc2UgcmVzdWx0IGluIHRoZSB1bm5lY2Vzc2FyeSBsZWF2aW5nIG9mIHNwYWNlIGluIHRoZSBTVkMgc3RhY2sKKwlmb3IgbGF6eSBzYXZpbmcgb2YgRlBVIHJlZ2lzdGVycy4gKi8KKwlfX2FzbSB2b2xhdGlsZSgKKwkJCQkJIiBsZHIgcjAsID0weEUwMDBFRDA4IAlcbiIgLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCQkJCQkiIGxkciByMCwgW3IwXSAJCQlcbiIKKwkJCQkJIiBsZHIgcjAsIFtyMF0gCQkJXG4iCisJCQkJCSIgbXNyIG1zcCwgcjAJCQlcbiIgLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCQkJCQkiIG1vdiByMCwgIzAJCQlcbiIgLyogQ2xlYXIgdGhlIGJpdCB0aGF0IGluZGljYXRlcyB0aGUgRlBVIGlzIGluIHVzZSwgc2VlIGNvbW1lbnQgYWJvdmUuICovCisJCQkJCSIgbXNyIGNvbnRyb2wsIHIwCQlcbiIKKwkJCQkJIiBjcHNpZSBpCQkJCVxuIiAvKiBHbG9iYWxseSBlbmFibGUgaW50ZXJydXB0cy4gKi8KKwkJCQkJIiBjcHNpZSBmCQkJCVxuIgorCQkJCQkiIGRzYgkJCQkJXG4iCisJCQkJCSIgaXNiCQkJCQlcbiIKKwkJCQkJIiBzdmMgMAkJCQkJXG4iIC8qIFN5c3RlbSBjYWxsIHRvIHN0YXJ0IGZpcnN0IHRhc2suICovCisJCQkJCSIgbm9wCQkJCQlcbiIKKwkJCQkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZWUgaGVhZGVyIGZpbGUgZm9yIGRlc2NyaXB0aW9uLgorICovCitCYXNlVHlwZV90IHhQb3J0U3RhcnRTY2hlZHVsZXIoIHZvaWQgKQoreworCS8qIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBtdXN0IG5vdCBiZSBzZXQgdG8gMC4KKwlTZWUgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCAqLworCWNvbmZpZ0FTU0VSVCggY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZICk7CisKKwkvKiBUaGlzIHBvcnQgY2FuIGJlIHVzZWQgb24gYWxsIHJldmlzaW9ucyBvZiB0aGUgQ29ydGV4LU03IGNvcmUgb3RoZXIgdGhhbgorCXRoZSByMHAxIHBhcnRzLiAgcjBwMSBwYXJ0cyBzaG91bGQgdXNlIHRoZSBwb3J0IGZyb20gdGhlCisJL3NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNy9yMHAxIGRpcmVjdG9yeS4gKi8KKwljb25maWdBU1NFUlQoIHBvcnRDUFVJRCAhPSBwb3J0Q09SVEVYX003X3IwcDFfSUQgKTsKKwljb25maWdBU1NFUlQoIHBvcnRDUFVJRCAhPSBwb3J0Q09SVEVYX003X3IwcDBfSUQgKTsKKworCSNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJeworCQl2b2xhdGlsZSB1aW50MzJfdCB1bE9yaWdpbmFsUHJpb3JpdHk7CisJCXZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCBwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gKCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgKSAoIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgKyBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSICk7CisJCXZvbGF0aWxlIHVpbnQ4X3QgdWNNYXhQcmlvcml0eVZhbHVlOworCisJCS8qIERldGVybWluZSB0aGUgbWF4aW11bSBwcmlvcml0eSBmcm9tIHdoaWNoIElTUiBzYWZlIEZyZWVSVE9TIEFQSQorCQlmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZC4gIElTUiBzYWZlIGZ1bmN0aW9ucyBhcmUgdGhvc2UgdGhhdCBlbmQgaW4KKwkJIkZyb21JU1IiLiAgRnJlZVJUT1MgbWFpbnRhaW5zIHNlcGFyYXRlIHRocmVhZCBhbmQgSVNSIEFQSSBmdW5jdGlvbnMgdG8KKwkJZW5zdXJlIGludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBzaW1wbGUgYXMgcG9zc2libGUuCisKKwkJU2F2ZSB0aGUgaW50ZXJydXB0IHByaW9yaXR5IHZhbHVlIHRoYXQgaXMgYWJvdXQgdG8gYmUgY2xvYmJlcmVkLiAqLworCQl1bE9yaWdpbmFsUHJpb3JpdHkgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGF2YWlsYWJsZS4gIEZpcnN0IHdyaXRlIHRvIGFsbAorCQlwb3NzaWJsZSBiaXRzLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHBvcnRNQVhfOF9CSVRfVkFMVUU7CisKKwkJLyogUmVhZCB0aGUgdmFsdWUgYmFjayB0byBzZWUgaG93IG1hbnkgYml0cyBzdHVjay4gKi8KKwkJdWNNYXhQcmlvcml0eVZhbHVlID0gKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXI7CisKKwkJLyogVXNlIHRoZSBzYW1lIG1hc2sgb24gdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkuICovCisJCXVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZICYgdWNNYXhQcmlvcml0eVZhbHVlOworCisJCS8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBhY2NlcHRhYmxlIHByaW9yaXR5IGdyb3VwIHZhbHVlIGZvciB0aGUgbnVtYmVyCisJCW9mIGJpdHMgcmVhZCBiYWNrLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPSBwb3J0TUFYX1BSSUdST1VQX0JJVFM7CisJCXdoaWxlKCAoIHVjTWF4UHJpb3JpdHlWYWx1ZSAmIHBvcnRUT1BfQklUX09GX0JZVEUgKSA9PSBwb3J0VE9QX0JJVF9PRl9CWVRFICkKKwkJeworCQkJdWxNYXhQUklHUk9VUFZhbHVlLS07CisJCQl1Y01heFByaW9yaXR5VmFsdWUgPDw9ICggdWludDhfdCApIDB4MDE7CisJCX0KKworCQkjaWZkZWYgX19OVklDX1BSSU9fQklUUworCQl7CisJCQkvKiBDaGVjayB0aGUgQ01TSVMgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZgorCQkJcHJpb3JpdHkgYml0cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhY3R1YWxseSBxdWVyaWVkCisJCQlmcm9tIHRoZSBoYXJkd2FyZS4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TUFYX1BSSUdST1VQX0JJVFMgLSB1bE1heFBSSUdST1VQVmFsdWUgKSA9PSBfX05WSUNfUFJJT19CSVRTICk7CisJCX0KKwkJI2VuZGlmCisKKwkJI2lmZGVmIGNvbmZpZ1BSSU9fQklUUworCQl7CisJCQkvKiBDaGVjayB0aGUgRnJlZVJUT1MgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZgorCQkJcHJpb3JpdHkgYml0cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhY3R1YWxseSBxdWVyaWVkCisJCQlmcm9tIHRoZSBoYXJkd2FyZS4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TUFYX1BSSUdST1VQX0JJVFMgLSB1bE1heFBSSUdST1VQVmFsdWUgKSA9PSBjb25maWdQUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkvKiBTaGlmdCB0aGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgYmFjayB0byBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBBSVJDUgorCQlyZWdpc3Rlci4gKi8KKwkJdWxNYXhQUklHUk9VUFZhbHVlIDw8PSBwb3J0UFJJR1JPVVBfU0hJRlQ7CisJCXVsTWF4UFJJR1JPVVBWYWx1ZSAmPSBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSzsKKworCQkvKiBSZXN0b3JlIHRoZSBjbG9iYmVyZWQgaW50ZXJydXB0IHByaW9yaXR5IHJlZ2lzdGVyIHRvIGl0cyBvcmlnaW5hbAorCQl2YWx1ZS4gKi8KKwkJKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSB1bE9yaWdpbmFsUHJpb3JpdHk7CisJfQorCSNlbmRpZiAvKiBjb25pZmdBU1NFUlRfREVGSU5FRCAqLworCisJLyogTWFrZSBQZW5kU1YgYW5kIFN5c1RpY2sgdGhlIGxvd2VzdCBwcmlvcml0eSBpbnRlcnJ1cHRzLiAqLworCXBvcnROVklDX1NZU1BSSTJfUkVHIHw9IHBvcnROVklDX1BFTkRTVl9QUkk7CisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19QUkk7CisKKwkvKiBTdGFydCB0aGUgdGltZXIgdGhhdCBnZW5lcmF0ZXMgdGhlIHRpY2sgSVNSLiAgSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKwloZXJlIGFscmVhZHkuICovCisJdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCk7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IHJlYWR5IGZvciB0aGUgZmlyc3QgdGFzay4gKi8KKwl1eENyaXRpY2FsTmVzdGluZyA9IDA7CisKKwkvKiBFbnN1cmUgdGhlIFZGUCBpcyBlbmFibGVkIC0gaXQgc2hvdWxkIGJlIGFueXdheS4gKi8KKwl2UG9ydEVuYWJsZVZGUCgpOworCisJLyogTGF6eSBzYXZlIGFsd2F5cy4gKi8KKwkqKCBwb3J0RlBDQ1IgKSB8PSBwb3J0QVNQRU5fQU5EX0xTUEVOX0JJVFM7CisKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwlwcnZQb3J0U3RhcnRGaXJzdFRhc2soKTsKKworCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSBhcyB0aGUgdGFza3Mgd2lsbCBub3cgYmUgZXhlY3V0aW5nISAgQ2FsbCB0aGUgdGFzaworCWV4aXQgZXJyb3IgZnVuY3Rpb24gdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBhIHN0YXRpYyBmdW5jdGlvbgorCW5vdCBiZWluZyBjYWxsZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG92ZXJyaWRlcyB0aGlzCisJZnVuY3Rpb25hbGl0eSBieSBkZWZpbmluZyBjb25maWdUQVNLX1JFVFVSTl9BRERSRVNTLiAgQ2FsbAorCXZUYXNrU3dpdGNoQ29udGV4dCgpIHNvIGxpbmsgdGltZSBvcHRpbWlzYXRpb24gZG9lcyBub3QgcmVtb3ZlIHRoZQorCXN5bWJvbC4gKi8KKwl2VGFza1N3aXRjaENvbnRleHQoKTsKKwlwcnZUYXNrRXhpdEVycm9yKCk7CisKKwkvKiBTaG91bGQgbm90IGdldCBoZXJlISAqLworCXJldHVybiAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbmRTY2hlZHVsZXIoIHZvaWQgKQoreworCS8qIE5vdCBpbXBsZW1lbnRlZCBpbiBwb3J0cyB3aGVyZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiB0by4KKwlBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0LiAqLworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgPT0gMTAwMFVMICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKQoreworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl1eENyaXRpY2FsTmVzdGluZysrOworCisJLyogVGhpcyBpcyBub3QgdGhlIGludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIGVudGVyIGNyaXRpY2FsIGZ1bmN0aW9uIHNvCisJYXNzZXJ0KCkgaWYgaXQgaXMgYmVpbmcgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQuICBPbmx5IEFQSQorCWZ1bmN0aW9ucyB0aGF0IGVuZCBpbiAiRnJvbUlTUiIgY2FuIGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0LiAgT25seSBhc3NlcnQgaWYKKwl0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCBpcyAxIHRvIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpdmUgY2FsbHMgaWYgdGhlCisJYXNzZXJ0IGZ1bmN0aW9uIGFsc28gdXNlcyBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEgKQorCXsKKwkJY29uZmlnQVNTRVJUKCAoIHBvcnROVklDX0lOVF9DVFJMX1JFRyAmIHBvcnRWRUNUQUNUSVZFX01BU0sgKSA9PSAwICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKQoreworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgKTsKKwl1eENyaXRpY2FsTmVzdGluZy0tOworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHhQb3J0UGVuZFNWSGFuZGxlciggdm9pZCApCit7CisJLyogVGhpcyBpcyBhIG5ha2VkIGZ1bmN0aW9uLiAqLworCisJX19hc20gdm9sYXRpbGUKKwkoCisJIgltcnMgcjAsIHBzcAkJCQkJCQlcbiIKKwkiCWlzYgkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJXG4iCisJIglsZHIJcjMsIHB4Q3VycmVudFRDQkNvbnN0CQkJXG4iIC8qIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgVENCLiAqLworCSIJbGRyCXIyLCBbcjNdCQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCXRzdCByMTQsICMweDEwCQkJCQkJXG4iIC8qIElzIHRoZSB0YXNrIHVzaW5nIHRoZSBGUFUgY29udGV4dD8gIElmIHNvLCBwdXNoIGhpZ2ggdmZwIHJlZ2lzdGVycy4gKi8KKwkiCWl0IGVxCQkJCQkJCQlcbiIKKwkiCXZzdG1kYmVxIHIwISwge3MxNi1zMzF9CQkJCVxuIgorCSIJCQkJCQkJCQkJXG4iCisJIglzdG1kYiByMCEsIHtyNC1yMTEsIHIxNH0JCQlcbiIgLyogU2F2ZSB0aGUgY29yZSByZWdpc3RlcnMuICovCisJIglzdHIgcjAsIFtyMl0JCQkJCQlcbiIgLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbnRvIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIFRDQi4gKi8KKwkiCQkJCQkJCQkJCVxuIgorCSIJc3RtZGIgc3AhLCB7cjAsIHIzfQkJCQkJXG4iCisJIgltb3YgcjAsICUwIAkJCQkJCQlcbiIKKwkiCW1zciBiYXNlcHJpLCByMAkJCQkJCVxuIgorCSIJZHNiCQkJCQkJCQkJXG4iCisJIglpc2IJCQkJCQkJCQlcbiIKKwkiCWJsIHZUYXNrU3dpdGNoQ29udGV4dAkJCQlcbiIKKwkiCW1vdiByMCwgIzAJCQkJCQkJXG4iCisJIgltc3IgYmFzZXByaSwgcjAJCQkJCQlcbiIKKwkiCWxkbWlhIHNwISwge3IwLCByM30JCQkJCVxuIgorCSIJCQkJCQkJCQkJXG4iCisJIglsZHIgcjEsIFtyM10JCQkJCQlcbiIgLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwkiCWxkciByMCwgW3IxXQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJXG4iCisJIglsZG1pYSByMCEsIHtyNC1yMTEsIHIxNH0JCQlcbiIgLyogUG9wIHRoZSBjb3JlIHJlZ2lzdGVycy4gKi8KKwkiCQkJCQkJCQkJCVxuIgorCSIJdHN0IHIxNCwgIzB4MTAJCQkJCQlcbiIgLyogSXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHBvcCB0aGUgaGlnaCB2ZnAgcmVnaXN0ZXJzIHRvby4gKi8KKwkiCWl0IGVxCQkJCQkJCQlcbiIKKwkiCXZsZG1pYWVxIHIwISwge3MxNi1zMzF9CQkJCVxuIgorCSIJCQkJCQkJCQkJXG4iCisJIgltc3IgcHNwLCByMAkJCQkJCQlcbiIKKwkiCWlzYgkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJXG4iCisJI2lmZGVmIFdPUktBUk9VTkRfUE1VX0NNMDAxIC8qIFhNQzQwMDAgc3BlY2lmaWMgZXJyYXRhIHdvcmthcm91bmQuICovCisJCSNpZiBXT1JLQVJPVU5EX1BNVV9DTTAwMSA9PSAxCisJIgkJCXB1c2ggeyByMTQgfQkJCQlcbiIKKwkiCQkJcG9wIHsgcGMgfQkJCQkJXG4iCisJCSNlbmRpZgorCSNlbmRpZgorCSIJCQkJCQkJCQkJXG4iCisJIglieCByMTQJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJXG4iCisJIgkuYWxpZ24gNAkJCQkJCQlcbiIKKwkicHhDdXJyZW50VENCQ29uc3Q6IC53b3JkIHB4Q3VycmVudFRDQglcbiIKKwk6OiJpIihjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkpCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKQoreworCS8qIFRoZSBTeXNUaWNrIHJ1bnMgYXQgdGhlIGxvd2VzdCBpbnRlcnJ1cHQgcHJpb3JpdHksIHNvIHdoZW4gdGhpcyBpbnRlcnJ1cHQKKwlleGVjdXRlcyBhbGwgaW50ZXJydXB0cyBtdXN0IGJlIHVubWFza2VkLiAgVGhlcmUgaXMgdGhlcmVmb3JlIG5vIG5lZWQgdG8KKwlzYXZlIGFuZCB0aGVuIHJlc3RvcmUgdGhlIGludGVycnVwdCBtYXNrIHZhbHVlIGFzIGl0cyB2YWx1ZSBpcyBhbHJlYWR5CisJa25vd24uICovCisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXsKKwkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2suICovCisJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogQSBjb250ZXh0IHN3aXRjaCBpcyByZXF1aXJlZC4gIENvbnRleHQgc3dpdGNoaW5nIGlzIHBlcmZvcm1lZCBpbgorCQkJdGhlIFBlbmRTViBpbnRlcnJ1cHQuICBQZW5kIHRoZSBQZW5kU1YgaW50ZXJydXB0LiAqLworCQkJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsKKwkJfQorCX0KKwlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCisJX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKQorCXsKKwl1aW50MzJfdCB1bFJlbG9hZFZhbHVlLCB1bENvbXBsZXRlVGlja1BlcmlvZHMsIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHM7CisJVGlja1R5cGVfdCB4TW9kaWZpYWJsZUlkbGVUaW1lOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgU3lzVGljayByZWxvYWQgdmFsdWUgZG9lcyBub3Qgb3ZlcmZsb3cgdGhlIGNvdW50ZXIuICovCisJCWlmKCB4RXhwZWN0ZWRJZGxlVGltZSA+IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgKQorCQl7CisJCQl4RXhwZWN0ZWRJZGxlVGltZSA9IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3M7CisJCX0KKworCQkvKiBTdG9wIHRoZSBTeXNUaWNrIG1vbWVudGFyaWx5LiAgVGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IKKwkJaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiBiZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwKKwkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCisJCWtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgdGltZS4gKi8KKwkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyAmPSB+cG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOworCisJCS8qIENhbGN1bGF0ZSB0aGUgcmVsb2FkIHZhbHVlIHJlcXVpcmVkIHRvIHdhaXQgeEV4cGVjdGVkSWRsZVRpbWUKKwkJdGljayBwZXJpb2RzLiAgLTEgaXMgdXNlZCBiZWNhdXNlIHRoaXMgY29kZSB3aWxsIGV4ZWN1dGUgcGFydCB3YXkKKwkJdGhyb3VnaCBvbmUgb2YgdGhlIHRpY2sgcGVyaW9kcy4gKi8KKwkJdWxSZWxvYWRWYWx1ZSA9IHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgKyAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICogKCB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTCApICk7CisJCWlmKCB1bFJlbG9hZFZhbHVlID4gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKQorCQl7CisJCQl1bFJlbG9hZFZhbHVlIC09IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uOworCQl9CisKKwkJLyogRW50ZXIgYSBjcml0aWNhbCBzZWN0aW9uIGJ1dCBkb24ndCB1c2UgdGhlIHRhc2tFTlRFUl9DUklUSUNBTCgpCisJCW1ldGhvZCBhcyB0aGF0IHdpbGwgbWFzayBpbnRlcnJ1cHRzIHRoYXQgc2hvdWxkIGV4aXQgc2xlZXAgbW9kZS4gKi8KKwkJX19hc20gdm9sYXRpbGUoICJjcHNpZCBpIiA6OjogIm1lbW9yeSIgKTsKKwkJX19hc20gdm9sYXRpbGUoICJkc2IiICk7CisJCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworCisJCS8qIElmIGEgY29udGV4dCBzd2l0Y2ggaXMgcGVuZGluZyBvciBhIHRhc2sgaXMgd2FpdGluZyBmb3IgdGhlIHNjaGVkdWxlcgorCQl0byBiZSB1bnN1c3BlbmRlZCB0aGVuIGFiYW5kb24gdGhlIGxvdyBwb3dlciBlbnRyeS4gKi8KKwkJaWYoIGVUYXNrQ29uZmlybVNsZWVwTW9kZVN0YXR1cygpID09IGVBYm9ydFNsZWVwICkKKwkJeworCQkJLyogUmVzdGFydCBmcm9tIHdoYXRldmVyIGlzIGxlZnQgaW4gdGhlIGNvdW50IHJlZ2lzdGVyIHRvIGNvbXBsZXRlCisJCQl0aGlzIHRpY2sgcGVyaW9kLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUc7CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljay4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOworCisJCQkvKiBSZXNldCB0aGUgcmVsb2FkIHJlZ2lzdGVyIHRvIHRoZSB2YWx1ZSByZXF1aXJlZCBmb3Igbm9ybWFsIHRpY2sKKwkJCXBlcmlvZHMuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUw7CisKKwkJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIC0gc2VlIGNvbW1lbnRzIGFib3ZlIHRoZSBjcHNpZCBpbnN0cnVjdGlvbigpCisJCQlhYm92ZS4gKi8KKwkJCV9fYXNtIHZvbGF0aWxlKCAiY3BzaWUgaSIgOjo6ICJtZW1vcnkiICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTZXQgdGhlIG5ldyByZWxvYWQgdmFsdWUuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxSZWxvYWRWYWx1ZTsKKworCQkJLyogQ2xlYXIgdGhlIFN5c1RpY2sgY291bnQgZmxhZyBhbmQgc2V0IHRoZSBjb3VudCB2YWx1ZSBiYWNrIHRvCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFNsZWVwIHVudGlsIHNvbWV0aGluZyBoYXBwZW5zLiAgY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoKSBjYW4KKwkJCXNldCBpdHMgcGFyYW1ldGVyIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCBpdHMgaW1wbGVtZW50YXRpb24gY29udGFpbnMKKwkJCWl0cyBvd24gd2FpdCBmb3IgaW50ZXJydXB0IG9yIHdhaXQgZm9yIGV2ZW50IGluc3RydWN0aW9uLCBhbmQgc28gd2ZpCisJCQlzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGFnYWluLiAgSG93ZXZlciwgdGhlIG9yaWdpbmFsIGV4cGVjdGVkIGlkbGUKKwkJCXRpbWUgdmFyaWFibGUgbXVzdCByZW1haW4gdW5tb2RpZmllZCwgc28gYSBjb3B5IGlzIHRha2VuLiAqLworCQkJeE1vZGlmaWFibGVJZGxlVGltZSA9IHhFeHBlY3RlZElkbGVUaW1lOworCQkJY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoICZ4TW9kaWZpYWJsZUlkbGVUaW1lICk7CisJCQlpZiggeE1vZGlmaWFibGVJZGxlVGltZSA+IDAgKQorCQkJeworCQkJCV9fYXNtIHZvbGF0aWxlKCAiZHNiIiA6OjogIm1lbW9yeSIgKTsKKwkJCQlfX2FzbSB2b2xhdGlsZSggIndmaSIgKTsKKwkJCQlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKKwkJCX0KKwkJCWNvbmZpZ1BPU1RfU0xFRVBfUFJPQ0VTU0lORyggJnhFeHBlY3RlZElkbGVUaW1lICk7CisKKwkJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIHRvIGFsbG93IHRoZSBpbnRlcnJ1cHQgdGhhdCBicm91Z2h0IHRoZSBNQ1UKKwkJCW91dCBvZiBzbGVlcCBtb2RlIHRvIGV4ZWN1dGUgaW1tZWRpYXRlbHkuICBzZWUgY29tbWVudHMgYWJvdmUKKwkJCV9fZGlzYWJsZV9pbnRlcnJ1cHQoKSBjYWxsIGFib3ZlLiAqLworCQkJX19hc20gdm9sYXRpbGUoICJjcHNpZSBpIiA6OjogIm1lbW9yeSIgKTsKKwkJCV9fYXNtIHZvbGF0aWxlKCAiZHNiIiApOworCQkJX19hc20gdm9sYXRpbGUoICJpc2IiICk7CisKKwkJCS8qIERpc2FibGUgaW50ZXJydXB0cyBhZ2FpbiBiZWNhdXNlIHRoZSBjbG9jayBpcyBhYm91dCB0byBiZSBzdG9wcGVkCisJCQlhbmQgaW50ZXJydXB0cyB0aGF0IGV4ZWN1dGUgd2hpbGUgdGhlIGNsb2NrIGlzIHN0b3BwZWQgd2lsbCBpbmNyZWFzZQorCQkJYW55IHNsaXBwYWdlIGJldHdlZW4gdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUgUlRPUyBhbmQgY2FsZW5kYXIKKwkJCXRpbWUuICovCisJCQlfX2FzbSB2b2xhdGlsZSggImNwc2lkIGkiIDo6OiAibWVtb3J5IiApOworCQkJX19hc20gdm9sYXRpbGUoICJkc2IiICk7CisJCQlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKKworCQkJLyogRGlzYWJsZSB0aGUgU3lzVGljayBjbG9jayB3aXRob3V0IHJlYWRpbmcgdGhlCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHJlZ2lzdGVyIHRvIGVuc3VyZSB0aGUKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQgaXMgbm90IGNsZWFyZWQgaWYgaXQgaXMgc2V0LiAgQWdhaW4sCisJCQl0aGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvciBpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuCisJCQliZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwgaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55CisJCQlkcmlmdCBvZiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZSBrZXJuZWwgd2l0aCByZXNwZWN0IHRvIGNhbGVuZGFyCisJCQl0aW1lKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCApOworCisJCQkvKiBEZXRlcm1pbmUgaWYgdGhlIFN5c1RpY2sgY2xvY2sgaGFzIGFscmVhZHkgY291bnRlZCB0byB6ZXJvIGFuZAorCQkJYmVlbiBzZXQgYmFjayB0byB0aGUgY3VycmVudCByZWxvYWQgdmFsdWUgKHRoZSByZWxvYWQgYmFjayBiZWluZworCQkJY29ycmVjdCBmb3IgdGhlIGVudGlyZSBleHBlY3RlZCBpZGxlIHRpbWUpIG9yIGlmIHRoZSBTeXNUaWNrIGlzIHlldAorCQkJdG8gY291bnQgdG8gemVybyAoaW4gd2hpY2ggY2FzZSBhbiBpbnRlcnJ1cHQgb3RoZXIgdGhhbiB0aGUgU3lzVGljaworCQkJbXVzdCBoYXZlIGJyb3VnaHQgdGhlIHN5c3RlbSBvdXQgb2Ygc2xlZXAgbW9kZSkuICovCisJCQlpZiggKCBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHICYgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVCApICE9IDAgKQorCQkJeworCQkJCXVpbnQzMl90IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBpcyBhbHJlYWR5IHBlbmRpbmcsIGFuZCB0aGUgU3lzVGljayBjb3VudAorCQkJCXJlbG9hZGVkIHdpdGggdWxSZWxvYWRWYWx1ZS4gIFJlc2V0IHRoZQorCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgd2l0aCB3aGF0ZXZlciByZW1haW5zIG9mIHRoaXMgdGljaworCQkJCXBlcmlvZC4gKi8KKwkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICkgLSAoIHVsUmVsb2FkVmFsdWUgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHICk7CisKKwkJCQkvKiBEb24ndCBhbGxvdyBhIHRpbnkgdmFsdWUsIG9yIHZhbHVlcyB0aGF0IGhhdmUgc29tZWhvdworCQkJCXVuZGVyZmxvd2VkIGJlY2F1c2UgdGhlIHBvc3Qgc2xlZXAgaG9vayBkaWQgc29tZXRoaW5nCisJCQkJdGhhdCB0b29rIHRvbyBsb25nLiAqLworCQkJCWlmKCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA8IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uICkgfHwgKCB1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApICkKKwkJCQl7CisJCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKTsKKwkJCQl9CisKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogQXMgdGhlIHBlbmRpbmcgdGljayB3aWxsIGJlIHByb2Nlc3NlZCBhcyBzb29uIGFzIHRoaXMKKwkJCQlmdW5jdGlvbiBleGl0cywgdGhlIHRpY2sgdmFsdWUgbWFpbnRhaW5lZCBieSB0aGUgdGljayBpcyBzdGVwcGVkCisJCQkJZm9yd2FyZCBieSBvbmUgbGVzcyB0aGFuIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcuICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0geEV4cGVjdGVkSWRsZVRpbWUgLSAxVUw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogU29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHRpY2sgaW50ZXJydXB0IGVuZGVkIHRoZSBzbGVlcC4KKwkJCQlXb3JrIG91dCBob3cgbG9uZyB0aGUgc2xlZXAgbGFzdGVkIHJvdW5kZWQgdG8gY29tcGxldGUgdGljaworCQkJCXBlcmlvZHMgKG5vdCB0aGUgdWxSZWxvYWQgdmFsdWUgd2hpY2ggYWNjb3VudGVkIGZvciBwYXJ0CisJCQkJdGlja3MpLiAqLworCQkJCXVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgPSAoIHhFeHBlY3RlZElkbGVUaW1lICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUc7CisKKwkJCQkvKiBIb3cgbWFueSBjb21wbGV0ZSB0aWNrIHBlcmlvZHMgcGFzc2VkIHdoaWxlIHRoZSBwcm9jZXNzb3IKKwkJCQl3YXMgd2FpdGluZz8gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzIC8gdWxUaW1lckNvdW50c0Zvck9uZVRpY2s7CisKKwkJCQkvKiBUaGUgcmVsb2FkIHZhbHVlIGlzIHNldCB0byB3aGF0ZXZlciBmcmFjdGlvbiBvZiBhIHNpbmdsZSB0aWNrCisJCQkJcGVyaW9kIHJlbWFpbnMuICovCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKyAxVUwgKSAqIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgLSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzOworCQkJfQorCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2sgc28gaXQgcnVucyBmcm9tIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcKKwkJCWFnYWluLCB0aGVuIHNldCBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHIGJhY2sgdG8gaXRzIHN0YW5kYXJkCisJCQl2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKwkJCXZUYXNrU3RlcFRpY2soIHVsQ29tcGxldGVUaWNrUGVyaW9kcyApOworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBFeGl0IHdpdGggaW50ZXJycHRzIGVuYWJsZWQuICovCisJCQlfX2FzbSB2b2xhdGlsZSggImNwc2llIGkiIDo6OiAibWVtb3J5IiApOworCQl9CisJfQorCisjZW5kaWYgLyogI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNldHVwIHRoZSBzeXN0aWNrIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMgYXQgdGhlIHJlcXVpcmVkCisgKiBmcmVxdWVuY3kuCisgKi8KK19fYXR0cmlidXRlX18oKCB3ZWFrICkpIHZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkKK3sKKwkvKiBDYWxjdWxhdGUgdGhlIGNvbnN0YW50cyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlIHRpY2sgaW50ZXJydXB0LiAqLworCSNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJeworCQl1bFRpbWVyQ291bnRzRm9yT25lVGljayA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApOworCQl4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzID0gcG9ydE1BWF8yNF9CSVRfTlVNQkVSIC8gdWxUaW1lckNvdW50c0Zvck9uZVRpY2s7CisJCXVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SIC8gKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdTWVNUSUNLX0NMT0NLX0haICk7CisJfQorCSNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisJLyogU3RvcCBhbmQgY2xlYXIgdGhlIFN5c1RpY2suICovCisJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9IDBVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCisJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9ICggcG9ydE5WSUNfU1lTVElDS19DTEtfQklUIHwgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhpcyBpcyBhIG5ha2VkIGZ1bmN0aW9uLiAqLworc3RhdGljIHZvaWQgdlBvcnRFbmFibGVWRlAoIHZvaWQgKQoreworCV9fYXNtIHZvbGF0aWxlCisJKAorCQkiCWxkci53IHIwLCA9MHhFMDAwRUQ4OAkJXG4iIC8qIFRoZSBGUFUgZW5hYmxlIGJpdHMgYXJlIGluIHRoZSBDUEFDUi4gKi8KKwkJIglsZHIgcjEsIFtyMF0JCQkJXG4iCisJCSIJCQkJCQkJCVxuIgorCQkiCW9yciByMSwgcjEsICMoIDB4ZiA8PCAyMCApCVxuIiAvKiBFbmFibGUgQ1AxMCBhbmQgQ1AxMSBjb3Byb2Nlc3NvcnMsIHRoZW4gc2F2ZSBiYWNrLiAqLworCQkiCXN0ciByMSwgW3IwXQkJCQlcbiIKKwkJIglieCByMTQJCQkJCQkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKQorCXsKKwl1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CisJdWludDhfdCB1Y0N1cnJlbnRQcmlvcml0eTsKKworCQkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApIDo6ICJtZW1vcnkiICk7CisKKwkJLyogSXMgdGhlIGludGVycnVwdCBudW1iZXIgYSB1c2VyIGRlZmluZWQgaW50ZXJydXB0PyAqLworCQlpZiggdWxDdXJyZW50SW50ZXJydXB0ID49IHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKQorCQl7CisJCQkvKiBMb29rIHVwIHRoZSBpbnRlcnJ1cHQncyBwcmlvcml0eS4gKi8KKwkJCXVjQ3VycmVudFByaW9yaXR5ID0gcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVyc1sgdWxDdXJyZW50SW50ZXJydXB0IF07CisKKwkJCS8qIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZiBhIHNlcnZpY2Ugcm91dGluZSAoSVNSKSBmb3IKKwkJCWFuIGludGVycnVwdCB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYWJvdmUKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBjYWxscyBhbiBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJCWZ1bmN0aW9uLiAgSVNSIHNhZmUgRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBtdXN0ICpvbmx5KiBiZSBjYWxsZWQKKwkJCWZyb20gaW50ZXJydXB0cyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGF0IG9yIGJlbG93CisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCU51bWVyaWNhbGx5IGxvdyBpbnRlcnJ1cHQgcHJpb3JpdHkgbnVtYmVycyByZXByZXNlbnQgbG9naWNhbGx5IGhpZ2gKKwkJCWludGVycnVwdCBwcmlvcml0aWVzLCB0aGVyZWZvcmUgdGhlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQgbXVzdAorCQkJYmUgc2V0IHRvIGEgdmFsdWUgZXF1YWwgdG8gb3IgbnVtZXJpY2FsbHkgKmhpZ2hlciogdGhhbgorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlJbnRlcnJ1cHRzIHRoYXQJdXNlIHRoZSBGcmVlUlRPUyBBUEkgbXVzdCBub3QgYmUgbGVmdCBhdCB0aGVpcgorCQkJZGVmYXVsdCBwcmlvcml0eSBvZgl6ZXJvIGFzIHRoYXQgaXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgcHJpb3JpdHksCisJCQl3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSwKKwkJCWFuZAl0aGVyZWZvcmUgYWxzbyBndWFyYW50ZWVkIHRvIGJlIGludmFsaWQuCisKKwkJCUZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvIGVuc3VyZQorCQkJaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQkJVGhlIGZvbGxvd2luZyBsaW5rcyBwcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uOgorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbAorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvRkFRSGVscC5odG1sICovCisJCQljb25maWdBU1NFUlQoIHVjQ3VycmVudFByaW9yaXR5ID49IHVjTWF4U3lzQ2FsbFByaW9yaXR5ICk7CisJCX0KKworCQkvKiBQcmlvcml0eSBncm91cGluZzogIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykgYWxsb3dzIHRoZSBiaXRzCisJCXRoYXQgZGVmaW5lIGVhY2ggaW50ZXJydXB0J3MgcHJpb3JpdHkgdG8gYmUgc3BsaXQgYmV0d2VlbiBiaXRzIHRoYXQKKwkJZGVmaW5lIHRoZSBpbnRlcnJ1cHQncyBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzIGFuZCBiaXRzIHRoYXQgZGVmaW5lCisJCXRoZSBpbnRlcnJ1cHQncyBzdWItcHJpb3JpdHkuICBGb3Igc2ltcGxpY2l0eSBhbGwgYml0cyBtdXN0IGJlIGRlZmluZWQKKwkJdG8gYmUgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cy4gIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZgorCQl0aGlzIGlzIG5vdCB0aGUgY2FzZSAoaWYgc29tZSBiaXRzIHJlcHJlc2VudCBhIHN1Yi1wcmlvcml0eSkuCisKKwkJSWYgdGhlIGFwcGxpY2F0aW9uIG9ubHkgdXNlcyBDTVNJUyBsaWJyYXJpZXMgZm9yIGludGVycnVwdAorCQljb25maWd1cmF0aW9uIHRoZW4gdGhlIGNvcnJlY3Qgc2V0dGluZyBjYW4gYmUgYWNoaWV2ZWQgb24gYWxsIENvcnRleC1NCisJCWRldmljZXMgYnkgY2FsbGluZyBOVklDX1NldFByaW9yaXR5R3JvdXBpbmcoIDAgKTsgYmVmb3JlIHN0YXJ0aW5nIHRoZQorCQlzY2hlZHVsZXIuICBOb3RlIGhvd2V2ZXIgdGhhdCBzb21lIHZlbmRvciBzcGVjaWZpYyBwZXJpcGhlcmFsIGxpYnJhcmllcworCQlhc3N1bWUgYSBub24temVybyBwcmlvcml0eSBncm91cCBzZXR0aW5nLCBpbiB3aGljaCBjYXNlcyB1c2luZyBhIHZhbHVlCisJCW9mIHplcm8gd2lsbCByZXN1bHQgaW4gdW5wcmVkaWN0YWJsZSBiZWhhdmlvdXIuICovCisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0QUlSQ1JfUkVHICYgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sgKSA8PSB1bE1heFBSSUdST1VQVmFsdWUgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNEYvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTRGL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTUwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTRGL3BvcnRtYWNyby5oCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNjaGVkdWxlciB1dGlsaXRpZXMuICovCisjZGVmaW5lIHBvcnRZSUVMRCgpIAkJCQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLwkJCQkJCQkJXAorCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMgY29tcGxldGVseQlcCisJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLwkJCQkJCVwKKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CQkJCQkJCQkJCVwKKwlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsJCQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUX0JJVAkJKCAxVUwgPDwgMjhVTCApCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkgaWYoIHhTd2l0Y2hSZXF1aXJlZCAhPSBwZEZBTFNFICkgcG9ydFlJRUxEKCkKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuICovCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICk7CisjZGVmaW5lIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQkJdWxQb3J0UmFpc2VCQVNFUFJJKCkKKyNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKHgpCXZQb3J0U2V0QkFTRVBSSSh4KQorI2RlZmluZSBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkJCQkJdlBvcnRSYWlzZUJBU0VQUkkoKQorI2RlZmluZSBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQkJCQkJdlBvcnRTZXRCQVNFUFJJKDApCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQkJCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGFzayBmdW5jdGlvbiBtYWNyb3MgYXMgZGVzY3JpYmVkIG9uIHRoZSBGcmVlUlRPUy5vcmcgV0VCIHNpdGUuICBUaGVzZSBhcmUKK25vdCBuZWNlc3NhcnkgZm9yIHRvIHVzZSB0aGlzIHBvcnQuICBUaGV5IGFyZSBkZWZpbmVkIHNvIHRoZSBjb21tb24gZGVtbyBmaWxlcworKHdoaWNoIGJ1aWxkIHdpdGggYWxsIHRoZSBwb3J0cykgd2lsbCBidWlsZC4gKi8KKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRpY2tsZXNzIGlkbGUvbG93IHBvd2VyIGZ1bmN0aW9uYWxpdHkuICovCisjaWZuZGVmIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAKKwlleHRlcm4gdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApOworCSNkZWZpbmUgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCggeEV4cGVjdGVkSWRsZVRpbWUgKSB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggeEV4cGVjdGVkSWRsZVRpbWUgKQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIG9wdGltaXNhdGlvbnMuICovCisjaWZuZGVmIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTgorCSNkZWZpbmUgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIDEKKyNlbmRpZgorCisjaWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OID09IDEKKworCS8qIEdlbmVyaWMgaGVscGVyIGZ1bmN0aW9uLiAqLworCV9fYXR0cmlidXRlX18oICggYWx3YXlzX2lubGluZSApICkgc3RhdGljIGlubGluZSB1aW50OF90IHVjUG9ydENvdW50TGVhZGluZ1plcm9zKCB1aW50MzJfdCB1bEJpdG1hcCApCisJeworCXVpbnQ4X3QgdWNSZXR1cm47CisKKwkJX19hc20gdm9sYXRpbGUgKCAiY2x6ICUwLCAlMSIgOiAiPXIiICggdWNSZXR1cm4gKSA6ICJyIiAoIHVsQml0bWFwICkgOiAibWVtb3J5IiApOworCQlyZXR1cm4gdWNSZXR1cm47CisJfQorCisJLyogQ2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24uICovCisJI2lmKCBjb25maWdNQVhfUFJJT1JJVElFUyA+IDMyICkKKwkJI2Vycm9yIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiBjYW4gb25seSBiZSBzZXQgdG8gMSB3aGVuIGNvbmZpZ01BWF9QUklPUklUSUVTIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzMi4gIEl0IGlzIHZlcnkgcmFyZSB0aGF0IGEgc3lzdGVtIHJlcXVpcmVzIG1vcmUgdGhhbiAxMCB0byAxNSBkaWZmZXJlbmNlIHByaW9yaXRpZXMgYXMgdGFza3MgdGhhdCBzaGFyZSBhIHByaW9yaXR5IHdpbGwgdGltZSBzbGljZS4KKwkjZW5kaWYKKworCS8qIFN0b3JlL2NsZWFyIHRoZSByZWFkeSBwcmlvcml0aWVzIGluIGEgYml0IG1hcC4gKi8KKwkjZGVmaW5lIHBvcnRSRUNPUkRfUkVBRFlfUFJJT1JJVFkoIHV4UHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgKCB1eFJlYWR5UHJpb3JpdGllcyApIHw9ICggMVVMIDw8ICggdXhQcmlvcml0eSApICkKKwkjZGVmaW5lIHBvcnRSRVNFVF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgJj0gfiggMVVMIDw8ICggdXhQcmlvcml0eSApICkKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJI2RlZmluZSBwb3J0R0VUX0hJR0hFU1RfUFJJT1JJVFkoIHV4VG9wUHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgdXhUb3BQcmlvcml0eSA9ICggMzFVTCAtICggdWludDMyX3QgKSB1Y1BvcnRDb3VudExlYWRpbmdaZXJvcyggKCB1eFJlYWR5UHJpb3JpdGllcyApICkgKQorCisjZW5kaWYgLyogY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgY29uZmlnQVNTRVJUCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKTsKKwkjZGVmaW5lIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSAJdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCkKKyNlbmRpZgorCisvKiBwb3J0Tk9QKCkgaXMgbm90IHJlcXVpcmVkIGJ5IHRoaXMgcG9ydC4gKi8KKyNkZWZpbmUgcG9ydE5PUCgpCisKKyNkZWZpbmUgcG9ydElOTElORQlfX2lubGluZQorCisjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKKwkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUgaW5saW5lIF9fYXR0cmlidXRlX18oKCBhbHdheXNfaW5saW5lKSkKKyNlbmRpZgorCitwb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyBCYXNlVHlwZV90IHhQb3J0SXNJbnNpZGVJbnRlcnJ1cHQoIHZvaWQgKQorewordWludDMyX3QgdWxDdXJyZW50SW50ZXJydXB0OworQmFzZVR5cGVfdCB4UmV0dXJuOworCisJLyogT2J0YWluIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW50ZXJydXB0LiAqLworCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApIDo6ICJtZW1vcnkiICk7CisKKwlpZiggdWxDdXJyZW50SW50ZXJydXB0ID09IDAgKQorCXsKKwkJeFJldHVybiA9IHBkRkFMU0U7CisJfQorCWVsc2UKKwl7CisJCXhSZXR1cm4gPSBwZFRSVUU7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitwb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyB2b2lkIHZQb3J0UmFpc2VCQVNFUFJJKCB2b2lkICkKK3sKK3VpbnQzMl90IHVsTmV3QkFTRVBSSTsKKworCV9fYXNtIHZvbGF0aWxlCisJKAorCQkiCW1vdiAlMCwgJTEJCQkJCQkJCQkJCQlcbiIJXAorCQkiCW1zciBiYXNlcHJpLCAlMAkJCQkJCQkJCQkJXG4iIFwKKwkJIglpc2IJCQkJCQkJCQkJCQkJCVxuIiBcCisJCSIJZHNiCQkJCQkJCQkJCQkJCQlcbiIgXAorCQk6Ij1yIiAodWxOZXdCQVNFUFJJKSA6ICJpIiAoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApIDogIm1lbW9yeSIKKwkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgdWludDMyX3QgdWxQb3J0UmFpc2VCQVNFUFJJKCB2b2lkICkKK3sKK3VpbnQzMl90IHVsT3JpZ2luYWxCQVNFUFJJLCB1bE5ld0JBU0VQUkk7CisKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIgltcnMgJTAsIGJhc2VwcmkJCQkJCQkJCQkJCVxuIiBcCisJCSIJbW92ICUxLCAlMgkJCQkJCQkJCQkJCVxuIglcCisJCSIJbXNyIGJhc2VwcmksICUxCQkJCQkJCQkJCQlcbiIgXAorCQkiCWlzYgkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJIglkc2IJCQkJCQkJCQkJCQkJCVxuIiBcCisJCToiPXIiICh1bE9yaWdpbmFsQkFTRVBSSSksICI9ciIgKHVsTmV3QkFTRVBSSSkgOiAiaSIgKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA6ICJtZW1vcnkiCisJKTsKKworCS8qIFRoaXMgcmV0dXJuIHdpbGwgbm90IGJlIHJlYWNoZWQgYnV0IGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGNvbXBpbGVyCisJd2FybmluZ3MuICovCisJcmV0dXJuIHVsT3JpZ2luYWxCQVNFUFJJOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRTZXRCQVNFUFJJKCB1aW50MzJfdCB1bE5ld01hc2tWYWx1ZSApCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbXNyIGJhc2VwcmksICUwCSIgOjogInIiICggdWxOZXdNYXNrVmFsdWUgKSA6ICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTRfTVBVL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNF9NUFUvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODgxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTRfTVBVL3BvcnQuYwpAQCAtMCwwICsxLDgxNyBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmggZm9yIHRoZSBBUk0gQ00zIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCithbGwgdGhlIEFQSSBmdW5jdGlvbnMgdG8gdXNlIHRoZSBNUFUgd3JhcHBlcnMuICBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgordGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisjaWZuZGVmIF9fVkZQX0ZQX18KKwkjZXJyb3IgVGhpcyBwb3J0IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgcHJvamVjdCBvcHRpb25zIGFyZSBjb25maWd1cmVkIHRvIGVuYWJsZSBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0LgorI2VuZGlmCisKKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisjaWZuZGVmIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFoKKwkjZGVmaW5lIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogY29uZmlnQ1BVX0NMT0NLX0haCisJLyogRW5zdXJlIHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgYXQgdGhlIHNhbWUgZnJlcXVlbmN5IGFzIHRoZSBjb3JlLiAqLworCSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEsJKCAxVUwgPDwgMlVMICkKKyNlbHNlCisJLyogVGhlIHdheSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGlzIG5vdCBtb2RpZmllZCBpbiBjYXNlIGl0IGlzIG5vdCB0aGUgc2FtZQorCWFzIHRoZSBjb3JlLiAqLworCSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEsJKCAwICkKKyNlbmRpZgorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoZSBOVklDLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTAgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMl9SRUcJCQkJCSggKgkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjAgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDFjICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNfQ1RSTF9TVEFURV9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfTUVNX0ZBVUxUX0VOQUJMRQkJCQkoIDFVTCA8PCAxNlVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZSB0aGUgTVBVLiAqLworI2RlZmluZSBwb3J0TVBVX1RZUEVfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5MCApICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOUMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZEEwICkgKQorI2RlZmluZSBwb3J0TVBVX0NUUkxfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5NCApICkKKyNkZWZpbmUgcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFCQkJCSggOFVMIDw8IDhVTCApIC8qIDggcmVnaW9ucywgdW5pZmllZC4gKi8KKyNkZWZpbmUgcG9ydE1QVV9FTkFCTEUJCQkJCQkJKCAweDAxVUwgKQorI2RlZmluZSBwb3J0TVBVX0JBQ0tHUk9VTkRfRU5BQkxFCQkJCSggMVVMIDw8IDJVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX0VYRUNVVElPTl9TVEFSVF9BRERSRVNTCSggMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fVkFMSUQJCQkJCSggMHgxMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fRU5BQkxFCQkJCQkoIDB4MDFVTCApCisjZGVmaW5lIHBvcnRQRVJJUEhFUkFMU19TVEFSVF9BRERSRVNTCQkJMHg0MDAwMDAwMFVMCisjZGVmaW5lIHBvcnRQRVJJUEhFUkFMU19FTkRfQUREUkVTUwkJCQkweDVGRkZGRkZGVUwKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZSB0aGUgU3lzVGljay4gKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlQJCQkJCSggMHgwMDAwMDAwMlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEUJCQkJCSggMHgwMDAwMDAwMVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMjRVTCApCisjZGVmaW5lIHBvcnROVklDX1NWQ19QUkkJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSAtIDFVTCApIDw8IDI0VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgVkZQLiAqLworI2RlZmluZSBwb3J0RlBDQ1IJCQkJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWYzNFVMICkgLyogRmxvYXRpbmcgcG9pbnQgY29udGV4dCBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0QVNQRU5fQU5EX0xTUEVOX0JJVFMJCQkJKCAweDNVTCA8PCAzMFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBzdGFjay4gKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJCSggMHgwMTAwMDAwMFVMICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCQkJKCAweGZmZmZmZmZkVUwgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRAkJKCAweDAzICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9QUklWSUxFR0VECQkoIDB4MDIgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFuIGludGVycnVwdCBwcmlvcml0eS4gKi8KKyNkZWZpbmUgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUgkJKCAxNiApCisjZGVmaW5lIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgCSggMHhFMDAwRTNGMCApCisjZGVmaW5lIHBvcnRBSVJDUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBFRDBDICkgKQorI2RlZmluZSBwb3J0TUFYXzhfQklUX1ZBTFVFCQkJCQkoICggdWludDhfdCApIDB4ZmYgKQorI2RlZmluZSBwb3J0VE9QX0JJVF9PRl9CWVRFCQkJCQkoICggdWludDhfdCApIDB4ODAgKQorI2RlZmluZSBwb3J0TUFYX1BSSUdST1VQX0JJVFMJCQkJKCAoIHVpbnQ4X3QgKSA3ICkKKyNkZWZpbmUgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sJCQkJKCAweDA3VUwgPDwgOFVMICkKKyNkZWZpbmUgcG9ydFBSSUdST1VQX1NISUZUCQkJCQkoIDhVTCApCisKKy8qIE9mZnNldHMgaW4gdGhlIHN0YWNrIHRvIHRoZSBwYXJhbWV0ZXJzIHdoZW4gaW5zaWRlIHRoZSBTVkMgaGFuZGxlci4gKi8KKyNkZWZpbmUgcG9ydE9GRlNFVF9UT19QQwkJCQkJCSggNiApCisKKy8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCitoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KKyNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKgorICogQ29uZmlndXJlIGEgbnVtYmVyIG9mIHN0YW5kYXJkIE1QVSByZWdpb25zIHRoYXQgYXJlIHVzZWQgYnkgYWxsIHRhc2tzLgorICovCitzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBSZXR1cm4gdGhlIHNtYWxsZXN0IE1QVSByZWdpb24gc2l6ZSB0aGF0IGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIHdpbGwgZml0CisgKiBpbnRvLiAgVGhlIHJlZ2lvbiBzaXplIGlzIHJldHVybmVkIGFzIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBwcm9ncmFtbWVkCisgKiBpbnRvIHRoZSByZWdpb24gYXR0cmlidXRlIHJlZ2lzdGVyIGZvciB0aGF0IHJlZ2lvbi4KKyAqLworc3RhdGljIHVpbnQzMl90IHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1aW50MzJfdCB1bEFjdHVhbFNpemVJbkJ5dGVzICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIENoZWNrcyB0byBzZWUgaWYgYmVpbmcgY2FsbGVkIGZyb20gdGhlIGNvbnRleHQgb2YgYW4gdW5wcml2aWxlZ2VkIHRhc2ssIGFuZAorICogaWYgc28gcmFpc2VzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYW5kIHJldHVybnMgZmFsc2UgLSBvdGhlcndpc2UgZG9lcyBub3RoaW5nCisgKiBvdGhlciB0aGFuIHJldHVybiB0cnVlLgorICovCitCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSk7CisKKy8qCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzCisgKiBmaWxlIGlzIHdlYWsgdG8gYWxsb3cgYXBwbGljYXRpb24gd3JpdGVycyB0byBjaGFuZ2UgdGhlIHRpbWVyIHVzZWQgdG8KKyAqIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdC4KKyAqLwordm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKTsKKworLyoKKyAqIFN0YW5kYXJkIEZyZWVSVE9TIGV4Y2VwdGlvbiBoYW5kbGVycy4KKyAqLwordm9pZCB4UG9ydFBlbmRTVkhhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047Cit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKSAgX19hdHRyaWJ1dGVfXyAoKG9wdGltaXplKCIzIikpKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBTdGFydHMgdGhlIHNjaGVkdWxlciBieSByZXN0b3JpbmcgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgdG8gcnVuLgorICovCitzdGF0aWMgdm9pZCBwcnZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBDIHBvcnRpb24gb2YgdGhlIFNWQyBoYW5kbGVyLiAgVGhlIFNWQyBoYW5kbGVyIGlzIHNwbGl0IGJldHdlZW4gYW4gYXNtIGVudHJ5CisgKiBhbmQgYSBDIHdyYXBwZXIgZm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nIGFuZCBtYWludGVuYW5jZS4KKyAqLworc3RhdGljIHZvaWQgcHJ2U1ZDSGFuZGxlciggdWludDMyX3QgKnB1bFJlZ2lzdGVycyApIF9fYXR0cmlidXRlX18oKCBub2lubGluZSApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogRnVuY3Rpb24gdG8gZW5hYmxlIHRoZSBWRlAuCisgKi8KKyBzdGF0aWMgdm9pZCB2UG9ydEVuYWJsZVZGUCggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZwordmFyaWFibGUuICBOb3RlIHRoaXMgaXMgbm90IHNhdmVkIGFzIHBhcnQgb2YgdGhlIHRhc2sgY29udGV4dCBhcyBjb250ZXh0Citzd2l0Y2hlcyBjYW4gb25seSBvY2N1ciB3aGVuIHV4Q3JpdGljYWxOZXN0aW5nIGlzIHplcm8uICovCitzdGF0aWMgVUJhc2VUeXBlX3QgdXhDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhOworCisvKgorICogVXNlZCBieSB0aGUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIG1hY3JvIHRvIGVuc3VyZQorICogRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBhcmUgbm90IGNhbGxlZCBmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQKKyAqIGEgcHJpb3JpdHkgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorICovCisjaWYgKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwkgc3RhdGljIHVpbnQ4X3QgdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSAwOworCSBzdGF0aWMgdWludDMyX3QgdWxNYXhQUklHUk9VUFZhbHVlID0gMDsKKwkgc3RhdGljIGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzID0gKCBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgKSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2OworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMsIEJhc2VUeXBlX3QgeFJ1blByaXZpbGVnZWQgKQoreworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwlpbnRlcnJ1cHQuICovCisJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkvKiB4UFNSICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggKCBTdGFja1R5cGVfdCApIHB4Q29kZSApICYgcG9ydFNUQVJUX0FERFJFU1NfTUFTSzsJLyogUEMgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gMDsJLyogTFIgKi8KKwlweFRvcE9mU3RhY2sgLT0gNTsJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkvKiBSMCAqLworCisJLyogQSBzYXZlIG1ldGhvZCBpcyBiZWluZyB1c2VkIHRoYXQgcmVxdWlyZXMgZWFjaCB0YXNrIHRvIG1haW50YWluIGl0cworCW93biBleGVjIHJldHVybiB2YWx1ZS4gKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsKKworCXB4VG9wT2ZTdGFjayAtPSA5OwkvKiBSMTEsIFIxMCwgUjksIFI4LCBSNywgUjYsIFI1IGFuZCBSNC4gKi8KKworCWlmKCB4UnVuUHJpdmlsZWdlZCA9PSBwZFRSVUUgKQorCXsKKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfSUZfUFJJVklMRUdFRDsKKwl9CisJZWxzZQorCXsKKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfSUZfVU5QUklWSUxFR0VEOworCX0KKworCXJldHVybiBweFRvcE9mU3RhY2s7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKQoreworCS8qIEFzc3VtZXMgcHNwIHdhcyBpbiB1c2UuICovCisJX19hc20gdm9sYXRpbGUKKwkoCisJCSNpZm5kZWYgVVNFX1BST0NFU1NfU1RBQ0sJLyogQ29kZSBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGlmIGEgbWFpbigpIGlzIHVzaW5nIHRoZSBwcm9jZXNzIHN0YWNrLiAqLworCQkJIgl0c3QgbHIsICM0CQkJCQkJXG4iCisJCQkiCWl0ZSBlcQkJCQkJCQlcbiIKKwkJCSIJbXJzZXEgcjAsIG1zcAkJCQkJXG4iCisJCQkiCW1yc25lIHIwLCBwc3AJCQkJCVxuIgorCQkjZWxzZQorCQkJIgltcnMgcjAsIHBzcAkJCQkJCVxuIgorCQkjZW5kaWYKKwkJCSIJYiAlMAkJCQkJCQlcbiIKKwkJCTo6ImkiKHBydlNWQ0hhbmRsZXIpOiJyMCIsICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZTVkNIYW5kbGVyKAl1aW50MzJfdCAqcHVsUGFyYW0gKQorewordWludDhfdCB1Y1NWQ051bWJlcjsKKworCS8qIFRoZSBzdGFjayBjb250YWluczogcjAsIHIxLCByMiwgcjMsIHIxMiwgcjE0LCB0aGUgcmV0dXJuIGFkZHJlc3MgYW5kCisJeFBTUi4gIFRoZSBmaXJzdCBhcmd1bWVudCAocjApIGlzIHB1bFBhcmFtWyAwIF0uICovCisJdWNTVkNOdW1iZXIgPSAoICggdWludDhfdCAqICkgcHVsUGFyYW1bIHBvcnRPRkZTRVRfVE9fUEMgXSApWyAtMiBdOworCXN3aXRjaCggdWNTVkNOdW1iZXIgKQorCXsKKwkJY2FzZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgk6CXBvcnROVklDX1NZU1BSSTFfUkVHIHw9IHBvcnROVklDX1NWQ19QUkk7CisJCQkJCQkJCQkJCXBydlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soKTsKKwkJCQkJCQkJCQkJYnJlYWs7CisKKwkJY2FzZSBwb3J0U1ZDX1lJRUxECQkJCToJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsKKwkJCQkJCQkJCQkJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZAorCQkJCQkJCQkJCQlidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzIGNvbXBsZXRlbHkKKwkJCQkJCQkJCQkJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUKKwkJCQkJCQkJCQkJYXJjaGl0ZWN0dXJlLiAqLworCQkJCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CisJCQkJCQkJCQkJCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworCisJCQkJCQkJCQkJCWJyZWFrOworCisJCWNhc2UgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UJOglfX2FzbSB2b2xhdGlsZQorCQkJCQkJCQkJCQkoCisJCQkJCQkJCQkJCQkiCW1ycyByMSwgY29udHJvbAkJXG4iIC8qIE9idGFpbiBjdXJyZW50IGNvbnRyb2wgdmFsdWUuICovCisJCQkJCQkJCQkJCQkiCWJpYyByMSwgIzEJCQlcbiIgLyogU2V0IHByaXZpbGVnZSBiaXQuICovCisJCQkJCQkJCQkJCQkiCW1zciBjb250cm9sLCByMQkJXG4iIC8qIFdyaXRlIGJhY2sgbmV3IGNvbnRyb2wgdmFsdWUuICovCisJCQkJCQkJCQkJCQk6OjogInIxIiwgIm1lbW9yeSIKKwkJCQkJCQkJCQkJKTsKKwkJCQkJCQkJCQkJYnJlYWs7CisKKwkJZGVmYXVsdAkJCQkJCQk6CS8qIFVua25vd24gU1ZDIGNhbGwuICovCisJCQkJCQkJCQkJCWJyZWFrOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkKK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIglsZHIgcjAsID0weEUwMDBFRDA4CQkJCVxuIiAvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJCSIJbGRyIHIwLCBbcjBdCQkJCQlcbiIKKwkJIglsZHIgcjAsIFtyMF0JCQkJCVxuIgorCQkiCW1zciBtc3AsIHIwCQkJCQkJXG4iIC8qIFNldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwkJIglsZHIJcjMsIHB4Q3VycmVudFRDQkNvbnN0MgkJXG4iIC8qIFJlc3RvcmUgdGhlIGNvbnRleHQuICovCisJCSIJbGRyIHIxLCBbcjNdCQkJCQlcbiIKKwkJIglsZHIgcjAsIFtyMV0JCQkJCVxuIiAvKiBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgVENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwkJIglhZGQgcjEsIHIxLCAjNAkJCQkJXG4iIC8qIE1vdmUgb250byB0aGUgc2Vjb25kIGl0ZW0gaW4gdGhlIFRDQi4uLiAqLworCQkiCWxkciByMiwgPTB4ZTAwMGVkOWMJCQkJXG4iIC8qIFJlZ2lvbiBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIuICovCisJCSIJbGRtaWEgcjEhLCB7cjQtcjExfQkJCQlcbiIgLyogUmVhZCA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwkJIglzdG1pYSByMiEsIHtyNC1yMTF9CQkJCVxuIiAvKiBXcml0ZSA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwkJIglsZG1pYSByMCEsIHtyMy1yMTEsIHIxNH0JCVxuIiAvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCBvbiBleGNlcHRpb24gZW50cnkuICovCisJCSIJbXNyIGNvbnRyb2wsIHIzCQkJCQlcbiIKKwkJIgltc3IgcHNwLCByMAkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSB0YXNrIHN0YWNrIHBvaW50ZXIuICovCisJCSIJbW92IHIwLCAjMAkJCQkJCVxuIgorCQkiCW1zcgliYXNlcHJpLCByMAkJCQkJXG4iCisJCSIJYnggcjE0CQkJCQkJCVxuIgorCQkiCQkJCQkJCQkJXG4iCisJCSIJLmFsaWduIDQJCQkJCQlcbiIKKwkJInB4Q3VycmVudFRDQkNvbnN0MjogLndvcmQgcHhDdXJyZW50VENCCVxuIgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApCit7CisJLyogY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLiAgU2VlCisJaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCAqLworCWNvbmZpZ0FTU0VSVCggKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSApOworCisJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwl7CisJCXZvbGF0aWxlIHVpbnQzMl90IHVsT3JpZ2luYWxQcmlvcml0eTsKKwkJdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSAoIHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCApICggcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiArIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKTsKKwkJdm9sYXRpbGUgdWludDhfdCB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHByaW9yaXR5IGZyb20gd2hpY2ggSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCWZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiAgSVNSIHNhZmUgZnVuY3Rpb25zIGFyZSB0aG9zZSB0aGF0IGVuZCBpbgorCQkiRnJvbUlTUiIuICBGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0bworCQllbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQlTYXZlIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkgdmFsdWUgdGhhdCBpcyBhYm91dCB0byBiZSBjbG9iYmVyZWQuICovCisJCXVsT3JpZ2luYWxQcmlvcml0eSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYXZhaWxhYmxlLiAgRmlyc3Qgd3JpdGUgdG8gYWxsCisJCXBvc3NpYmxlIGJpdHMuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gcG9ydE1BWF84X0JJVF9WQUxVRTsKKworCQkvKiBSZWFkIHRoZSB2YWx1ZSBiYWNrIHRvIHNlZSBob3cgbWFueSBiaXRzIHN0dWNrLiAqLworCQl1Y01heFByaW9yaXR5VmFsdWUgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCSNpZmRlZiBfX05WSUNfUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBDTVNJUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IF9fTlZJQ19QUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkjaWZkZWYgY29uZmlnUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBGcmVlUlRPUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IGNvbmZpZ1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUga2VybmVsLCBhbmQgdGhlIFNWQworCWhhbmRsZXIgaGlnaGVyIHByaW9yaXR5IHNvIGl0IGNhbiBiZSB1c2VkIHRvIGV4aXQgYSBjcml0aWNhbCBzZWN0aW9uICh3aGVyZQorCWxvd2VyIHByaW9yaXRpZXMgYXJlIG1hc2tlZCkuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIENvbmZpZ3VyZSB0aGUgcmVnaW9ucyBpbiB0aGUgTVBVIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgdGFza3MuICovCisJcHJ2U2V0dXBNUFUoKTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIEVuc3VyZSB0aGUgVkZQIGlzIGVuYWJsZWQgLSBpdCBzaG91bGQgYmUgYW55d2F5LiAqLworCXZQb3J0RW5hYmxlVkZQKCk7CisKKwkvKiBMYXp5IHNhdmUgYWx3YXlzLiAqLworCSooIHBvcnRGUENDUiApIHw9IHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUzsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAgVGhpcyBhbHNvIGNsZWFycyB0aGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoZSBGUFUgaXMKKwlpbiB1c2UgaW4gY2FzZSB0aGUgRlBVIHdhcyB1c2VkIGJlZm9yZSB0aGUgc2NoZWR1bGVyIHdhcyBzdGFydGVkIC0gd2hpY2gKKwl3b3VsZCBvdGhlcndpc2UgcmVzdWx0IGluIHRoZSB1bm5lY2Vzc2FyeSBsZWF2aW5nIG9mIHNwYWNlIGluIHRoZSBTVkMgc3RhY2sKKwlmb3IgbGF6eSBzYXZpbmcgb2YgRlBVIHJlZ2lzdGVycy4gKi8KKwlfX2FzbSB2b2xhdGlsZSgKKwkJCQkJIiBsZHIgcjAsID0weEUwMDBFRDA4IAlcbiIgLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCQkJCQkiIGxkciByMCwgW3IwXSAJCQlcbiIKKwkJCQkJIiBsZHIgcjAsIFtyMF0gCQkJXG4iCisJCQkJCSIgbXNyIG1zcCwgcjAJCQlcbiIgLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCQkJCQkiIG1vdiByMCwgIzAJCQlcbiIgLyogQ2xlYXIgdGhlIGJpdCB0aGF0IGluZGljYXRlcyB0aGUgRlBVIGlzIGluIHVzZSwgc2VlIGNvbW1lbnQgYWJvdmUuICovCisJCQkJCSIgbXNyIGNvbnRyb2wsIHIwCQlcbiIKKwkJCQkJIiBjcHNpZSBpCQkJCVxuIiAvKiBHbG9iYWxseSBlbmFibGUgaW50ZXJydXB0cy4gKi8KKwkJCQkJIiBjcHNpZSBmCQkJCVxuIgorCQkJCQkiIGRzYgkJCQkJXG4iCisJCQkJCSIgaXNiCQkJCQlcbiIKKwkJCQkJIiBzdmMgJTAJCQkJXG4iIC8qIFN5c3RlbSBjYWxsIHRvIHN0YXJ0IGZpcnN0IHRhc2suICovCisJCQkJCSIgbm9wCQkJCQlcbiIKKwkJCQkJOjogImkiIChwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUikgOiAibWVtb3J5IiApOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSEgKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXV4Q3JpdGljYWxOZXN0aW5nKys7CisKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyApOworCXV4Q3JpdGljYWxOZXN0aW5nLS07CisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDAgKQorCXsKKwkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisJfQorCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBUaGlzIGlzIGEgbmFrZWQgZnVuY3Rpb24uICovCisKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIgltcnMgcjAsIHBzcAkJCQkJCQlcbiIKKwkJIglpc2IJCQkJCQkJCQlcbiIKKwkJIgkJCQkJCQkJCQlcbiIKKwkJIglsZHIJcjMsIHB4Q3VycmVudFRDQkNvbnN0CQkJXG4iIC8qIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgVENCLiAqLworCQkiCWxkcglyMiwgW3IzXQkJCQkJCVxuIgorCQkiCQkJCQkJCQkJCVxuIgorCQkiCXRzdCByMTQsICMweDEwCQkJCQkJXG4iIC8qIElzIHRoZSB0YXNrIHVzaW5nIHRoZSBGUFUgY29udGV4dD8gIElmIHNvLCBwdXNoIGhpZ2ggdmZwIHJlZ2lzdGVycy4gKi8KKwkJIglpdCBlcQkJCQkJCQkJXG4iCisJCSIJdnN0bWRiZXEgcjAhLCB7czE2LXMzMX0JCQkJXG4iCisJCSIJCQkJCQkJCQkJXG4iCisJCSIJbXJzIHIxLCBjb250cm9sCQkJCQkJXG4iCisJCSIJc3RtZGIgcjAhLCB7cjEsIHI0LXIxMSwgcjE0fQkJXG4iIC8qIFNhdmUgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMuICovCisJCSIJc3RyIHIwLCBbcjJdCQkJCQkJXG4iIC8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW50byB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBUQ0IuICovCisJCSIJCQkJCQkJCQkJXG4iCisJCSIJc3RtZGIgc3AhLCB7cjAsIHIzfQkJCQkJXG4iCisJCSIJbW92IHIwLCAlMAkJCQkJCQlcbiIKKwkJIgltc3IgYmFzZXByaSwgcjAJCQkJCQlcbiIKKwkJIglkc2IJCQkJCQkJCQlcbiIKKwkJIglpc2IJCQkJCQkJCQlcbiIKKwkJIglibCB2VGFza1N3aXRjaENvbnRleHQJCQkJXG4iCisJCSIJbW92IHIwLCAjMAkJCQkJCQlcbiIKKwkJIgltc3IgYmFzZXByaSwgcjAJCQkJCQlcbiIKKwkJIglsZG1pYSBzcCEsIHtyMCwgcjN9CQkJCQlcbiIKKwkJIgkJCQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgY29udGV4dC4gKi8KKwkJIglsZHIgcjEsIFtyM10JCQkJCQlcbiIKKwkJIglsZHIgcjAsIFtyMV0JCQkJCQlcbiIgLyogVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJCSIJYWRkIHIxLCByMSwgIzQJCQkJCQlcbiIgLyogTW92ZSBvbnRvIHRoZSBzZWNvbmQgaXRlbSBpbiB0aGUgVENCLi4uICovCisJCSIJbGRyIHIyLCA9MHhlMDAwZWQ5YwkJCQkJXG4iIC8qIFJlZ2lvbiBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIuICovCisJCSIJbGRtaWEgcjEhLCB7cjQtcjExfQkJCQkJXG4iIC8qIFJlYWQgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJCSIJc3RtaWEgcjIhLCB7cjQtcjExfQkJCQkJXG4iIC8qIFdyaXRlIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCQkiCWxkbWlhIHIwISwge3IzLXIxMSwgcjE0fQkJCVxuIiAvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCBvbiBleGNlcHRpb24gZW50cnkuICovCisJCSIJbXNyIGNvbnRyb2wsIHIzCQkJCQkJXG4iCisJCSIJCQkJCQkJCQkJXG4iCisJCSIJdHN0IHIxNCwgIzB4MTAJCQkJCQlcbiIgLyogSXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHBvcCB0aGUgaGlnaCB2ZnAgcmVnaXN0ZXJzIHRvby4gKi8KKwkJIglpdCBlcQkJCQkJCQkJXG4iCisJCSIJdmxkbWlhZXEgcjAhLCB7czE2LXMzMX0JCQkJXG4iCisJCSIJCQkJCQkJCQkJXG4iCisJCSIJbXNyIHBzcCwgcjAJCQkJCQkJXG4iCisJCSIJYnggcjE0CQkJCQkJCQlcbiIKKwkJIgkJCQkJCQkJCQlcbiIKKwkJIgkuYWxpZ24gNAkJCQkJCQlcbiIKKwkJInB4Q3VycmVudFRDQkNvbnN0OiAud29yZCBweEN1cnJlbnRUQ0IJXG4iCisJCTo6ImkiKGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSkKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApCit7Cit1aW50MzJfdCB1bER1bW15OworCisJdWxEdW1teSA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCS8qIEluY3JlbWVudCB0aGUgUlRPUyB0aWNrLiAqLworCQlpZiggeFRhc2tJbmNyZW1lbnRUaWNrKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIFBlbmQgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkJCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCX0KKwl9CisJcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCB1bER1bW15ICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNldHVwIHRoZSBzeXN0aWNrIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMgYXQgdGhlIHJlcXVpcmVkCisgKiBmcmVxdWVuY3kuCisgKi8KK19fYXR0cmlidXRlX18oKCB3ZWFrICkpIHZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkKK3sKKwkvKiBTdG9wIGFuZCBjbGVhciB0aGUgU3lzVGljay4gKi8KKwlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gMFVMOworCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKSAtIDFVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gKCBwb3J0TlZJQ19TWVNUSUNLX0NMSyB8IHBvcnROVklDX1NZU1RJQ0tfSU5UIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEUgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGlzIGlzIGEgbmFrZWQgZnVuY3Rpb24uICovCitzdGF0aWMgdm9pZCB2UG9ydEVuYWJsZVZGUCggdm9pZCApCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbGRyLncgcjAsID0weEUwMDBFRDg4CQlcbiIgLyogVGhlIEZQVSBlbmFibGUgYml0cyBhcmUgaW4gdGhlIENQQUNSLiAqLworCQkiCWxkciByMSwgW3IwXQkJCQlcbiIKKwkJIgkJCQkJCQkJXG4iCisJCSIJb3JyIHIxLCByMSwgIyggMHhmIDw8IDIwICkJXG4iIC8qIEVuYWJsZSBDUDEwIGFuZCBDUDExIGNvcHJvY2Vzc29ycywgdGhlbiBzYXZlIGJhY2suICovCisJCSIJc3RyIHIxLCBbcjBdCQkJCVxuIgorCQkiCWJ4IHIxNAkJCQkJCSIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkKK3sKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fW107CitleHRlcm4gdWludDMyX3QgX19GTEFTSF9zZWdtZW50X3N0YXJ0X19bXTsKK2V4dGVybiB1aW50MzJfdCBfX0ZMQVNIX3NlZ21lbnRfZW5kX19bXTsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fW107CitleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfZW5kX19bXTsKKworCS8qIENoZWNrIHRoZSBleHBlY3RlZCBNUFUgaXMgcHJlc2VudC4gKi8KKwlpZiggcG9ydE1QVV9UWVBFX1JFRyA9PSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUgKQorCXsKKwkJLyogRmlyc3Qgc2V0dXAgdGhlIGVudGlyZSBmbGFzaCBmb3IgdW5wcml2aWxlZ2VkIHJlYWQgb25seSBhY2Nlc3MuICovCisJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJCQkJCQkoIHBvcnRVTlBSSVZJTEVHRURfRkxBU0hfUkVHSU9OICk7CisKKwkJcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRyA9CSggcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCQkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9lbmRfXyAtICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogU2V0dXAgdGhlIGZpcnN0IDE2SyBmb3IgcHJpdmlsZWdlZCBvbmx5IGFjY2VzcyAoZXZlbiB0aG91Z2ggbGVzcworCQl0aGFuIDEwSyBpcyBhY3R1YWxseSBiZWluZyB1c2VkKS4gIFRoaXMgaXMgd2hlcmUgdGhlIGtlcm5lbCBjb2RlIGlzCisJCXBsYWNlZC4gKi8KKwkJcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRyA9CSggKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9zdGFydF9fICkgfCAvKiBCYXNlIGFkZHJlc3MuICovCisJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkJCQkJCSggcG9ydFBSSVZJTEVHRURfRkxBU0hfUkVHSU9OICk7CisKKwkJcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRyA9CSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQkJCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfXyAtICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogU2V0dXAgdGhlIHByaXZpbGVnZWQgZGF0YSBSQU0gcmVnaW9uLiAgVGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGRhdGEKKwkJaXMgcGxhY2VkLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJCQkJCQkoIHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT04gKTsKKworCQlwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHID0JKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQkJCQkJCQlwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fIC0gKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBCeSBkZWZhdWx0IGFsbG93IGV2ZXJ5dGhpbmcgdG8gYWNjZXNzIHRoZSBnZW5lcmFsIHBlcmlwaGVyYWxzLiAgVGhlCisJCXN5c3RlbSBwZXJpcGhlcmFscyBhbmQgcmVnaXN0ZXJzIGFyZSBwcm90ZWN0ZWQuICovCisJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoIHBvcnRQRVJJUEhFUkFMU19TVEFSVF9BRERSRVNTICkgfAorCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJCQkJCQkoIHBvcnRHRU5FUkFMX1BFUklQSEVSQUxTX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgfCBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICkgfAorCQkJCQkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHBvcnRQRVJJUEhFUkFMU19FTkRfQUREUkVTUyAtIHBvcnRQRVJJUEhFUkFMU19TVEFSVF9BRERSRVNTICkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBFbmFibGUgdGhlIG1lbW9yeSBmYXVsdCBleGNlcHRpb24uICovCisJCXBvcnROVklDX1NZU19DVFJMX1NUQVRFX1JFRyB8PSBwb3J0TlZJQ19NRU1fRkFVTFRfRU5BQkxFOworCisJCS8qIEVuYWJsZSB0aGUgTVBVIHdpdGggdGhlIGJhY2tncm91bmQgcmVnaW9uIGNvbmZpZ3VyZWQuICovCisJCXBvcnRNUFVfQ1RSTF9SRUcgfD0gKCBwb3J0TVBVX0VOQUJMRSB8IHBvcnRNUFVfQkFDS0dST1VORF9FTkFCTEUgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVpbnQzMl90IHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1aW50MzJfdCB1bEFjdHVhbFNpemVJbkJ5dGVzICkKK3sKK3VpbnQzMl90IHVsUmVnaW9uU2l6ZSwgdWxSZXR1cm5WYWx1ZSA9IDQ7CisKKwkvKiAzMiBpcyB0aGUgc21hbGxlc3QgcmVnaW9uIHNpemUsIDMxIGlzIHRoZSBsYXJnZXN0IHZhbGlkIHZhbHVlIGZvcgorCXVsUmV0dXJuVmFsdWUuICovCisJZm9yKCB1bFJlZ2lvblNpemUgPSAzMlVMOyB1bFJldHVyblZhbHVlIDwgMzFVTDsgKCB1bFJlZ2lvblNpemUgPDw9IDFVTCApICkKKwl7CisJCWlmKCB1bEFjdHVhbFNpemVJbkJ5dGVzIDw9IHVsUmVnaW9uU2l6ZSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJeworCQkJdWxSZXR1cm5WYWx1ZSsrOworCQl9CisJfQorCisJLyogU2hpZnQgdGhlIGNvZGUgYnkgb25lIGJlZm9yZSByZXR1cm5pbmcgc28gaXQgY2FuIGJlIHdyaXR0ZW4gZGlyZWN0bHkKKwlpbnRvIHRoZSB0aGUgY29ycmVjdCBiaXQgcG9zaXRpb24gb2YgdGhlIGF0dHJpYnV0ZSByZWdpc3Rlci4gKi8KKwlyZXR1cm4gKCB1bFJldHVyblZhbHVlIDw8IDFVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJXG4iCisJCSIJdHN0IHIwLCAjMQkJCQkJCQlcbiIgLyogSXMgdGhlIHRhc2sgcnVubmluZyBwcml2aWxlZ2VkPyAqLworCQkiCWl0dGUgbmUJCQkJCQkJCVxuIgorCQkiCW1vdm5lIHIwLCAjMAkJCQkJCVxuIiAvKiBDT05UUk9MWzBdIT0wLCByZXR1cm4gZmFsc2UuICovCisJCSIJc3ZjbmUgJTAJCQkJCQkJXG4iIC8qIFN3aXRjaCB0byBwcml2aWxlZ2VkLiAqLworCQkiCW1vdmVxIHIwLCAjMQkJCQkJCVxuIiAvKiBDT05UUk9MWzBdPT0wLCByZXR1cm4gdHJ1ZS4gKi8KKwkJIglieCBscgkJCQkJCQkJXG4iCisJCTo6ICJpIiAocG9ydFNWQ19SQUlTRV9QUklWSUxFR0UpIDogInIwIiwgIm1lbW9yeSIKKwkpOworCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFN0b3JlVGFza01QVVNldHRpbmdzKCB4TVBVX1NFVFRJTkdTICp4TVBVU2V0dGluZ3MsIGNvbnN0IHN0cnVjdCB4TUVNT1JZX1JFR0lPTiAqIGNvbnN0IHhSZWdpb25zLCBTdGFja1R5cGVfdCAqcHhCb3R0b21PZlN0YWNrLCB1aW50MzJfdCB1bFN0YWNrRGVwdGggKQoreworZXh0ZXJuIHVpbnQzMl90IF9fU1JBTV9zZWdtZW50X3N0YXJ0X19bXTsKK2V4dGVybiB1aW50MzJfdCBfX1NSQU1fc2VnbWVudF9lbmRfX1tdOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X19bXTsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfX1tdOworaW50MzJfdCBsSW5kZXg7Cit1aW50MzJfdCB1bDsKKworCWlmKCB4UmVnaW9ucyA9PSBOVUxMICkKKwl7CisJCS8qIE5vIE1QVSByZWdpb25zIGFyZSBzcGVjaWZpZWQgc28gYWxsb3cgYWNjZXNzIHRvIGFsbCBSQU0uICovCisJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMCBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPQorCQkJCSggKCB1aW50MzJfdCApIF9fU1JBTV9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCSggcG9ydFNUQUNLX1JFR0lPTiApOworCisJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMCBdLnVsUmVnaW9uQXR0cmlidXRlID0KKwkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCAoIHVpbnQzMl90ICkgX19TUkFNX3NlZ21lbnRfZW5kX18gLSAoIHVpbnQzMl90ICkgX19TUkFNX3NlZ21lbnRfc3RhcnRfXyApICkgfAorCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogUmUtaW5zdGF0ZSB0aGUgcHJpdmlsZWdlZCBvbmx5IFJBTSByZWdpb24gYXMgeFJlZ2lvblsgMCBdIHdpbGwgaGF2ZQorCQlqdXN0IHJlbW92ZWQgdGhlIHByaXZpbGVnZWQgb25seSBwYXJhbWV0ZXJzLiAqLworCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDEgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0KKwkJCQkoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fICkgfCAvKiBCYXNlIGFkZHJlc3MuICovCisJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkoIHBvcnRTVEFDS19SRUdJT04gKyAxICk7CisKKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAxIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFICkgfAorCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXyAtICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fICkgfAorCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogSW52YWxpZGF0ZSBhbGwgb3RoZXIgcmVnaW9ucy4gKi8KKwkJZm9yKCB1bCA9IDI7IHVsIDw9IHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlM7IHVsKysgKQorCQl7CisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9ICggcG9ydFNUQUNLX1JFR0lPTiArIHVsICkgfCBwb3J0TVBVX1JFR0lPTl9WQUxJRDsKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9IDBVTDsKKwkJfQorCX0KKwllbHNlCisJeworCQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHRhc2sgaXMgY3JlYXRlZCAtIGluCisJCXdoaWNoIGNhc2UgdGhlIHN0YWNrIHJlZ2lvbiBwYXJhbWV0ZXJzIHdpbGwgYmUgdmFsaWQuICBBdCBhbGwgb3RoZXIKKwkJdGltZXMgdGhlIHN0YWNrIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgdmFsaWQgYW5kIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUKKwkJc3RhY2sgcmVnaW9uIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZC4gKi8KKwkJaWYoIHVsU3RhY2tEZXB0aCA+IDAgKQorCQl7CisJCQkvKiBEZWZpbmUgdGhlIHJlZ2lvbiB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIHN0YWNrLiAqLworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJCSggKCB1aW50MzJfdCApIHB4Qm90dG9tT2ZTdGFjayApIHwKKwkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJKCBwb3J0U1RBQ0tfUkVHSU9OICk7IC8qIFJlZ2lvbiBudW1iZXIuICovCisKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMCBdLnVsUmVnaW9uQXR0cmlidXRlID0KKwkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFICkgfCAvKiBSZWFkIGFuZCB3cml0ZS4gKi8KKwkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggdWxTdGFja0RlcHRoICogKCB1aW50MzJfdCApIHNpemVvZiggU3RhY2tUeXBlX3QgKSApICkgfAorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCQl9CisKKwkJbEluZGV4ID0gMDsKKworCQlmb3IoIHVsID0gMTsgdWwgPD0gcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUzsgdWwrKyApCisJCXsKKwkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXSApLnVsTGVuZ3RoSW5CeXRlcyA+IDBVTCApCisJCQl7CisJCQkJLyogVHJhbnNsYXRlIHRoZSBnZW5lcmljIHJlZ2lvbiBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbgorCQkJCXhSZWdpb25zIGludG8gdGhlIENNMyBzcGVjaWZpYyBNUFUgc2V0dGluZ3MgdGhhdCBhcmUgdGhlbgorCQkJCXN0b3JlZCBpbiB4TVBVU2V0dGluZ3MuICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPQorCQkJCQkJKCAoIHVpbnQzMl90ICkgeFJlZ2lvbnNbIGxJbmRleCBdLnB2QmFzZUFkZHJlc3MgKSB8CisJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKTsgLyogUmVnaW9uIG51bWJlci4gKi8KKworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9CisJCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB4UmVnaW9uc1sgbEluZGV4IF0udWxMZW5ndGhJbkJ5dGVzICkgKSB8CisJCQkJCQkoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgKSB8CisJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIEludmFsaWRhdGUgdGhlIHJlZ2lvbi4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9ICggcG9ydFNUQUNLX1JFR0lPTiArIHVsICkgfCBwb3J0TVBVX1JFR0lPTl9WQUxJRDsKKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25BdHRyaWJ1dGUgPSAwVUw7CisJCQl9CisKKwkJCWxJbmRleCsrOworCQl9CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApCisJeworCXVpbnQzMl90IHVsQ3VycmVudEludGVycnVwdDsKKwl1aW50OF90IHVjQ3VycmVudFByaW9yaXR5OworCisJCS8qIE9idGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGludGVycnVwdC4gKi8KKwkJX19hc20gdm9sYXRpbGUoICJtcnMgJTAsIGlwc3IiIDogIj1yIiggdWxDdXJyZW50SW50ZXJydXB0ICkgOjogIm1lbW9yeSIgKTsKKworCQkvKiBJcyB0aGUgaW50ZXJydXB0IG51bWJlciBhIHVzZXIgZGVmaW5lZCBpbnRlcnJ1cHQ/ICovCisJCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPj0gcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApCisJCXsKKwkJCS8qIExvb2sgdXAgdGhlIGludGVycnVwdCdzIHByaW9yaXR5LiAqLworCQkJdWNDdXJyZW50UHJpb3JpdHkgPSBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzWyB1bEN1cnJlbnRJbnRlcnJ1cHQgXTsKKworCQkJLyogVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmIGEgc2VydmljZSByb3V0aW5lIChJU1IpIGZvcgorCQkJYW4gaW50ZXJydXB0IHRoYXQgaGFzIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhYm92ZQorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIGNhbGxzIGFuIElTUiBzYWZlIEZyZWVSVE9TIEFQSQorCQkJZnVuY3Rpb24uICBJU1Igc2FmZSBGcmVlUlRPUyBBUEkgZnVuY3Rpb25zIG11c3QgKm9ubHkqIGJlIGNhbGxlZAorCQkJZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgYmVsb3cKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJTnVtZXJpY2FsbHkgbG93IGludGVycnVwdCBwcmlvcml0eSBudW1iZXJzIHJlcHJlc2VudCBsb2dpY2FsbHkgaGlnaAorCQkJaW50ZXJydXB0IHByaW9yaXRpZXMsIHRoZXJlZm9yZSB0aGUgcHJpb3JpdHkgb2YgdGhlIGludGVycnVwdCBtdXN0CisJCQliZSBzZXQgdG8gYSB2YWx1ZSBlcXVhbCB0byBvciBudW1lcmljYWxseSAqaGlnaGVyKiB0aGFuCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCUludGVycnVwdHMgdGhhdAl1c2UgdGhlIEZyZWVSVE9TIEFQSSBtdXN0IG5vdCBiZSBsZWZ0IGF0IHRoZWlyCisJCQlkZWZhdWx0IHByaW9yaXR5IG9mCXplcm8gYXMgdGhhdCBpcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBwcmlvcml0eSwKKwkJCXdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLAorCQkJYW5kCXRoZXJlZm9yZSBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgaW52YWxpZC4KKworCQkJRnJlZVJUT1MgbWFpbnRhaW5zIHNlcGFyYXRlIHRocmVhZCBhbmQgSVNSIEFQSSBmdW5jdGlvbnMgdG8gZW5zdXJlCisJCQlpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCQlUaGUgZm9sbG93aW5nIGxpbmtzIHByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb246CisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9GQVFIZWxwLmh0bWwgKi8KKwkJCWNvbmZpZ0FTU0VSVCggdWNDdXJyZW50UHJpb3JpdHkgPj0gdWNNYXhTeXNDYWxsUHJpb3JpdHkgKTsKKwkJfQorCisJCS8qIFByaW9yaXR5IGdyb3VwaW5nOiAgVGhlIGludGVycnVwdCBjb250cm9sbGVyIChOVklDKSBhbGxvd3MgdGhlIGJpdHMKKwkJdGhhdCBkZWZpbmUgZWFjaCBpbnRlcnJ1cHQncyBwcmlvcml0eSB0byBiZSBzcGxpdCBiZXR3ZWVuIGJpdHMgdGhhdAorCQlkZWZpbmUgdGhlIGludGVycnVwdCdzIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMgYW5kIGJpdHMgdGhhdCBkZWZpbmUKKwkJdGhlIGludGVycnVwdCdzIHN1Yi1wcmlvcml0eS4gIEZvciBzaW1wbGljaXR5IGFsbCBiaXRzIG11c3QgYmUgZGVmaW5lZAorCQl0byBiZSBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzLiAgVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmCisJCXRoaXMgaXMgbm90IHRoZSBjYXNlIChpZiBzb21lIGJpdHMgcmVwcmVzZW50IGEgc3ViLXByaW9yaXR5KS4KKworCQlJZiB0aGUgYXBwbGljYXRpb24gb25seSB1c2VzIENNU0lTIGxpYnJhcmllcyBmb3IgaW50ZXJydXB0CisJCWNvbmZpZ3VyYXRpb24gdGhlbiB0aGUgY29ycmVjdCBzZXR0aW5nIGNhbiBiZSBhY2hpZXZlZCBvbiBhbGwgQ29ydGV4LU0KKwkJZGV2aWNlcyBieSBjYWxsaW5nIE5WSUNfU2V0UHJpb3JpdHlHcm91cGluZyggMCApOyBiZWZvcmUgc3RhcnRpbmcgdGhlCisJCXNjaGVkdWxlci4gIE5vdGUgaG93ZXZlciB0aGF0IHNvbWUgdmVuZG9yIHNwZWNpZmljIHBlcmlwaGVyYWwgbGlicmFyaWVzCisJCWFzc3VtZSBhIG5vbi16ZXJvIHByaW9yaXR5IGdyb3VwIHNldHRpbmcsIGluIHdoaWNoIGNhc2VzIHVzaW5nIGEgdmFsdWUKKwkJb2YgemVybyB3aWxsIHJlc3VsdCBpbiB1bnByZWRpY2FibGUgYmVoYXZpb3VyLiAqLworCQljb25maWdBU1NFUlQoICggcG9ydEFJUkNSX1JFRyAmIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLICkgPD0gdWxNYXhQUklHUk9VUFZhbHVlICk7CisJfQorCisjZW5kaWYgLyogY29uZmlnQVNTRVJUX0RFRklORUQgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTdmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1QVSBzcGVjaWZpYyBjb25zdGFudHMuICovCisjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMJCTEKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkoIDB4ODAwMDAwMDBVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURQkJCQkoIDB4MDNVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkJCSggMHgwNVVMIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkJCQkJKCAweDA2VUwgPDwgMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURQkoIDB4MDFVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUJCSggMHgwN1VMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSCQkJKCAweDAxVUwgPDwgMjhVTCApCisKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCSggMFVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkJKCAxVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OCQkJKCAyVUwgKQorI2RlZmluZSBwb3J0R0VORVJBTF9QRVJJUEhFUkFMU19SRUdJT04JCSggM1VMICkKKyNkZWZpbmUgcG9ydFNUQUNLX1JFR0lPTgkJCQkJKCA0VUwgKQorI2RlZmluZSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkgICAgKCA1VUwgKQorI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkoIDdVTCApCisjZGVmaW5lIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMJCSggKCBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OIC0gcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04gKSArIDEgKQorI2RlZmluZSBwb3J0VE9UQUxfTlVNX1JFR0lPTlMJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCisKKyNkZWZpbmUgcG9ydFNXSVRDSF9UT19VU0VSX01PREUoKSBfX2FzbSB2b2xhdGlsZSAoICIgbXJzIHIwLCBjb250cm9sIFxuIG9yciByMCwgIzEgXG4gbXNyIGNvbnRyb2wsIHIwICIgOjo6ICJyMCIsICJtZW1vcnkiICkKKwordHlwZWRlZiBzdHJ1Y3QgTVBVX1JFR0lPTl9SRUdJU1RFUlMKK3sKKwl1aW50MzJfdCB1bFJlZ2lvbkJhc2VBZGRyZXNzOworCXVpbnQzMl90IHVsUmVnaW9uQXR0cmlidXRlOworfSB4TVBVX1JFR0lPTl9SRUdJU1RFUlM7CisKKy8qIFBsdXMgMSB0byBjcmVhdGUgc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCit0eXBlZGVmIHN0cnVjdCBNUFVfU0VUVElOR1MKK3sKKwl4TVBVX1JFR0lPTl9SRUdJU1RFUlMgeFJlZ2lvblsgcG9ydFRPVEFMX05VTV9SRUdJT05TIF07Cit9IHhNUFVfU0VUVElOR1M7CisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNWQyBudW1iZXJzIGZvciB2YXJpb3VzIHNlcnZpY2VzLiAqLworI2RlZmluZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgkJCQkwCisjZGVmaW5lIHBvcnRTVkNfWUlFTEQJCQkJCQkxCisjZGVmaW5lIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCQkJCTIKKworLyogU2NoZWR1bGVyIHV0aWxpdGllcy4gKi8KKworI2RlZmluZSBwb3J0WUlFTEQoKQkJCQlfX2FzbSB2b2xhdGlsZSAoICIJU1ZDCSUwCVxuIiA6OiAiaSIgKHBvcnRTVkNfWUlFTEQpIDogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0WUlFTERfV0lUSElOX0FQSSgpIAkJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8JCQkJCQkJCVwKKwlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOwkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzIGNvbXBsZXRlbHkJXAorCXdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8JCQkJCQlcCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOwkJCQkJCQkJCQlcCisJX19hc20gdm9sYXRpbGUoICJpc2IiICk7CQkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVF9CSVQJCSggMVVMIDw8IDI4VUwgKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApIGlmKCB4U3dpdGNoUmVxdWlyZWQgKSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LiAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApOworI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCXVsUG9ydFJhaXNlQkFTRVBSSSgpCisjZGVmaW5lIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUih4KQl2UG9ydFNldEJBU0VQUkkoeCkKKyNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCXZQb3J0UmFpc2VCQVNFUFJJKCkKKyNkZWZpbmUgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCkJCQkJCXZQb3J0U2V0QkFTRVBSSSgwKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRhc2sgZnVuY3Rpb24gbWFjcm9zIGFzIGRlc2NyaWJlZCBvbiB0aGUgRnJlZVJUT1Mub3JnIFdFQiBzaXRlLiAgVGhlc2UgYXJlCitub3QgbmVjZXNzYXJ5IGZvciB0byB1c2UgdGhpcyBwb3J0LiAgVGhleSBhcmUgZGVmaW5lZCBzbyB0aGUgY29tbW9uIGRlbW8gZmlsZXMKKyh3aGljaCBidWlsZCB3aXRoIGFsbCB0aGUgcG9ydHMpIHdpbGwgYnVpbGQuICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgb3B0aW1pc2F0aW9ucy4gKi8KKyNpZm5kZWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OCisJI2RlZmluZSBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gMQorI2VuZGlmCisKKyNpZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gPT0gMQorCisJLyogR2VuZXJpYyBoZWxwZXIgZnVuY3Rpb24uICovCisJX19hdHRyaWJ1dGVfXyggKCBhbHdheXNfaW5saW5lICkgKSBzdGF0aWMgaW5saW5lIHVpbnQ4X3QgdWNQb3J0Q291bnRMZWFkaW5nWmVyb3MoIHVpbnQzMl90IHVsQml0bWFwICkKKwl7CisJdWludDhfdCB1Y1JldHVybjsKKworCQlfX2FzbSB2b2xhdGlsZSAoICJjbHogJTAsICUxIiA6ICI9ciIgKCB1Y1JldHVybiApIDogInIiICggdWxCaXRtYXAgKSA6ICJtZW1vcnkiICk7CisJCXJldHVybiB1Y1JldHVybjsKKwl9CisKKwkvKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KKwkjaWYoIGNvbmZpZ01BWF9QUklPUklUSUVTID4gMzIgKQorCQkjZXJyb3IgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIGNhbiBvbmx5IGJlIHNldCB0byAxIHdoZW4gY29uZmlnTUFYX1BSSU9SSVRJRVMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLiAgSXQgaXMgdmVyeSByYXJlIHRoYXQgYSBzeXN0ZW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEwIHRvIDE1IGRpZmZlcmVuY2UgcHJpb3JpdGllcyBhcyB0YXNrcyB0aGF0IHNoYXJlIGEgcHJpb3JpdHkgd2lsbCB0aW1lIHNsaWNlLgorCSNlbmRpZgorCisJLyogU3RvcmUvY2xlYXIgdGhlIHJlYWR5IHByaW9yaXRpZXMgaW4gYSBiaXQgbWFwLiAqLworCSNkZWZpbmUgcG9ydFJFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgfD0gKCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCSNkZWZpbmUgcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSAmPSB+KCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkjZGVmaW5lIHBvcnRHRVRfSElHSEVTVF9QUklPUklUWSggdXhUb3BQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSB1eFRvcFByaW9yaXR5ID0gKCAzMVVMIC0gKCB1aW50MzJfdCApIHVjUG9ydENvdW50TGVhZGluZ1plcm9zKCAoIHV4UmVhZHlQcmlvcml0aWVzICkgKSApCisKKyNlbmRpZiAvKiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBjb25maWdBU1NFUlQKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApOworCSNkZWZpbmUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIAl2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoKQorI2VuZGlmCisKKy8qIHBvcnROT1AoKSBpcyBub3QgcmVxdWlyZWQgYnkgdGhpcyBwb3J0LiAqLworI2RlZmluZSBwb3J0Tk9QKCkKKworI2RlZmluZSBwb3J0SU5MSU5FCV9faW5saW5lCisKKyNpZm5kZWYgcG9ydEZPUkNFX0lOTElORQorCSNkZWZpbmUgcG9ydEZPUkNFX0lOTElORSBpbmxpbmUgX19hdHRyaWJ1dGVfXygoIGFsd2F5c19pbmxpbmUpKQorI2VuZGlmCisKKy8qIFNldCB0aGUgcHJpdmlsZWdlIGxldmVsIHRvIHVzZXIgbW9kZSBpZiB4UnVubmluZ1ByaXZpbGVnZWQgaXMgZmFsc2UuICovCitwb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyB2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICkKK3sKKwlpZiggeFJ1bm5pbmdQcml2aWxlZ2VkICE9IHBkVFJVRSApCisJeworCQlfX2FzbSB2b2xhdGlsZSAoICIgbXJzIHIwLCBjb250cm9sIAlcbiIgXAorCQkJCQkJICIgb3JyIHIwLCAjMSAJCVxuIiBcCisJCQkJCQkgIiBtc3IgY29udHJvbCwgcjAJXG4iCVwKKwkJCQkJCSA6OjoicjAiLCAibWVtb3J5IiApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitwb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyBCYXNlVHlwZV90IHhQb3J0SXNJbnNpZGVJbnRlcnJ1cHQoIHZvaWQgKQorewordWludDMyX3QgdWxDdXJyZW50SW50ZXJydXB0OworQmFzZVR5cGVfdCB4UmV0dXJuOworCisJLyogT2J0YWluIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW50ZXJydXB0LiAqLworCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApIDo6ICJtZW1vcnkiICk7CisKKwlpZiggdWxDdXJyZW50SW50ZXJydXB0ID09IDAgKQorCXsKKwkJeFJldHVybiA9IHBkRkFMU0U7CisJfQorCWVsc2UKKwl7CisJCXhSZXR1cm4gPSBwZFRSVUU7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitwb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyB2b2lkIHZQb3J0UmFpc2VCQVNFUFJJKCB2b2lkICkKK3sKK3VpbnQzMl90IHVsTmV3QkFTRVBSSTsKKworCV9fYXNtIHZvbGF0aWxlCisJKAorCQkiCW1vdiAlMCwgJTEJCQkJCQkJCQkJCQlcbiIJXAorCQkiCW1zciBiYXNlcHJpLCAlMAkJCQkJCQkJCQkJXG4iIFwKKwkJIglpc2IJCQkJCQkJCQkJCQkJCVxuIiBcCisJCSIJZHNiCQkJCQkJCQkJCQkJCQlcbiIgXAorCQk6Ij1yIiAodWxOZXdCQVNFUFJJKSA6ICJpIiAoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApIDogIm1lbW9yeSIKKwkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgdWludDMyX3QgdWxQb3J0UmFpc2VCQVNFUFJJKCB2b2lkICkKK3sKK3VpbnQzMl90IHVsT3JpZ2luYWxCQVNFUFJJLCB1bE5ld0JBU0VQUkk7CisKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIgltcnMgJTAsIGJhc2VwcmkJCQkJCQkJCQkJCVxuIiBcCisJCSIJbW92ICUxLCAlMgkJCQkJCQkJCQkJCVxuIglcCisJCSIJbXNyIGJhc2VwcmksICUxCQkJCQkJCQkJCQlcbiIgXAorCQkiCWlzYgkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJIglkc2IJCQkJCQkJCQkJCQkJCVxuIiBcCisJCToiPXIiICh1bE9yaWdpbmFsQkFTRVBSSSksICI9ciIgKHVsTmV3QkFTRVBSSSkgOiAiaSIgKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA6ICJtZW1vcnkiCisJKTsKKworCS8qIFRoaXMgcmV0dXJuIHdpbGwgbm90IGJlIHJlYWNoZWQgYnV0IGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGNvbXBpbGVyCisJd2FybmluZ3MuICovCisJcmV0dXJuIHVsT3JpZ2luYWxCQVNFUFJJOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRTZXRCQVNFUFJJKCB1aW50MzJfdCB1bE5ld01hc2tWYWx1ZSApCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbXNyIGJhc2VwcmksICUwCSIgOjogInIiICggdWxOZXdNYXNrVmFsdWUgKSA6ICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTcvUmVhZE1lLnR4dCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNy9SZWFkTWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjI1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTcvUmVhZE1lLnR4dApAQCAtMCwwICsxLDE4IEBACitUaGVyZSBhcmUgdHdvIG9wdGlvbnMgZm9yIHJ1bm5pbmcgRnJlZVJUT1Mgb24gQVJNIENvcnRleC1NNyBtaWNyb2NvbnRyb2xsZXJzLgorVGhlIGJlc3Qgb3B0aW9uIGRlcGVuZHMgb24gdGhlIHJldmlzaW9uIG9mIHRoZSBBUk0gQ29ydGV4LU03IGNvcmUgaW4gdXNlLiAgVGhlCityZXZpc2lvbiBpcyBzcGVjaWZpZWQgYnkgYW4gJ3InIG51bWJlciwgYW5kIGEgJ3AnIG51bWJlciwgc28gd2lsbCBsb29rIHNvbWV0aGluZworbGlrZSAncjBwMScuICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG1pY3JvY29udHJvbGxlciBpbiB1c2UgdG8gZmluZCB0aGUgCityZXZpc2lvbiBvZiB0aGUgQ29ydGV4LU03IGNvcmUgdXNlZCBpbiB0aGF0IG1pY3JvY29udHJvbGxlci4gIElmIGluIGRvdWJ0LCB1c2UgCit0aGUgRnJlZVJUT1MgcG9ydCBwcm92aWRlZCBzcGVjaWZpY2FsbHkgZm9yIHIwcDEgcmV2aXNpb25zLCBhcyB0aGF0IGNhbiBiZSB1c2VkCit3aXRoIGFsbCBjb3JlIHJldmlzaW9ucy4KKworVGhlIGZpcnN0IG9wdGlvbiBpcyB0byB1c2UgdGhlIEFSTSBDb3J0ZXgtTTRGIHBvcnQsIGFuZCB0aGUgc2Vjb25kIG9wdGlvbiBpcyB0bwordXNlIHRoZSBDb3J0ZXgtTTcgcjBwMSBwb3J0IC0gdGhlIGxhdHRlciBjb250YWluaW5nIGEgbWlub3IgZXJyYXRhIHdvcmthcm91bmQuCisKK0lmIHRoZSByZXZpc2lvbiBvZiB0aGUgQVJNIENvcnRleC1NNyBjb3JlIGlzIG5vdCByMHAxIHRoZW4gZWl0aGVyIG9wdGlvbiBjYW4gYmUKK3VzZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIEZyZWVSVE9TIEFSTSBDb3J0ZXgtTTRGIHBvcnQgbG9jYXRlZCBpbiAKK3RoZSAvRnJlZVJUT1MvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ000RiBkaXJlY3RvcnkuCisKK0lmIHRoZSByZXZpc2lvbiBvZiB0aGUgQVJNIENvcnRleC1NNyBjb3JlIGlzIHIwcDEgdGhlbiB1c2UgdGhlIEZyZWVSVE9TIEFSTQorQ29ydGV4LU03IHIwcDEgcG9ydCBsb2NhdGVkIGluIHRoZSAvRnJlZVJUT1MvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003L3IwcDEKK2RpcmVjdG9yeS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTcvcjBwMS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTcvcjBwMS9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1MjY0ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNy9yMHAxL3BvcnQuYwpAQCAtMCwwICsxLDc2NSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmggZm9yIHRoZSBBUk0gQ000RiBwb3J0LgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisjaWZuZGVmIF9fVkZQX0ZQX18KKwkjZXJyb3IgVGhpcyBwb3J0IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgcHJvamVjdCBvcHRpb25zIGFyZSBjb25maWd1cmVkIHRvIGVuYWJsZSBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0LgorI2VuZGlmCisKKyNpZm5kZWYgY29uZmlnU1lTVElDS19DTE9DS19IWgorCSNkZWZpbmUgY29uZmlnU1lTVElDS19DTE9DS19IWiBjb25maWdDUFVfQ0xPQ0tfSFoKKwkvKiBFbnN1cmUgdGhlIFN5c1RpY2sgaXMgY2xvY2tlZCBhdCB0aGUgc2FtZSBmcmVxdWVuY3kgYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQJKCAxVUwgPDwgMlVMICkKKyNlbHNlCisJLyogVGhlIHdheSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGlzIG5vdCBtb2RpZmllZCBpbiBjYXNlIGl0IGlzIG5vdCB0aGUgc2FtZQorCWFzIHRoZSBjb3JlLiAqLworCSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEtfQklUCSggMCApCisjZW5kaWYKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIGNvcmUuICBSZWdpc3RlcnMgZmlyc3QuLi4gKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTAgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTggKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTJfUkVHCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjAgKSApCisvKiAuLi50aGVuIGJpdHMgaW4gdGhlIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUCQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUCQkJKCAxVUwgPDwgMFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVAkJKCAxVUwgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVkNMRUFSX0JJVCAJCQkoIDFVTCA8PCAyN1VMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORF9TWVNUSUNLX0NMRUFSX0JJVAkJKCAxVUwgPDwgMjVVTCApCisKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDI0VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFuIGludGVycnVwdCBwcmlvcml0eS4gKi8KKyNkZWZpbmUgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUgkJKCAxNiApCisjZGVmaW5lIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgCSggMHhFMDAwRTNGMCApCisjZGVmaW5lIHBvcnRBSVJDUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBFRDBDICkgKQorI2RlZmluZSBwb3J0TUFYXzhfQklUX1ZBTFVFCQkJCQkoICggdWludDhfdCApIDB4ZmYgKQorI2RlZmluZSBwb3J0VE9QX0JJVF9PRl9CWVRFCQkJCQkoICggdWludDhfdCApIDB4ODAgKQorI2RlZmluZSBwb3J0TUFYX1BSSUdST1VQX0JJVFMJCQkJKCAoIHVpbnQ4X3QgKSA3ICkKKyNkZWZpbmUgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sJCQkJKCAweDA3VUwgPDwgOFVMICkKKyNkZWZpbmUgcG9ydFBSSUdST1VQX1NISUZUCQkJCQkoIDhVTCApCisKKy8qIE1hc2tzIG9mZiBhbGwgYml0cyBidXQgdGhlIFZFQ1RBQ1RJVkUgYml0cyBpbiB0aGUgSUNTUiByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydFZFQ1RBQ1RJVkVfTUFTSwkJCQkJKCAweEZGVUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgVkZQLiAqLworI2RlZmluZSBwb3J0RlBDQ1IJCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0ICkgLyogRmxvYXRpbmcgcG9pbnQgY29udGV4dCBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0QVNQRU5fQU5EX0xTUEVOX0JJVFMJCQkoIDB4M1VMIDw8IDMwVUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJCQkoIDB4MDEwMDAwMDAgKQorI2RlZmluZSBwb3J0SU5JVElBTF9FWENfUkVUVVJOCQkJCSggMHhmZmZmZmZmZCApCisKKy8qIFRoZSBzeXN0aWNrIGlzIGEgMjQtYml0IGNvdW50ZXIuICovCisjZGVmaW5lIHBvcnRNQVhfMjRfQklUX05VTUJFUgkJCQkoIDB4ZmZmZmZmVUwgKQorCisvKiBGb3Igc3RyaWN0IGNvbXBsaWFuY2Ugd2l0aCB0aGUgQ29ydGV4LU0gc3BlYyB0aGUgdGFzayBzdGFydCBhZGRyZXNzIHNob3VsZAoraGF2ZSBiaXQtMCBjbGVhciwgYXMgaXQgaXMgbG9hZGVkIGludG8gdGhlIFBDIG9uIGV4aXQgZnJvbSBhbiBJU1IuICovCisjZGVmaW5lIHBvcnRTVEFSVF9BRERSRVNTX01BU0sJCSggKCBTdGFja1R5cGVfdCApIDB4ZmZmZmZmZmVVTCApCisKKy8qIEEgZmlkZGxlIGZhY3RvciB0byBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIFN5c1RpY2sgY291bnRzIHRoYXQgd291bGQgaGF2ZQorb2NjdXJyZWQgd2hpbGUgdGhlIFN5c1RpY2sgY291bnRlciBpcyBzdG9wcGVkIGR1cmluZyB0aWNrbGVzcyBpZGxlCitjYWxjdWxhdGlvbnMuICovCisjZGVmaW5lIHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUgkJCSggNDVVTCApCisKKy8qIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgcHJlLWxvYWRpbmcgb2YgdGhlIGluaXRpYWwgTFIgd2l0aCB0aGUgYWRkcmVzcyBvZgorcHJ2VGFza0V4aXRFcnJvcigpIGluIGNhc2UgaXQgbWVzc2VzIHVwIHVud2luZGluZyBvZiB0aGUgc3RhY2sgaW4gdGhlCitkZWJ1Z2dlci4gKi8KKyNpZmRlZiBjb25maWdUQVNLX1JFVFVSTl9BRERSRVNTCisJI2RlZmluZSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUwljb25maWdUQVNLX1JFVFVSTl9BRERSRVNTCisjZWxzZQorCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJcHJ2VGFza0V4aXRFcnJvcgorI2VuZGlmCisKKy8qCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzCisgKiBmaWxlIGlzIHdlYWsgdG8gYWxsb3cgYXBwbGljYXRpb24gd3JpdGVycyB0byBjaGFuZ2UgdGhlIHRpbWVyIHVzZWQgdG8KKyAqIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdC4KKyAqLwordm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKTsKKworLyoKKyAqIEV4Y2VwdGlvbiBoYW5kbGVycy4KKyAqLwordm9pZCB4UG9ydFBlbmRTVkhhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICk7Cit2b2lkIHZQb3J0U1ZDSGFuZGxlciggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qCisgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlBvcnRTdGFydEZpcnN0VGFzayggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qCisgKiBGdW5jdGlvbiB0byBlbmFibGUgdGhlIFZGUC4KKyAqLworc3RhdGljIHZvaWQgdlBvcnRFbmFibGVWRlAoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKgorICogVXNlZCB0byBjYXRjaCB0YXNrcyB0aGF0IGF0dGVtcHQgdG8gcmV0dXJuIGZyb20gdGhlaXIgaW1wbGVtZW50aW5nIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZwordmFyaWFibGUuICovCitzdGF0aWMgVUJhc2VUeXBlX3QgdXhDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhOworCisvKgorICogVGhlIG51bWJlciBvZiBTeXNUaWNrIGluY3JlbWVudHMgdGhhdCBtYWtlIHVwIG9uZSB0aWNrIHBlcmlvZC4KKyAqLworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwlzdGF0aWMgdWludDMyX3QgdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGljayBwZXJpb2RzIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgaXMgbGltaXRlZCBieSB0aGUKKyAqIDI0IGJpdCByZXNvbHV0aW9uIG9mIHRoZSBTeXNUaWNrIHRpbWVyLgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogQ29tcGVuc2F0ZSBmb3IgdGhlIENQVSBjeWNsZXMgdGhhdCBwYXNzIHdoaWxlIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgKGxvdworICogcG93ZXIgZnVuY3Rpb25hbGl0eSBvbmx5LgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFVzZWQgYnkgdGhlIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSBtYWNybyB0byBlbnN1cmUKKyAqIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgYXJlIG5vdCBjYWxsZWQgZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkCisgKiBhIHByaW9yaXR5IGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKyAqLworI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwkgc3RhdGljIHVpbnQ4X3QgdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSAwOworCSBzdGF0aWMgdWludDMyX3QgdWxNYXhQUklHUk9VUFZhbHVlID0gMDsKKwkgc3RhdGljIGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzID0gKCBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgKSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2OworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMgKQoreworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwlpbnRlcnJ1cHQuICovCisKKwkvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQKKwlvZiBpbnRlcnJ1cHRzLCBhbmQgdG8gZW5zdXJlIGFsaWdubWVudC4gKi8KKwlweFRvcE9mU3RhY2stLTsKKworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkvKiB4UFNSICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggKCBTdGFja1R5cGVfdCApIHB4Q29kZSApICYgcG9ydFNUQVJUX0FERFJFU1NfTUFTSzsJLyogUEMgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTOwkvKiBMUiAqLworCisJLyogU2F2ZSBjb2RlIHNwYWNlIGJ5IHNraXBwaW5nIHJlZ2lzdGVyIGluaXRpYWxpc2F0aW9uLiAqLworCXB4VG9wT2ZTdGFjayAtPSA1OwkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CS8qIFIwICovCisKKwkvKiBBIHNhdmUgbWV0aG9kIGlzIGJlaW5nIHVzZWQgdGhhdCByZXF1aXJlcyBlYWNoIHRhc2sgdG8gbWFpbnRhaW4gaXRzCisJb3duIGV4ZWMgcmV0dXJuIHZhbHVlLiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCisJcHhUb3BPZlN0YWNrIC09IDg7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKK3ZvbGF0aWxlIHVpbnQzMl90IHVsRHVtbXkgPSAwOworCisJLyogQSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYSB0YXNrIG11c3Qgbm90IGV4aXQgb3IgYXR0ZW1wdCB0byByZXR1cm4gdG8KKwlpdHMgY2FsbGVyIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLiAgSWYgYSB0YXNrIHdhbnRzIHRvIGV4aXQgaXQKKwlzaG91bGQgaW5zdGVhZCBjYWxsIHZUYXNrRGVsZXRlKCBOVUxMICkuCisKKwlBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0KCkgdG8gYmUgdHJpZ2dlcmVkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzCisJZGVmaW5lZCwgdGhlbiBzdG9wIGhlcmUgc28gYXBwbGljYXRpb24gd3JpdGVycyBjYW4gY2F0Y2ggdGhlIGVycm9yLiAqLworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgPT0gfjBVTCApOworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl3aGlsZSggdWxEdW1teSA9PSAwICkKKwl7CisJCS8qIFRoaXMgZmlsZSBjYWxscyBwcnZUYXNrRXhpdEVycm9yKCkgYWZ0ZXIgdGhlIHNjaGVkdWxlciBoYXMgYmVlbgorCQlzdGFydGVkIHRvIHJlbW92ZSBhIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGRlZmluZWQKKwkJYnV0IG5ldmVyIGNhbGxlZC4gIHVsRHVtbXkgaXMgdXNlZCBwdXJlbHkgdG8gcXVpZXRlbiBvdGhlciB3YXJuaW5ncworCQlhYm91dCBjb2RlIGFwcGVhcmluZyBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAtIG1ha2luZyB1bER1bW15CisJCXZvbGF0aWxlIG1ha2VzIHRoZSBjb21waWxlciB0aGluayB0aGUgZnVuY3Rpb24gY291bGQgcmV0dXJuIGFuZAorCQl0aGVyZWZvcmUgbm90IG91dHB1dCBhbiAndW5yZWFjaGFibGUgY29kZScgd2FybmluZyBmb3IgY29kZSB0aGF0IGFwcGVhcnMKKwkJYWZ0ZXIgaXQuICovCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRTVkNIYW5kbGVyKCB2b2lkICkKK3sKKwlfX2FzbSB2b2xhdGlsZSAoCisJCQkJCSIJbGRyCXIzLCBweEN1cnJlbnRUQ0JDb25zdDIJCVxuIiAvKiBSZXN0b3JlIHRoZSBjb250ZXh0LiAqLworCQkJCQkiCWxkciByMSwgW3IzXQkJCQkJXG4iIC8qIFVzZSBweEN1cnJlbnRUQ0JDb25zdCB0byBnZXQgdGhlIHB4Q3VycmVudFRDQiBhZGRyZXNzLiAqLworCQkJCQkiCWxkciByMCwgW3IxXQkJCQkJXG4iIC8qIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJCQkJCSIJbGRtaWEgcjAhLCB7cjQtcjExLCByMTR9CQlcbiIgLyogUG9wIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgc2F2ZWQgb24gZXhjZXB0aW9uIGVudHJ5IGFuZCB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudC4gKi8KKwkJCQkJIgltc3IgcHNwLCByMAkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSB0YXNrIHN0YWNrIHBvaW50ZXIuICovCisJCQkJCSIJaXNiCQkJCQkJCQlcbiIKKwkJCQkJIgltb3YgcjAsICMwIAkJCQkJCVxuIgorCQkJCQkiCW1zcgliYXNlcHJpLCByMAkJCQkJXG4iCisJCQkJCSIJYnggcjE0CQkJCQkJCVxuIgorCQkJCQkiCQkJCQkJCQkJXG4iCisJCQkJCSIJLmFsaWduIDQJCQkJCQlcbiIKKwkJCQkJInB4Q3VycmVudFRDQkNvbnN0MjogLndvcmQgcHhDdXJyZW50VENCCQkJCVxuIgorCQkJCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2UG9ydFN0YXJ0Rmlyc3RUYXNrKCB2b2lkICkKK3sKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gIFRoaXMgYWxzbyBjbGVhcnMgdGhlIGJpdCB0aGF0IGluZGljYXRlcyB0aGUgRlBVIGlzCisJaW4gdXNlIGluIGNhc2UgdGhlIEZQVSB3YXMgdXNlZCBiZWZvcmUgdGhlIHNjaGVkdWxlciB3YXMgc3RhcnRlZCAtIHdoaWNoCisJd291bGQgb3RoZXJ3aXNlIHJlc3VsdCBpbiB0aGUgdW5uZWNlc3NhcnkgbGVhdmluZyBvZiBzcGFjZSBpbiB0aGUgU1ZDIHN0YWNrCisJZm9yIGxhenkgc2F2aW5nIG9mIEZQVSByZWdpc3RlcnMuICovCisJX19hc20gdm9sYXRpbGUoCisJCQkJCSIgbGRyIHIwLCA9MHhFMDAwRUQwOCAJXG4iIC8qIFVzZSB0aGUgTlZJQyBvZmZzZXQgcmVnaXN0ZXIgdG8gbG9jYXRlIHRoZSBzdGFjay4gKi8KKwkJCQkJIiBsZHIgcjAsIFtyMF0gCQkJXG4iCisJCQkJCSIgbGRyIHIwLCBbcjBdIAkJCVxuIgorCQkJCQkiIG1zciBtc3AsIHIwCQkJXG4iIC8qIFNldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwkJCQkJIiBtb3YgcjAsICMwCQkJXG4iIC8qIENsZWFyIHRoZSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhlIEZQVSBpcyBpbiB1c2UsIHNlZSBjb21tZW50IGFib3ZlLiAqLworCQkJCQkiIG1zciBjb250cm9sLCByMAkJXG4iCisJCQkJCSIgY3BzaWUgaQkJCQlcbiIgLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJCQkJCSIgY3BzaWUgZgkJCQlcbiIKKwkJCQkJIiBkc2IJCQkJCVxuIgorCQkJCQkiIGlzYgkJCQkJXG4iCisJCQkJCSIgc3ZjIDAJCQkJCVxuIiAvKiBTeXN0ZW0gY2FsbCB0byBzdGFydCBmaXJzdCB0YXNrLiAqLworCQkJCQkiIG5vcAkJCQkJXG4iCisJCQkJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgbXVzdCBub3QgYmUgc2V0IHRvIDAuCisJU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwljb25maWdBU1NFUlQoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOworCisJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwl7CisJCXZvbGF0aWxlIHVpbnQzMl90IHVsT3JpZ2luYWxQcmlvcml0eTsKKwkJdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSAoIHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCApICggcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiArIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKTsKKwkJdm9sYXRpbGUgdWludDhfdCB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHByaW9yaXR5IGZyb20gd2hpY2ggSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCWZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiAgSVNSIHNhZmUgZnVuY3Rpb25zIGFyZSB0aG9zZSB0aGF0IGVuZCBpbgorCQkiRnJvbUlTUiIuICBGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0bworCQllbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQlTYXZlIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkgdmFsdWUgdGhhdCBpcyBhYm91dCB0byBiZSBjbG9iYmVyZWQuICovCisJCXVsT3JpZ2luYWxQcmlvcml0eSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYXZhaWxhYmxlLiAgRmlyc3Qgd3JpdGUgdG8gYWxsCisJCXBvc3NpYmxlIGJpdHMuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gcG9ydE1BWF84X0JJVF9WQUxVRTsKKworCQkvKiBSZWFkIHRoZSB2YWx1ZSBiYWNrIHRvIHNlZSBob3cgbWFueSBiaXRzIHN0dWNrLiAqLworCQl1Y01heFByaW9yaXR5VmFsdWUgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCSNpZmRlZiBfX05WSUNfUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBDTVNJUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IF9fTlZJQ19QUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkjaWZkZWYgY29uZmlnUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBGcmVlUlRPUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IGNvbmZpZ1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIEVuc3VyZSB0aGUgVkZQIGlzIGVuYWJsZWQgLSBpdCBzaG91bGQgYmUgYW55d2F5LiAqLworCXZQb3J0RW5hYmxlVkZQKCk7CisKKwkvKiBMYXp5IHNhdmUgYWx3YXlzLiAqLworCSooIHBvcnRGUENDUiApIHw9IHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUzsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCXBydlBvcnRTdGFydEZpcnN0VGFzaygpOworCisJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlIGFzIHRoZSB0YXNrcyB3aWxsIG5vdyBiZSBleGVjdXRpbmchICBDYWxsIHRoZSB0YXNrCisJZXhpdCBlcnJvciBmdW5jdGlvbiB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGEgc3RhdGljIGZ1bmN0aW9uCisJbm90IGJlaW5nIGNhbGxlZCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgb3ZlcnJpZGVzIHRoaXMKKwlmdW5jdGlvbmFsaXR5IGJ5IGRlZmluaW5nIGNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MuICBDYWxsCisJdlRhc2tTd2l0Y2hDb250ZXh0KCkgc28gbGluayB0aW1lIG9wdGltaXNhdGlvbiBkb2VzIG5vdCByZW1vdmUgdGhlCisJc3ltYm9sLiAqLworCXZUYXNrU3dpdGNoQ29udGV4dCgpOworCXBydlRhc2tFeGl0RXJyb3IoKTsKKworCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUhICovCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApCit7CisJLyogTm90IGltcGxlbWVudGVkIGluIHBvcnRzIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLgorCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxMDAwVUwgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApCit7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXV4Q3JpdGljYWxOZXN0aW5nKys7CisKKwkvKiBUaGlzIGlzIG5vdCB0aGUgaW50ZXJydXB0IHNhZmUgdmVyc2lvbiBvZiB0aGUgZW50ZXIgY3JpdGljYWwgZnVuY3Rpb24gc28KKwlhc3NlcnQoKSBpZiBpdCBpcyBiZWluZyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dC4gIE9ubHkgQVBJCisJZnVuY3Rpb25zIHRoYXQgZW5kIGluICJGcm9tSVNSIiBjYW4gYmUgdXNlZCBpbiBhbiBpbnRlcnJ1cHQuICBPbmx5IGFzc2VydCBpZgorCXRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IGlzIDEgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlY3Vyc2l2ZSBjYWxscyBpZiB0aGUKKwlhc3NlcnQgZnVuY3Rpb24gYWxzbyB1c2VzIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwlpZiggdXhDcml0aWNhbE5lc3RpbmcgPT0gMSApCisJeworCQljb25maWdBU1NFUlQoICggcG9ydE5WSUNfSU5UX0NUUkxfUkVHICYgcG9ydFZFQ1RBQ1RJVkVfTUFTSyApID09IDAgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApCit7CisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyApOworCXV4Q3JpdGljYWxOZXN0aW5nLS07CisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDAgKQorCXsKKwkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBUaGlzIGlzIGEgbmFrZWQgZnVuY3Rpb24uICovCisKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgcHNwCQkJCQkJCVxuIgorCSIJaXNiCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCWxkcglyMywgcHhDdXJyZW50VENCQ29uc3QJCQlcbiIgLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJIglsZHIJcjIsIFtyM10JCQkJCQlcbiIKKwkiCQkJCQkJCQkJCVxuIgorCSIJdHN0IHIxNCwgIzB4MTAJCQkJCQlcbiIgLyogSXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHB1c2ggaGlnaCB2ZnAgcmVnaXN0ZXJzLiAqLworCSIJaXQgZXEJCQkJCQkJCVxuIgorCSIJdnN0bWRiZXEgcjAhLCB7czE2LXMzMX0JCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCXN0bWRiIHIwISwge3I0LXIxMSwgcjE0fQkJCVxuIiAvKiBTYXZlIHRoZSBjb3JlIHJlZ2lzdGVycy4gKi8KKwkiCXN0ciByMCwgW3IyXQkJCQkJCVxuIiAvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGludG8gdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgVENCLiAqLworCSIJCQkJCQkJCQkJXG4iCisJIglzdG1kYiBzcCEsIHtyMCwgcjN9CQkJCQlcbiIKKwkiCW1vdiByMCwgJTAgCQkJCQkJCVxuIgorCSIJY3BzaWQgaQkJCQkJCQkJXG4iIC8qIEVycmF0YSB3b3JrYXJvdW5kLiAqLworCSIJbXNyIGJhc2VwcmksIHIwCQkJCQkJXG4iCisJIglkc2IJCQkJCQkJCQlcbiIKKwkiCWlzYgkJCQkJCQkJCVxuIgorCSIJY3BzaWUgaQkJCQkJCQkJXG4iIC8qIEVycmF0YSB3b3JrYXJvdW5kLiAqLworCSIJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CQkJCVxuIgorCSIJbW92IHIwLCAjMAkJCQkJCQlcbiIKKwkiCW1zciBiYXNlcHJpLCByMAkJCQkJCVxuIgorCSIJbGRtaWEgc3AhLCB7cjAsIHIzfQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCWxkciByMSwgW3IzXQkJCQkJCVxuIiAvKiBUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCSIJbGRyIHIwLCBbcjFdCQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCWxkbWlhIHIwISwge3I0LXIxMSwgcjE0fQkJCVxuIiAvKiBQb3AgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLworCSIJCQkJCQkJCQkJXG4iCisJIgl0c3QgcjE0LCAjMHgxMAkJCQkJCVxuIiAvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcG9wIHRoZSBoaWdoIHZmcCByZWdpc3RlcnMgdG9vLiAqLworCSIJaXQgZXEJCQkJCQkJCVxuIgorCSIJdmxkbWlhZXEgcjAhLCB7czE2LXMzMX0JCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCW1zciBwc3AsIHIwCQkJCQkJCVxuIgorCSIJaXNiCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkjaWZkZWYgV09SS0FST1VORF9QTVVfQ00wMDEgLyogWE1DNDAwMCBzcGVjaWZpYyBlcnJhdGEgd29ya2Fyb3VuZC4gKi8KKwkJI2lmIFdPUktBUk9VTkRfUE1VX0NNMDAxID09IDEKKwkiCQkJcHVzaCB7IHIxNCB9CQkJCVxuIgorCSIJCQlwb3AgeyBwYyB9CQkJCQlcbiIKKwkJI2VuZGlmCisJI2VuZGlmCisJIgkJCQkJCQkJCQlcbiIKKwkiCWJ4IHIxNAkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCVxuIgorCSJweEN1cnJlbnRUQ0JDb25zdDogLndvcmQgcHhDdXJyZW50VENCCVxuIgorCTo6ImkiKGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSkKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApCit7CisJLyogVGhlIFN5c1RpY2sgcnVucyBhdCB0aGUgbG93ZXN0IGludGVycnVwdCBwcmlvcml0eSwgc28gd2hlbiB0aGlzIGludGVycnVwdAorCWV4ZWN1dGVzIGFsbCBpbnRlcnJ1cHRzIG11c3QgYmUgdW5tYXNrZWQuICBUaGVyZSBpcyB0aGVyZWZvcmUgbm8gbmVlZCB0bworCXNhdmUgYW5kIHRoZW4gcmVzdG9yZSB0aGUgaW50ZXJydXB0IG1hc2sgdmFsdWUgYXMgaXRzIHZhbHVlIGlzIGFscmVhZHkKKwlrbm93bi4gKi8KKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBBIGNvbnRleHQgc3dpdGNoIGlzIHJlcXVpcmVkLiAgQ29udGV4dCBzd2l0Y2hpbmcgaXMgcGVyZm9ybWVkIGluCisJCQl0aGUgUGVuZFNWIGludGVycnVwdC4gIFBlbmQgdGhlIFBlbmRTViBpbnRlcnJ1cHQuICovCisJCQlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQl9CisJfQorCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisKKwlfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApCisJeworCXVpbnQzMl90IHVsUmVsb2FkVmFsdWUsIHVsQ29tcGxldGVUaWNrUGVyaW9kcywgdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50czsKKwlUaWNrVHlwZV90IHhNb2RpZmlhYmxlSWRsZVRpbWU7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBTeXNUaWNrIHJlbG9hZCB2YWx1ZSBkb2VzIG5vdCBvdmVyZmxvdyB0aGUgY291bnRlci4gKi8KKwkJaWYoIHhFeHBlY3RlZElkbGVUaW1lID4geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyApCisJCXsKKwkJCXhFeHBlY3RlZElkbGVUaW1lID0geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrczsKKwkJfQorCisJCS8qIFN0b3AgdGhlIFN5c1RpY2sgbW9tZW50YXJpbHkuICBUaGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvcgorCQlpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIGJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbAorCQlpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkgZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUKKwkJa2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhciB0aW1lLiAqLworCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHICY9IH5wb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSByZWxvYWQgdmFsdWUgcmVxdWlyZWQgdG8gd2FpdCB4RXhwZWN0ZWRJZGxlVGltZQorCQl0aWNrIHBlcmlvZHMuICAtMSBpcyB1c2VkIGJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgZXhlY3V0ZSBwYXJ0IHdheQorCQl0aHJvdWdoIG9uZSBvZiB0aGUgdGljayBwZXJpb2RzLiAqLworCQl1bFJlbG9hZFZhbHVlID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyArICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKiAoIHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMICkgKTsKKwkJaWYoIHVsUmVsb2FkVmFsdWUgPiB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApCisJCXsKKwkJCXVsUmVsb2FkVmFsdWUgLT0gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb247CisJCX0KKworCQkvKiBFbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYnV0IGRvbid0IHVzZSB0aGUgdGFza0VOVEVSX0NSSVRJQ0FMKCkKKwkJbWV0aG9kIGFzIHRoYXQgd2lsbCBtYXNrIGludGVycnVwdHMgdGhhdCBzaG91bGQgZXhpdCBzbGVlcCBtb2RlLiAqLworCQlfX2FzbSB2b2xhdGlsZSggImNwc2lkIGkiIDo6OiAibWVtb3J5IiApOworCQlfX2FzbSB2b2xhdGlsZSggImRzYiIgKTsKKwkJX19hc20gdm9sYXRpbGUoICJpc2IiICk7CisKKwkJLyogSWYgYSBjb250ZXh0IHN3aXRjaCBpcyBwZW5kaW5nIG9yIGEgdGFzayBpcyB3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGVyCisJCXRvIGJlIHVuc3VzcGVuZGVkIHRoZW4gYWJhbmRvbiB0aGUgbG93IHBvd2VyIGVudHJ5LiAqLworCQlpZiggZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgPT0gZUFib3J0U2xlZXAgKQorCQl7CisJCQkvKiBSZXN0YXJ0IGZyb20gd2hhdGV2ZXIgaXMgbGVmdCBpbiB0aGUgY291bnQgcmVnaXN0ZXIgdG8gY29tcGxldGUKKwkJCXRoaXMgdGljayBwZXJpb2QuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFJlc2V0IHRoZSByZWxvYWQgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciBub3JtYWwgdGljaworCQkJcGVyaW9kcy4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgLSBzZWUgY29tbWVudHMgYWJvdmUgdGhlIGNwc2lkIGluc3RydWN0aW9uKCkKKwkJCWFib3ZlLiAqLworCQkJX19hc20gdm9sYXRpbGUoICJjcHNpZSBpIiA6OjogIm1lbW9yeSIgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFNldCB0aGUgbmV3IHJlbG9hZCB2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFJlbG9hZFZhbHVlOworCisJCQkvKiBDbGVhciB0aGUgU3lzVGljayBjb3VudCBmbGFnIGFuZCBzZXQgdGhlIGNvdW50IHZhbHVlIGJhY2sgdG8KKwkJCXplcm8uICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKworCQkJLyogU2xlZXAgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMuICBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORygpIGNhbgorCQkJc2V0IGl0cyBwYXJhbWV0ZXIgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IGl0cyBpbXBsZW1lbnRhdGlvbiBjb250YWlucworCQkJaXRzIG93biB3YWl0IGZvciBpbnRlcnJ1cHQgb3Igd2FpdCBmb3IgZXZlbnQgaW5zdHJ1Y3Rpb24sIGFuZCBzbyB3ZmkKKwkJCXNob3VsZCBub3QgYmUgZXhlY3V0ZWQgYWdhaW4uICBIb3dldmVyLCB0aGUgb3JpZ2luYWwgZXhwZWN0ZWQgaWRsZQorCQkJdGltZSB2YXJpYWJsZSBtdXN0IHJlbWFpbiB1bm1vZGlmaWVkLCBzbyBhIGNvcHkgaXMgdGFrZW4uICovCisJCQl4TW9kaWZpYWJsZUlkbGVUaW1lID0geEV4cGVjdGVkSWRsZVRpbWU7CisJCQljb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyggJnhNb2RpZmlhYmxlSWRsZVRpbWUgKTsKKwkJCWlmKCB4TW9kaWZpYWJsZUlkbGVUaW1lID4gMCApCisJCQl7CisJCQkJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCQkJCV9fYXNtIHZvbGF0aWxlKCAid2ZpIiApOworCQkJCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworCQkJfQorCQkJY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HKCAmeEV4cGVjdGVkSWRsZVRpbWUgKTsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgdG8gYWxsb3cgdGhlIGludGVycnVwdCB0aGF0IGJyb3VnaHQgdGhlIE1DVQorCQkJb3V0IG9mIHNsZWVwIG1vZGUgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseS4gIHNlZSBjb21tZW50cyBhYm92ZQorCQkJX19kaXNhYmxlX2ludGVycnVwdCgpIGNhbGwgYWJvdmUuICovCisJCQlfX2FzbSB2b2xhdGlsZSggImNwc2llIGkiIDo6OiAibWVtb3J5IiApOworCQkJX19hc20gdm9sYXRpbGUoICJkc2IiICk7CisJCQlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKKworCQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluIGJlY2F1c2UgdGhlIGNsb2NrIGlzIGFib3V0IHRvIGJlIHN0b3BwZWQKKwkJCWFuZCBpbnRlcnJ1cHRzIHRoYXQgZXhlY3V0ZSB3aGlsZSB0aGUgY2xvY2sgaXMgc3RvcHBlZCB3aWxsIGluY3JlYXNlCisJCQlhbnkgc2xpcHBhZ2UgYmV0d2VlbiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZSBSVE9TIGFuZCBjYWxlbmRhcgorCQkJdGltZS4gKi8KKwkJCV9fYXNtIHZvbGF0aWxlKCAiY3BzaWQgaSIgOjo6ICJtZW1vcnkiICk7CisJCQlfX2FzbSB2b2xhdGlsZSggImRzYiIgKTsKKwkJCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworCisJCQkvKiBEaXNhYmxlIHRoZSBTeXNUaWNrIGNsb2NrIHdpdGhvdXQgcmVhZGluZyB0aGUKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgcmVnaXN0ZXIgdG8gZW5zdXJlIHRoZQorCQkJcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVCBpcyBub3QgY2xlYXJlZCBpZiBpdCBpcyBzZXQuICBBZ2FpbiwKKwkJCXRoZSB0aW1lIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgZm9yIGlzIGFjY291bnRlZCBmb3IgYXMgYmVzdCBpdCBjYW4KKwkJCWJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbCBpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkKKwkJCWRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlIGtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIKKwkJCXRpbWUqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9ICggcG9ydE5WSUNfU1lTVElDS19DTEtfQklUIHwgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUICk7CisKKwkJCS8qIERldGVybWluZSBpZiB0aGUgU3lzVGljayBjbG9jayBoYXMgYWxyZWFkeSBjb3VudGVkIHRvIHplcm8gYW5kCisJCQliZWVuIHNldCBiYWNrIHRvIHRoZSBjdXJyZW50IHJlbG9hZCB2YWx1ZSAodGhlIHJlbG9hZCBiYWNrIGJlaW5nCisJCQljb3JyZWN0IGZvciB0aGUgZW50aXJlIGV4cGVjdGVkIGlkbGUgdGltZSkgb3IgaWYgdGhlIFN5c1RpY2sgaXMgeWV0CisJCQl0byBjb3VudCB0byB6ZXJvIChpbiB3aGljaCBjYXNlIGFuIGludGVycnVwdCBvdGhlciB0aGFuIHRoZSBTeXNUaWNrCisJCQltdXN0IGhhdmUgYnJvdWdodCB0aGUgc3lzdGVtIG91dCBvZiBzbGVlcCBtb2RlKS4gKi8KKwkJCWlmKCAoIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgJiBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUdfQklUICkgIT0gMCApCisJCQl7CisJCQkJdWludDMyX3QgdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogVGhlIHRpY2sgaW50ZXJydXB0IGlzIGFscmVhZHkgcGVuZGluZywgYW5kIHRoZSBTeXNUaWNrIGNvdW50CisJCQkJcmVsb2FkZWQgd2l0aCB1bFJlbG9hZFZhbHVlLiAgUmVzZXQgdGhlCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyB3aXRoIHdoYXRldmVyIHJlbWFpbnMgb2YgdGhpcyB0aWNrCisJCQkJcGVyaW9kLiAqLworCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKSAtICggdWxSZWxvYWRWYWx1ZSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgKTsKKworCQkJCS8qIERvbid0IGFsbG93IGEgdGlueSB2YWx1ZSwgb3IgdmFsdWVzIHRoYXQgaGF2ZSBzb21laG93CisJCQkJdW5kZXJmbG93ZWQgYmVjYXVzZSB0aGUgcG9zdCBzbGVlcCBob29rIGRpZCBzb21ldGhpbmcKKwkJCQl0aGF0IHRvb2sgdG9vIGxvbmcuICovCisJCQkJaWYoICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlIDwgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKSB8fCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA+IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgKQorCQkJCXsKKwkJCQkJdWxDYWxjdWxhdGVkTG9hZFZhbHVlID0gKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTCApOworCQkJCX0KKworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bENhbGN1bGF0ZWRMb2FkVmFsdWU7CisKKwkJCQkvKiBBcyB0aGUgcGVuZGluZyB0aWNrIHdpbGwgYmUgcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhpcworCQkJCWZ1bmN0aW9uIGV4aXRzLCB0aGUgdGljayB2YWx1ZSBtYWludGFpbmVkIGJ5IHRoZSB0aWNrIGlzIHN0ZXBwZWQKKwkJCQlmb3J3YXJkIGJ5IG9uZSBsZXNzIHRoYW4gdGhlIHRpbWUgc3BlbnQgd2FpdGluZy4gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBTb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgdGljayBpbnRlcnJ1cHQgZW5kZWQgdGhlIHNsZWVwLgorCQkJCVdvcmsgb3V0IGhvdyBsb25nIHRoZSBzbGVlcCBsYXN0ZWQgcm91bmRlZCB0byBjb21wbGV0ZSB0aWNrCisJCQkJcGVyaW9kcyAobm90IHRoZSB1bFJlbG9hZCB2YWx1ZSB3aGljaCBhY2NvdW50ZWQgZm9yIHBhcnQKKwkJCQl0aWNrcykuICovCisJCQkJdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cyA9ICggeEV4cGVjdGVkSWRsZVRpbWUgKiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApIC0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJCS8qIEhvdyBtYW55IGNvbXBsZXRlIHRpY2sgcGVyaW9kcyBwYXNzZWQgd2hpbGUgdGhlIHByb2Nlc3NvcgorCQkJCXdhcyB3YWl0aW5nPyAqLworCQkJCXVsQ29tcGxldGVUaWNrUGVyaW9kcyA9IHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKworCQkJCS8qIFRoZSByZWxvYWQgdmFsdWUgaXMgc2V0IHRvIHdoYXRldmVyIGZyYWN0aW9uIG9mIGEgc2luZ2xlIHRpY2sKKwkJCQlwZXJpb2QgcmVtYWlucy4gKi8KKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCAoIHVsQ29tcGxldGVUaWNrUGVyaW9kcyArIDFVTCApICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHM7CisJCQl9CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljayBzbyBpdCBydW5zIGZyb20gcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRworCQkJYWdhaW4sIHRoZW4gc2V0IHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgYmFjayB0byBpdHMgc3RhbmRhcmQKKwkJCXZhbHVlLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOworCQkJdlRhc2tTdGVwVGljayggdWxDb21wbGV0ZVRpY2tQZXJpb2RzICk7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUw7CisKKwkJCS8qIEV4aXQgd2l0aCBpbnRlcnJwdHMgZW5hYmxlZC4gKi8KKwkJCV9fYXNtIHZvbGF0aWxlKCAiY3BzaWUgaSIgOjo6ICJtZW1vcnkiICk7CisJCX0KKwl9CisKKyNlbmRpZiAvKiAjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2V0dXAgdGhlIHN5c3RpY2sgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cyBhdCB0aGUgcmVxdWlyZWQKKyAqIGZyZXF1ZW5jeS4KKyAqLworX19hdHRyaWJ1dGVfXygoIHdlYWsgKSkgdm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKQoreworCS8qIENhbGN1bGF0ZSB0aGUgY29uc3RhbnRzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgdGljayBpbnRlcnJ1cHQuICovCisJI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwl7CisJCXVsVGltZXJDb3VudHNGb3JPbmVUaWNrID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICk7CisJCXhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKwkJdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKKwl9CisJI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKwkvKiBTdG9wIGFuZCBjbGVhciB0aGUgU3lzVGljay4gKi8KKwlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gMFVMOworCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKSAtIDFVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gKCBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVF9CSVQgfCBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGlzIGlzIGEgbmFrZWQgZnVuY3Rpb24uICovCitzdGF0aWMgdm9pZCB2UG9ydEVuYWJsZVZGUCggdm9pZCApCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbGRyLncgcjAsID0weEUwMDBFRDg4CQlcbiIgLyogVGhlIEZQVSBlbmFibGUgYml0cyBhcmUgaW4gdGhlIENQQUNSLiAqLworCQkiCWxkciByMSwgW3IwXQkJCQlcbiIKKwkJIgkJCQkJCQkJXG4iCisJCSIJb3JyIHIxLCByMSwgIyggMHhmIDw8IDIwICkJXG4iIC8qIEVuYWJsZSBDUDEwIGFuZCBDUDExIGNvcHJvY2Vzc29ycywgdGhlbiBzYXZlIGJhY2suICovCisJCSIJc3RyIHIxLCBbcjBdCQkJCVxuIgorCQkiCWJ4IHIxNAkJCQkJCSIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApCisJeworCXVpbnQzMl90IHVsQ3VycmVudEludGVycnVwdDsKKwl1aW50OF90IHVjQ3VycmVudFByaW9yaXR5OworCisJCS8qIE9idGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGludGVycnVwdC4gKi8KKwkJX19hc20gdm9sYXRpbGUoICJtcnMgJTAsIGlwc3IiIDogIj1yIiggdWxDdXJyZW50SW50ZXJydXB0ICkgOjogIm1lbW9yeSIgKTsKKworCQkvKiBJcyB0aGUgaW50ZXJydXB0IG51bWJlciBhIHVzZXIgZGVmaW5lZCBpbnRlcnJ1cHQ/ICovCisJCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPj0gcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApCisJCXsKKwkJCS8qIExvb2sgdXAgdGhlIGludGVycnVwdCdzIHByaW9yaXR5LiAqLworCQkJdWNDdXJyZW50UHJpb3JpdHkgPSBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzWyB1bEN1cnJlbnRJbnRlcnJ1cHQgXTsKKworCQkJLyogVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmIGEgc2VydmljZSByb3V0aW5lIChJU1IpIGZvcgorCQkJYW4gaW50ZXJydXB0IHRoYXQgaGFzIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhYm92ZQorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIGNhbGxzIGFuIElTUiBzYWZlIEZyZWVSVE9TIEFQSQorCQkJZnVuY3Rpb24uICBJU1Igc2FmZSBGcmVlUlRPUyBBUEkgZnVuY3Rpb25zIG11c3QgKm9ubHkqIGJlIGNhbGxlZAorCQkJZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgYmVsb3cKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJTnVtZXJpY2FsbHkgbG93IGludGVycnVwdCBwcmlvcml0eSBudW1iZXJzIHJlcHJlc2VudCBsb2dpY2FsbHkgaGlnaAorCQkJaW50ZXJydXB0IHByaW9yaXRpZXMsIHRoZXJlZm9yZSB0aGUgcHJpb3JpdHkgb2YgdGhlIGludGVycnVwdCBtdXN0CisJCQliZSBzZXQgdG8gYSB2YWx1ZSBlcXVhbCB0byBvciBudW1lcmljYWxseSAqaGlnaGVyKiB0aGFuCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCUludGVycnVwdHMgdGhhdAl1c2UgdGhlIEZyZWVSVE9TIEFQSSBtdXN0IG5vdCBiZSBsZWZ0IGF0IHRoZWlyCisJCQlkZWZhdWx0IHByaW9yaXR5IG9mCXplcm8gYXMgdGhhdCBpcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBwcmlvcml0eSwKKwkJCXdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLAorCQkJYW5kCXRoZXJlZm9yZSBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgaW52YWxpZC4KKworCQkJRnJlZVJUT1MgbWFpbnRhaW5zIHNlcGFyYXRlIHRocmVhZCBhbmQgSVNSIEFQSSBmdW5jdGlvbnMgdG8gZW5zdXJlCisJCQlpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCQlUaGUgZm9sbG93aW5nIGxpbmtzIHByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb246CisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9GQVFIZWxwLmh0bWwgKi8KKwkJCWNvbmZpZ0FTU0VSVCggdWNDdXJyZW50UHJpb3JpdHkgPj0gdWNNYXhTeXNDYWxsUHJpb3JpdHkgKTsKKwkJfQorCisJCS8qIFByaW9yaXR5IGdyb3VwaW5nOiAgVGhlIGludGVycnVwdCBjb250cm9sbGVyIChOVklDKSBhbGxvd3MgdGhlIGJpdHMKKwkJdGhhdCBkZWZpbmUgZWFjaCBpbnRlcnJ1cHQncyBwcmlvcml0eSB0byBiZSBzcGxpdCBiZXR3ZWVuIGJpdHMgdGhhdAorCQlkZWZpbmUgdGhlIGludGVycnVwdCdzIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMgYW5kIGJpdHMgdGhhdCBkZWZpbmUKKwkJdGhlIGludGVycnVwdCdzIHN1Yi1wcmlvcml0eS4gIEZvciBzaW1wbGljaXR5IGFsbCBiaXRzIG11c3QgYmUgZGVmaW5lZAorCQl0byBiZSBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzLiAgVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmCisJCXRoaXMgaXMgbm90IHRoZSBjYXNlIChpZiBzb21lIGJpdHMgcmVwcmVzZW50IGEgc3ViLXByaW9yaXR5KS4KKworCQlJZiB0aGUgYXBwbGljYXRpb24gb25seSB1c2VzIENNU0lTIGxpYnJhcmllcyBmb3IgaW50ZXJydXB0CisJCWNvbmZpZ3VyYXRpb24gdGhlbiB0aGUgY29ycmVjdCBzZXR0aW5nIGNhbiBiZSBhY2hpZXZlZCBvbiBhbGwgQ29ydGV4LU0KKwkJZGV2aWNlcyBieSBjYWxsaW5nIE5WSUNfU2V0UHJpb3JpdHlHcm91cGluZyggMCApOyBiZWZvcmUgc3RhcnRpbmcgdGhlCisJCXNjaGVkdWxlci4gIE5vdGUgaG93ZXZlciB0aGF0IHNvbWUgdmVuZG9yIHNwZWNpZmljIHBlcmlwaGVyYWwgbGlicmFyaWVzCisJCWFzc3VtZSBhIG5vbi16ZXJvIHByaW9yaXR5IGdyb3VwIHNldHRpbmcsIGluIHdoaWNoIGNhc2VzIHVzaW5nIGEgdmFsdWUKKwkJb2YgemVybyB3aWxsIHJlc3VsdCBpbiB1bnByZWRpY3RhYmxlIGJlaGF2aW91ci4gKi8KKwkJY29uZmlnQVNTRVJUKCAoIHBvcnRBSVJDUl9SRUcgJiBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSyApIDw9IHVsTWF4UFJJR1JPVVBWYWx1ZSApOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003L3IwcDEvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTcvcjBwMS9wb3J0bWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjkxMmFlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003L3IwcDEvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisKKyNpZm5kZWYgUE9SVE1BQ1JPX0gKKyNkZWZpbmUgUE9SVE1BQ1JPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb3J0IHNwZWNpZmljIGRlZmluaXRpb25zLgorICoKKyAqIFRoZSBzZXR0aW5ncyBpbiB0aGlzIGZpbGUgY29uZmlndXJlIEZyZWVSVE9TIGNvcnJlY3RseSBmb3IgdGhlCisgKiBnaXZlbiBoYXJkd2FyZSBhbmQgY29tcGlsZXIuCisgKgorICogVGhlc2Ugc2V0dGluZ3Mgc2hvdWxkIG5vdCBiZSBhbHRlcmVkLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIFR5cGUgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIHBvcnRDSEFSCQljaGFyCisjZGVmaW5lIHBvcnRGTE9BVAkJZmxvYXQKKyNkZWZpbmUgcG9ydERPVUJMRQkJZG91YmxlCisjZGVmaW5lIHBvcnRMT05HCQlsb25nCisjZGVmaW5lIHBvcnRTSE9SVAkJc2hvcnQKKyNkZWZpbmUgcG9ydFNUQUNLX1RZUEUJdWludDMyX3QKKyNkZWZpbmUgcG9ydEJBU0VfVFlQRQlsb25nCisKK3R5cGVkZWYgcG9ydFNUQUNLX1RZUEUgU3RhY2tUeXBlX3Q7Cit0eXBlZGVmIGxvbmcgQmFzZVR5cGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVQmFzZVR5cGVfdDsKKworI2lmKCBjb25maWdVU0VfMTZfQklUX1RJQ0tTID09IDEgKQorCXR5cGVkZWYgdWludDE2X3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkgMHhmZmZmCisjZWxzZQorCXR5cGVkZWYgdWludDMyX3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkgMHhmZmZmZmZmZlVMCisKKwkvKiAzMi1iaXQgdGljayB0eXBlIG9uIGEgMzItYml0IGFyY2hpdGVjdHVyZSwgc28gcmVhZHMgb2YgdGhlIHRpY2sgY291bnQgZG8KKwlub3QgbmVlZCB0byBiZSBndWFyZGVkIHdpdGggYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCSNkZWZpbmUgcG9ydFRJQ0tfVFlQRV9JU19BVE9NSUMgMQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljcy4gKi8KKyNkZWZpbmUgcG9ydFNUQUNLX0dST1dUSAkJCSggLTEgKQorI2RlZmluZSBwb3J0VElDS19QRVJJT0RfTVMJCQkoICggVGlja1R5cGVfdCApIDEwMDAgLyBjb25maWdUSUNLX1JBVEVfSFogKQorI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlQJCQk4CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2NoZWR1bGVyIHV0aWxpdGllcy4gKi8KKyNkZWZpbmUgcG9ydFlJRUxEKCkgCQkJCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCS8qIFNldCBhIFBlbmRTViB0byByZXF1ZXN0IGEgY29udGV4dCBzd2l0Y2guICovCQkJCQkJCQlcCisJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQgYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CVwKKwl3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCQkJCQkJXAorCV9fYXNtIHZvbGF0aWxlKCAiZHNiIiA6OjogIm1lbW9yeSIgKTsJCQkJCQkJCQkJXAorCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOwkJCQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkxfUkVHCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCQkoIDFVTCA8PCAyOFVMICkKKyNkZWZpbmUgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4U3dpdGNoUmVxdWlyZWQgKSBpZiggeFN3aXRjaFJlcXVpcmVkICE9IHBkRkFMU0UgKSBwb3J0WUlFTEQoKQorI2RlZmluZSBwb3J0WUlFTERfRlJPTV9JU1IoIHggKSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHggKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENyaXRpY2FsIHNlY3Rpb24gbWFuYWdlbWVudC4gKi8KK2V4dGVybiB2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApOworZXh0ZXJuIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKTsKKyNkZWZpbmUgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpCQl1bFBvcnRSYWlzZUJBU0VQUkkoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJdlBvcnRTZXRCQVNFUFJJKHgpCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQkJCQl2UG9ydFJhaXNlQkFTRVBSSSgpCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQl2UG9ydFNldEJBU0VQUkkoMCkKKyNkZWZpbmUgcG9ydEVOVEVSX0NSSVRJQ0FMKCkJCQkJCXZQb3J0RW50ZXJDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRFWElUX0NSSVRJQ0FMKCkJCQkJCQl2UG9ydEV4aXRDcml0aWNhbCgpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4gIFRoZXNlIGFyZQorbm90IG5lY2Vzc2FyeSBmb3IgdG8gdXNlIHRoaXMgcG9ydC4gIFRoZXkgYXJlIGRlZmluZWQgc28gdGhlIGNvbW1vbiBkZW1vIGZpbGVzCisod2hpY2ggYnVpbGQgd2l0aCBhbGwgdGhlIHBvcnRzKSB3aWxsIGJ1aWxkLiAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGlja2xlc3MgaWRsZS9sb3cgcG93ZXIgZnVuY3Rpb25hbGl0eS4gKi8KKyNpZm5kZWYgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUAorCWV4dGVybiB2b2lkIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCBUaWNrVHlwZV90IHhFeHBlY3RlZElkbGVUaW1lICk7CisJI2RlZmluZSBwb3J0U1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQKCB4RXhwZWN0ZWRJZGxlVGltZSApIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCB4RXhwZWN0ZWRJZGxlVGltZSApCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgb3B0aW1pc2F0aW9ucy4gKi8KKyNpZm5kZWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OCisJI2RlZmluZSBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gMQorI2VuZGlmCisKKyNpZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gPT0gMQorCisJLyogR2VuZXJpYyBoZWxwZXIgZnVuY3Rpb24uICovCisJX19hdHRyaWJ1dGVfXyggKCBhbHdheXNfaW5saW5lICkgKSBzdGF0aWMgaW5saW5lIHVpbnQ4X3QgdWNQb3J0Q291bnRMZWFkaW5nWmVyb3MoIHVpbnQzMl90IHVsQml0bWFwICkKKwl7CisJdWludDhfdCB1Y1JldHVybjsKKworCQlfX2FzbSB2b2xhdGlsZSAoICJjbHogJTAsICUxIiA6ICI9ciIgKCB1Y1JldHVybiApIDogInIiICggdWxCaXRtYXAgKSA6ICJtZW1vcnkiICk7CisJCXJldHVybiB1Y1JldHVybjsKKwl9CisKKwkvKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KKwkjaWYoIGNvbmZpZ01BWF9QUklPUklUSUVTID4gMzIgKQorCQkjZXJyb3IgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIGNhbiBvbmx5IGJlIHNldCB0byAxIHdoZW4gY29uZmlnTUFYX1BSSU9SSVRJRVMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLiAgSXQgaXMgdmVyeSByYXJlIHRoYXQgYSBzeXN0ZW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEwIHRvIDE1IGRpZmZlcmVuY2UgcHJpb3JpdGllcyBhcyB0YXNrcyB0aGF0IHNoYXJlIGEgcHJpb3JpdHkgd2lsbCB0aW1lIHNsaWNlLgorCSNlbmRpZgorCisJLyogU3RvcmUvY2xlYXIgdGhlIHJlYWR5IHByaW9yaXRpZXMgaW4gYSBiaXQgbWFwLiAqLworCSNkZWZpbmUgcG9ydFJFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgfD0gKCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCSNkZWZpbmUgcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSAmPSB+KCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkjZGVmaW5lIHBvcnRHRVRfSElHSEVTVF9QUklPUklUWSggdXhUb3BQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSB1eFRvcFByaW9yaXR5ID0gKCAzMVVMIC0gKCB1aW50MzJfdCApIHVjUG9ydENvdW50TGVhZGluZ1plcm9zKCAoIHV4UmVhZHlQcmlvcml0aWVzICkgKSApCisKKyNlbmRpZiAvKiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBjb25maWdBU1NFUlQKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApOworCSNkZWZpbmUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIAl2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoKQorI2VuZGlmCisKKy8qIHBvcnROT1AoKSBpcyBub3QgcmVxdWlyZWQgYnkgdGhpcyBwb3J0LiAqLworI2RlZmluZSBwb3J0Tk9QKCkKKworI2RlZmluZSBwb3J0SU5MSU5FCV9faW5saW5lCisKKyNpZm5kZWYgcG9ydEZPUkNFX0lOTElORQorCSNkZWZpbmUgcG9ydEZPUkNFX0lOTElORSBpbmxpbmUgX19hdHRyaWJ1dGVfXygoIGFsd2F5c19pbmxpbmUpKQorI2VuZGlmCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIEJhc2VUeXBlX3QgeFBvcnRJc0luc2lkZUludGVycnVwdCggdm9pZCApCit7Cit1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CitCYXNlVHlwZV90IHhSZXR1cm47CisKKwkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJX19hc20gdm9sYXRpbGUoICJtcnMgJTAsIGlwc3IiIDogIj1yIiggdWxDdXJyZW50SW50ZXJydXB0ICkgOjogIm1lbW9yeSIgKTsKKworCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPT0gMCApCisJeworCQl4UmV0dXJuID0gcGRGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IHBkVFJVRTsKKwl9CisKKwlyZXR1cm4geFJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxOZXdCQVNFUFJJOworCisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbW92ICUwLCAlMQkJCQkJCQkJCQkJCVxuIglcCisJCSIJY3BzaWQgaQkJCQkJCQkJCQkJCQlcbiIgXAorCQkiCW1zciBiYXNlcHJpLCAlMAkJCQkJCQkJCQkJXG4iIFwKKwkJIglpc2IJCQkJCQkJCQkJCQkJCVxuIiBcCisJCSIJZHNiCQkJCQkJCQkJCQkJCQlcbiIgXAorCQkiCWNwc2llIGkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJOiI9ciIgKHVsTmV3QkFTRVBSSSkgOiAiaSIgKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA6ICJtZW1vcnkiCisJKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHVpbnQzMl90IHVsUG9ydFJhaXNlQkFTRVBSSSggdm9pZCApCit7Cit1aW50MzJfdCB1bE9yaWdpbmFsQkFTRVBSSSwgdWxOZXdCQVNFUFJJOworCisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbXJzICUwLCBiYXNlcHJpCQkJCQkJCQkJCQlcbiIgXAorCQkiCW1vdiAlMSwgJTIJCQkJCQkJCQkJCQlcbiIJXAorCQkiCWNwc2lkIGkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJIgltc3IgYmFzZXByaSwgJTEJCQkJCQkJCQkJCVxuIiBcCisJCSIJaXNiCQkJCQkJCQkJCQkJCQlcbiIgXAorCQkiCWRzYgkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJIgljcHNpZSBpCQkJCQkJCQkJCQkJCVxuIiBcCisJCToiPXIiICh1bE9yaWdpbmFsQkFTRVBSSSksICI9ciIgKHVsTmV3QkFTRVBSSSkgOiAiaSIgKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA6ICJtZW1vcnkiCisJKTsKKworCS8qIFRoaXMgcmV0dXJuIHdpbGwgbm90IGJlIHJlYWNoZWQgYnV0IGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGNvbXBpbGVyCisJd2FybmluZ3MuICovCisJcmV0dXJuIHVsT3JpZ2luYWxCQVNFUFJJOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRTZXRCQVNFUFJJKCB1aW50MzJfdCB1bE5ld01hc2tWYWx1ZSApCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbXNyIGJhc2VwcmksICUwCSIgOjogInIiICggdWxOZXdNYXNrVmFsdWUgKSA6ICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTdfTVBVL1JlYWRNZS50eHQgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTdfTVBVL1JlYWRNZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0ZTc0YwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNN19NUFUvUmVhZE1lLnR4dApAQCAtMCwwICsxLDE4IEBACitUaGVyZSBhcmUgdHdvIG9wdGlvbnMgZm9yIHJ1bm5pbmcgRnJlZVJUT1Mgb24gQVJNIENvcnRleC1NNyBtaWNyb2NvbnRyb2xsZXJzLgorVGhlIGJlc3Qgb3B0aW9uIGRlcGVuZHMgb24gdGhlIHJldmlzaW9uIG9mIHRoZSBBUk0gQ29ydGV4LU03IGNvcmUgaW4gdXNlLiAgVGhlCityZXZpc2lvbiBpcyBzcGVjaWZpZWQgYnkgYW4gJ3InIG51bWJlciwgYW5kIGEgJ3AnIG51bWJlciwgc28gd2lsbCBsb29rIHNvbWV0aGluZworbGlrZSAncjBwMScuICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG1pY3JvY29udHJvbGxlciBpbiB1c2UgdG8gZmluZCB0aGUgCityZXZpc2lvbiBvZiB0aGUgQ29ydGV4LU03IGNvcmUgdXNlZCBpbiB0aGF0IG1pY3JvY29udHJvbGxlci4gIElmIGluIGRvdWJ0LCB1c2UgCit0aGUgRnJlZVJUT1MgcG9ydCBwcm92aWRlZCBzcGVjaWZpY2FsbHkgZm9yIHIwcDEgcmV2aXNpb25zLCBhcyB0aGF0IGNhbiBiZSB1c2VkCit3aXRoIGFsbCBjb3JlIHJldmlzaW9ucy4KKworVGhlIGZpcnN0IG9wdGlvbiBpcyB0byB1c2UgdGhlIEFSTSBDb3J0ZXgtTTRGIHBvcnQsIGFuZCB0aGUgc2Vjb25kIG9wdGlvbiBpcyB0bwordXNlIHRoZSBDb3J0ZXgtTTcgcjBwMSBwb3J0IC0gdGhlIGxhdHRlciBjb250YWluaW5nIGEgbWlub3IgZXJyYXRhIHdvcmthcm91bmQuCisKK0lmIHRoZSByZXZpc2lvbiBvZiB0aGUgQVJNIENvcnRleC1NNyBjb3JlIGlzIG5vdCByMHAxIHRoZW4gZWl0aGVyIG9wdGlvbiBjYW4gYmUKK3VzZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIEZyZWVSVE9TIEFSTSBDb3J0ZXgtTTRGIHBvcnQgbG9jYXRlZCBpbiAKK3RoZSAvRnJlZVJUT1MvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ000RiBkaXJlY3RvcnkuCisKK0lmIHRoZSByZXZpc2lvbiBvZiB0aGUgQVJNIENvcnRleC1NNyBjb3JlIGlzIHIwcDEgdGhlbiB1c2UgdGhlIEZyZWVSVE9TIEFSTQorQ29ydGV4LU03IHIwcDEgcG9ydCBsb2NhdGVkIGluIHRoZSAvRnJlZVJUT1MvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X0dDQy9yMHAxCitkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQzZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwpAQCAtMCwwICsxLDk3OCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmgKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIERlZmluaW5nIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHByZXZlbnRzIHRhc2suaCBmcm9tIHJlZGVmaW5pbmcKK2FsbCB0aGUgQVBJIGZ1bmN0aW9ucyB0byB1c2UgdGhlIE1QVSB3cmFwcGVycy4gIFRoYXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuCit0YXNrLmggaXMgaW5jbHVkZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyNpZm5kZWYgX19WRlBfRlBfXworCSNlcnJvciBUaGlzIHBvcnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgdG8gZW5hYmxlIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQuCisjZW5kaWYKKworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKworI2lmbmRlZiBjb25maWdTWVNUSUNLX0NMT0NLX0haCisJI2RlZmluZSBjb25maWdTWVNUSUNLX0NMT0NLX0haIGNvbmZpZ0NQVV9DTE9DS19IWgorI2VuZGlmCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgdGhlIE5WSUMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHCSAgICAoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyX1JFRwkJCQkJKCAqCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMWMgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU19DVFJMX1NUQVRFX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDI0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19NRU1fRkFVTFRfRU5BQkxFCQkJCSggMVVMIDw8IDE2VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoZSBNUFUuICovCisjZGVmaW5lIHBvcnRNUFVfVFlQRV9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDkwICkgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5QyApICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkQTAgKSApCisjZGVmaW5lIHBvcnRNUFVfQ1RSTF9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk0ICkgKQorI2RlZmluZSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUJCQkJKCA4VUwgPDwgOFVMICkgLyogOCByZWdpb25zLCB1bmlmaWVkLiAqLworI2RlZmluZSBwb3J0TVBVX0VOQUJMRQkJCQkJCQkoIDB4MDFVTCApCisjZGVmaW5lIHBvcnRNUFVfQkFDS0dST1VORF9FTkFCTEUJCQkJKCAxVUwgPDwgMlVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfRVhFQ1VUSU9OX1NUQVJUX0FERFJFU1MJKCAwVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9WQUxJRAkJCQkJKCAweDEwVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FTkFCTEUJCQkJCSggMHgwMVVMICkKKyNkZWZpbmUgcG9ydFBFUklQSEVSQUxTX1NUQVJUX0FERFJFU1MJCQkweDQwMDAwMDAwVUwKKyNkZWZpbmUgcG9ydFBFUklQSEVSQUxTX0VORF9BRERSRVNTCQkJCTB4NUZGRkZGRkZVTAorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoZSBTeXNUaWNrLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMSwkJCQkJKCAweDAwMDAwMDA0VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0lOVAkJCQkJKCAweDAwMDAwMDAyVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUcgICAgICAJCSggMVVMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRQkJCQkJKCAweDAwMDAwMDAxVUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZfUFJJCQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1ZDX1BSSQkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIC0gMVVMICkgPDwgMjRVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBWRlAuICovCisjZGVmaW5lIHBvcnRGUENDUgkJCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0VUwgKSAvKiBGbG9hdGluZyBwb2ludCBjb250ZXh0IGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUwkJCQkoIDB4M1VMIDw8IDMwVUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJCQkJKCAweDAxMDAwMDAwVUwgKQorI2RlZmluZSBwb3J0SU5JVElBTF9FWEVDX1JFVFVSTgkJCQkJKCAweGZmZmZmZmZkVUwgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRAkJKCAweDAzICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9QUklWSUxFR0VECQkoIDB4MDIgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFuIGludGVycnVwdCBwcmlvcml0eS4gKi8KKyNkZWZpbmUgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUgkJKCAxNiApCisjZGVmaW5lIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgCSggMHhFMDAwRTNGMCApCisjZGVmaW5lIHBvcnRBSVJDUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBFRDBDICkgKQorI2RlZmluZSBwb3J0TUFYXzhfQklUX1ZBTFVFCQkJCQkoICggdWludDhfdCApIDB4ZmYgKQorI2RlZmluZSBwb3J0VE9QX0JJVF9PRl9CWVRFCQkJCQkoICggdWludDhfdCApIDB4ODAgKQorI2RlZmluZSBwb3J0TUFYX1BSSUdST1VQX0JJVFMJCQkJKCAoIHVpbnQ4X3QgKSA3ICkKKyNkZWZpbmUgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sJCQkJKCAweDA3VUwgPDwgOFVMICkKKyNkZWZpbmUgcG9ydFBSSUdST1VQX1NISUZUCQkJCQkoIDhVTCApCisKKy8qIE9mZnNldHMgaW4gdGhlIHN0YWNrIHRvIHRoZSBwYXJhbWV0ZXJzIHdoZW4gaW5zaWRlIHRoZSBTVkMgaGFuZGxlci4gKi8KKyNkZWZpbmUgcG9ydE9GRlNFVF9UT19QQwkJCQkJCSggNiApCisKKy8qIFRoZSBzeXN0aWNrIGlzIGEgMjQtYml0IGNvdW50ZXIuICovCisjZGVmaW5lIHBvcnRNQVhfMjRfQklUX05VTUJFUgkJKCAweGZmZmZmZlVMICkKKworLyogQSBmaWRkbGUgZmFjdG9yIHRvIGVzdGltYXRlIHRoZSBudW1iZXIgb2YgU3lzVGljayBjb3VudHMgdGhhdCB3b3VsZCBoYXZlCitvY2N1cnJlZCB3aGlsZSB0aGUgU3lzVGljayBjb3VudGVyIGlzIHN0b3BwZWQgZHVyaW5nIHRpY2tsZXNzIGlkbGUKK2NhbGN1bGF0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SCSggNDVVTCApCisKKy8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCitoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KKyNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZwordmFyaWFibGUuICBOb3RlIHRoaXMgaXMgbm90IHNhdmVkIGFzIHBhcnQgb2YgdGhlIHRhc2sgY29udGV4dCBhcyBjb250ZXh0Citzd2l0Y2hlcyBjYW4gb25seSBvY2N1ciB3aGVuIHV4Q3JpdGljYWxOZXN0aW5nIGlzIHplcm8uICovCitzdGF0aWMgVUJhc2VUeXBlX3QgdXhDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhOworCisvKgorICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuICBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcworICogZmlsZSBpcyB3ZWFrIHRvIGFsbG93IGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gY2hhbmdlIHRoZSB0aW1lciB1c2VkIHRvCisgKiBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CisKKy8qCisgKiBDb25maWd1cmUgYSBudW1iZXIgb2Ygc3RhbmRhcmQgTVBVIHJlZ2lvbnMgdGhhdCBhcmUgdXNlZCBieSBhbGwgdGFza3MuCisgKi8KK3N0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFJldHVybiB0aGUgc21hbGxlc3QgTVBVIHJlZ2lvbiBzaXplIHRoYXQgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgd2lsbCBmaXQKKyAqIGludG8uICBUaGUgcmVnaW9uIHNpemUgaXMgcmV0dXJuZWQgYXMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHByb2dyYW1tZWQKKyAqIGludG8gdGhlIHJlZ2lvbiBhdHRyaWJ1dGUgcmVnaXN0ZXIgZm9yIHRoYXQgcmVnaW9uLgorICovCitzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogQ2hlY2tzIHRvIHNlZSBpZiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBvZiBhbiB1bnByaXZpbGVnZWQgdGFzaywgYW5kCisgKiBpZiBzbyByYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBhbmQgcmV0dXJucyBmYWxzZSAtIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcKKyAqIG90aGVyIHRoYW4gcmV0dXJuIHRydWUuCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKTsKKworLyoKKyAqIFN0YW5kYXJkIEZyZWVSVE9TIGV4Y2VwdGlvbiBoYW5kbGVycy4KKyAqLwordm9pZCB4UG9ydFBlbmRTVkhhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047Cit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKSAgX19hdHRyaWJ1dGVfXyAoKG9wdGltaXplKCIzIikpKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBTdGFydHMgdGhlIHNjaGVkdWxlciBieSByZXN0b3JpbmcgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgdG8gcnVuLgorICovCitzdGF0aWMgdm9pZCBwcnZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBDIHBvcnRpb24gb2YgdGhlIFNWQyBoYW5kbGVyLiAgVGhlIFNWQyBoYW5kbGVyIGlzIHNwbGl0IGJldHdlZW4gYW4gYXNtIGVudHJ5CisgKiBhbmQgYSBDIHdyYXBwZXIgZm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nIGFuZCBtYWludGVuYW5jZS4KKyAqLworc3RhdGljIHZvaWQgcHJ2U1ZDSGFuZGxlciggdWludDMyX3QgKnB1bFJlZ2lzdGVycyApIF9fYXR0cmlidXRlX18oKCBub2lubGluZSApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogRnVuY3Rpb24gdG8gZW5hYmxlIHRoZSBWRlAuCisgKi8KKyBzdGF0aWMgdm9pZCB2UG9ydEVuYWJsZVZGUCggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisgCisvKgorICogVGhlIG51bWJlciBvZiBTeXNUaWNrIGluY3JlbWVudHMgdGhhdCBtYWtlIHVwIG9uZSB0aWNrIHBlcmlvZC4KKyAqLworI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKKwlzdGF0aWMgdWludDMyX3QgdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGljayBwZXJpb2RzIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgaXMgbGltaXRlZCBieSB0aGUKKyAqIDI0IGJpdCByZXNvbHV0aW9uIG9mIHRoZSBTeXNUaWNrIHRpbWVyLgorICovCisjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCXN0YXRpYyB1aW50MzJfdCB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogQ29tcGVuc2F0ZSBmb3IgdGhlIENQVSBjeWNsZXMgdGhhdCBwYXNzIHdoaWxlIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgKGxvdworICogcG93ZXIgZnVuY3Rpb25hbGl0eSBvbmx5LgorICovCisjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCXN0YXRpYyB1aW50MzJfdCB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFVzZWQgYnkgdGhlIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSBtYWNybyB0byBlbnN1cmUKKyAqIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgYXJlIG5vdCBjYWxsZWQgZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkCisgKiBhIHByaW9yaXR5IGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKyAqLworI2lmICggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJIHN0YXRpYyB1aW50OF90IHVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gMDsKKwkgc3RhdGljIHVpbnQzMl90IHVsTWF4UFJJR1JPVVBWYWx1ZSA9IDA7CisJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggY29uc3Qgdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0ICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK1N0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzLCBCYXNlVHlwZV90IHhSdW5Qcml2aWxlZ2VkICkKK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJaW50ZXJydXB0LiAqLworCXB4VG9wT2ZTdGFjay0tOyAvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQgb2YgaW50ZXJydXB0cy4gKi8KKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJLyogeFBTUiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoICggU3RhY2tUeXBlX3QgKSBweENvZGUgKSAmIHBvcnRTVEFSVF9BRERSRVNTX01BU0s7CS8qIFBDICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9IDA7CS8qIExSICovCisJcHhUb3BPZlN0YWNrIC09IDU7CS8qIFIxMiwgUjMsIFIyIGFuZCBSMS4gKi8KKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJLyogUjAgKi8KKwkKKwkvKiBBIHNhdmUgbWV0aG9kIGlzIGJlaW5nIHVzZWQgdGhhdCByZXF1aXJlcyBlYWNoIHRhc2sgdG8gbWFpbnRhaW4gaXRzCisJb3duIGV4ZWMgcmV0dXJuIHZhbHVlLiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWEVDX1JFVFVSTjsKKwkKKwlweFRvcE9mU3RhY2sgLT0gOTsJLyogUjExLCBSMTAsIFI5LCBSOCwgUjcsIFI2LCBSNSBhbmQgUjQuICovCisKKwlpZiggeFJ1blByaXZpbGVnZWQgPT0gcGRUUlVFICkKKwl7CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1BSSVZJTEVHRUQ7CisJfQorCWVsc2UKKwl7CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRDsKKwl9CisKKwlyZXR1cm4gcHhUb3BPZlN0YWNrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRTVkNIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBBc3N1bWVzIHBzcCB3YXMgaW4gdXNlLiAqLworCV9fYXNtIHZvbGF0aWxlCisJKAorCQkjaWZuZGVmIFVTRV9QUk9DRVNTX1NUQUNLCS8qIENvZGUgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBpZiBhIG1haW4oKSBpcyB1c2luZyB0aGUgcHJvY2VzcyBzdGFjay4gKi8KKwkJCSIJdHN0IGxyLCAjNAkJCQkJCVxuIgorCQkJIglpdGUgZXEJCQkJCQkJXG4iCisJCQkiCW1yc2VxIHIwLCBtc3AJCQkJCVxuIgorCQkJIgltcnNuZSByMCwgcHNwCQkJCQlcbiIKKwkJI2Vsc2UKKwkJCSIJbXJzIHIwLCBwc3AJCQkJCQlcbiIKKwkJI2VuZGlmCisJCQkiCWIgJTAJCQkJCQkJXG4iCisJCQk6OiJpIihwcnZTVkNIYW5kbGVyKToicjAiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZTVkNIYW5kbGVyKAl1aW50MzJfdCAqcHVsUGFyYW0gKQorewordWludDhfdCB1Y1NWQ051bWJlcjsKKworCS8qIFRoZSBzdGFjayBjb250YWluczogcjAsIHIxLCByMiwgcjMsIHIxMiwgcjE0LCB0aGUgcmV0dXJuIGFkZHJlc3MgYW5kCisJeFBTUi4gIFRoZSBmaXJzdCBhcmd1bWVudCAocjApIGlzIHB1bFBhcmFtWyAwIF0uICovCisJdWNTVkNOdW1iZXIgPSAoICggdWludDhfdCAqICkgcHVsUGFyYW1bIHBvcnRPRkZTRVRfVE9fUEMgXSApWyAtMiBdOworCXN3aXRjaCggdWNTVkNOdW1iZXIgKQorCXsKKwkJY2FzZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgk6CXBvcnROVklDX1NZU1BSSTFfUkVHIHw9IHBvcnROVklDX1NWQ19QUkk7CisJCQkJCQkJCQkJCXBydlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soKTsKKwkJCQkJCQkJCQkJYnJlYWs7CisKKwkJY2FzZSBwb3J0U1ZDX1lJRUxECQkJCToJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsKKwkJCQkJCQkJCQkJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZAorCQkJCQkJCQkJCQlidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzIGNvbXBsZXRlbHkKKwkJCQkJCQkJCQkJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUKKwkJCQkJCQkJCQkJYXJjaGl0ZWN0dXJlLiAqLworCQkJCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSggImRzYiIgKTsKKwkJCQkJCQkJCQkJX19hc20gdm9sYXRpbGUoICJpc2IiICk7CisKKwkJCQkJCQkJCQkJYnJlYWs7CisKKwkJY2FzZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRQk6CV9fYXNtIHZvbGF0aWxlCisJCQkJCQkJCQkJCSgKKwkJCQkJCQkJCQkJCSIJbXJzIHIxLCBjb250cm9sCQlcbiIgLyogT2J0YWluIGN1cnJlbnQgY29udHJvbCB2YWx1ZS4gKi8KKwkJCQkJCQkJCQkJCSIJYmljIHIxLCAjMQkJCVxuIiAvKiBTZXQgcHJpdmlsZWdlIGJpdC4gKi8KKwkJCQkJCQkJCQkJCSIJbXNyIGNvbnRyb2wsIHIxCQlcbiIgLyogV3JpdGUgYmFjayBuZXcgY29udHJvbCB2YWx1ZS4gKi8KKwkJCQkJCQkJCQkJCTo6OiJyMSIKKwkJCQkJCQkJCQkJKTsKKwkJCQkJCQkJCQkJYnJlYWs7CisKKwkJZGVmYXVsdAkJCQkJCQk6CS8qIFVua25vd24gU1ZDIGNhbGwuICovCisJCQkJCQkJCQkJCWJyZWFrOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkKK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIglsZHIgcjAsID0weEUwMDBFRDA4CQkJCVxuIiAvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJCSIJbGRyIHIwLCBbcjBdCQkJCQlcbiIKKwkJIglsZHIgcjAsIFtyMF0JCQkJCVxuIgorCQkiCW1zciBtc3AsIHIwCQkJCQkJXG4iIC8qIFNldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwkJIglsZHIJcjMsIHB4Q3VycmVudFRDQkNvbnN0MgkJXG4iIC8qIFJlc3RvcmUgdGhlIGNvbnRleHQuICovCisJCSIJbGRyIHIxLCBbcjNdCQkJCQlcbiIKKwkJIglsZHIgcjAsIFtyMV0JCQkJCVxuIiAvKiBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgVENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwkJIglhZGQgcjEsIHIxLCAjNAkJCQkJXG4iIC8qIE1vdmUgb250byB0aGUgc2Vjb25kIGl0ZW0gaW4gdGhlIFRDQi4uLiAqLworCQkiCWxkciByMiwgPTB4ZTAwMGVkOWMJCQkJXG4iIC8qIFJlZ2lvbiBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIuICovCisJCSIJbGRtaWEgcjEhLCB7cjQtcjExfQkJCQlcbiIgLyogUmVhZCA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwkJIglzdG1pYSByMiEsIHtyNC1yMTF9CQkJCVxuIiAvKiBXcml0ZSA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwkJIglsZG1pYSByMCEsIHtyMy1yMTEsIHIxNH0JCVxuIiAvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCBvbiBleGNlcHRpb24gZW50cnkuICovCisJCSIJbXNyIGNvbnRyb2wsIHIzCQkJCQlcbiIKKwkJIgltc3IgcHNwLCByMAkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSB0YXNrIHN0YWNrIHBvaW50ZXIuICovCisJCSIJbW92IHIwLCAjMAkJCQkJCVxuIgorCQkiCW1zcgliYXNlcHJpLCByMAkJCQkJXG4iCisJCSIJYnggcjE0CQkJCQkJCVxuIgorCQkiCQkJCQkJCQkJXG4iCisJCSIJLmFsaWduIDQJCQkJCQlcbiIKKwkJInB4Q3VycmVudFRDQkNvbnN0MjogLndvcmQgcHhDdXJyZW50VENCCVxuIgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApCit7CisJLyogY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLiAgU2VlCisJaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCAqLworCWNvbmZpZ0FTU0VSVCggKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSApOworCisJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwl7CisJCXZvbGF0aWxlIHVpbnQzMl90IHVsT3JpZ2luYWxQcmlvcml0eTsKKwkJdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSAoIHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCApICggcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiArIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKTsKKwkJdm9sYXRpbGUgdWludDhfdCB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHByaW9yaXR5IGZyb20gd2hpY2ggSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCWZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiAgSVNSIHNhZmUgZnVuY3Rpb25zIGFyZSB0aG9zZSB0aGF0IGVuZCBpbgorCQkiRnJvbUlTUiIuICBGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0bworCQllbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQlTYXZlIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkgdmFsdWUgdGhhdCBpcyBhYm91dCB0byBiZSBjbG9iYmVyZWQuICovCisJCXVsT3JpZ2luYWxQcmlvcml0eSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYXZhaWxhYmxlLiAgRmlyc3Qgd3JpdGUgdG8gYWxsCisJCXBvc3NpYmxlIGJpdHMuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gcG9ydE1BWF84X0JJVF9WQUxVRTsKKworCQkvKiBSZWFkIHRoZSB2YWx1ZSBiYWNrIHRvIHNlZSBob3cgbWFueSBiaXRzIHN0dWNrLiAqLworCQl1Y01heFByaW9yaXR5VmFsdWUgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUga2VybmVsLCBhbmQgdGhlIFNWQworCWhhbmRsZXIgaGlnaGVyIHByaW9yaXR5IHNvIGl0IGNhbiBiZSB1c2VkIHRvIGV4aXQgYSBjcml0aWNhbCBzZWN0aW9uICh3aGVyZQorCWxvd2VyIHByaW9yaXRpZXMgYXJlIG1hc2tlZCkuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIENvbmZpZ3VyZSB0aGUgcmVnaW9ucyBpbiB0aGUgTVBVIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgdGFza3MuICovCisJcHJ2U2V0dXBNUFUoKTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIEVuc3VyZSB0aGUgVkZQIGlzIGVuYWJsZWQgLSBpdCBzaG91bGQgYmUgYW55d2F5LiAqLworCXZQb3J0RW5hYmxlVkZQKCk7CisKKwkvKiBMYXp5IHNhdmUgYWx3YXlzLiAqLworCSooIHBvcnRGUENDUiApIHw9IHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUzsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCV9fYXNtIHZvbGF0aWxlKAorCQkJCQkiIGxkciByMCwgPTB4RTAwMEVEMDggCVxuIiAvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJCQkJCSIgbGRyIHIwLCBbcjBdIAkJCVxuIgorCQkJCQkiIGxkciByMCwgW3IwXSAJCQlcbiIKKwkJCQkJIiBtc3IgbXNwLCByMAkJCVxuIiAvKiBTZXQgdGhlIG1zcCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJCQkJCSIgY3BzaWUgaQkJCQlcbiIgLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJCQkJCSIgY3BzaWUgZgkJCQlcbiIKKwkJCQkJIiBkc2IJCQkJCVxuIgorCQkJCQkiIGlzYgkJCQkJXG4iCisJCQkJCSIgc3ZjICUwCQkJCVxuIiAvKiBTeXN0ZW0gY2FsbCB0byBzdGFydCBmaXJzdCB0YXNrLiAqLworCQkJCQkiIG5vcAkJCQkJXG4iCisJCQkJCTo6ICJpIiAocG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIpICk7CisKKwkvKiBTaG91bGQgbm90IGdldCBoZXJlISAqLworCXJldHVybiAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbmRTY2hlZHVsZXIoIHZvaWQgKQoreworCS8qIE5vdCBpbXBsZW1lbnRlZCBpbiBwb3J0cyB3aGVyZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiB0by4KKwlBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0LiAqLworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgPT0gMTAwMFVMICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKQoreworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJdXhDcml0aWNhbE5lc3RpbmcrKzsKKworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKQoreworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nICk7CisJdXhDcml0aWNhbE5lc3RpbmctLTsKKwlpZiggdXhDcml0aWNhbE5lc3RpbmcgPT0gMCApCisJeworCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwl9CisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB4UG9ydFBlbmRTVkhhbmRsZXIoIHZvaWQgKQoreworCS8qIFRoaXMgaXMgYSBuYWtlZCBmdW5jdGlvbi4gKi8KKworCV9fYXNtIHZvbGF0aWxlCisJKAorCQkiCW1ycyByMCwgcHNwCQkJCQkJCVxuIgorCQkiCQkJCQkJCQkJCVxuIgorCQkiCWxkcglyMywgcHhDdXJyZW50VENCQ29uc3QJCQlcbiIgLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJCSIJbGRyCXIyLCBbcjNdCQkJCQkJXG4iCisJCSIJCQkJCQkJCQkJXG4iCisJCSIJdHN0IHIxNCwgIzB4MTAJCQkJCQlcbiIgLyogSXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHB1c2ggaGlnaCB2ZnAgcmVnaXN0ZXJzLiAqLworCQkiCWl0IGVxCQkJCQkJCQlcbiIKKwkJIgl2c3RtZGJlcSByMCEsIHtzMTYtczMxfQkJCQlcbiIKKwkJIgkJCQkJCQkJCQlcbiIKKwkJIgltcnMgcjEsIGNvbnRyb2wJCQkJCQlcbiIKKwkJIglzdG1kYiByMCEsIHtyMSwgcjQtcjExLCByMTR9CQlcbiIgLyogU2F2ZSB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycy4gKi8KKwkJIglzdHIgcjAsIFtyMl0JCQkJCQlcbiIgLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbnRvIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIFRDQi4gKi8KKwkJIgkJCQkJCQkJCQlcbiIKKwkJIglzdG1kYiBzcCEsIHtyM30JCQkJCQlcbiIKKwkJIgltb3YgcjAsICUwCQkJCQkJCVxuIgorCSAgIgljcHNpZCBpCQkJCQkJCQlcbiIgLyogRXJyYXRhIHdvcmthcm91bmQuICovCisJCSIJbXNyIGJhc2VwcmksIHIwCQkJCQkJXG4iCisJCSIJZHNiCQkJCQkJCQkJXG4iCisJCSIJaXNiCQkJCQkJCQkJXG4iCisJICAiCWNwc2llIGkJCQkJCQkJCVxuIiAvKiBFcnJhdGEgd29ya2Fyb3VuZC4gKi8KKwkJIglibCB2VGFza1N3aXRjaENvbnRleHQJCQkJXG4iCisJCSIJbW92IHIwLCAjMAkJCQkJCQlcbiIKKwkJIgltc3IgYmFzZXByaSwgcjAJCQkJCQlcbiIKKwkJIglsZG1pYSBzcCEsIHtyM30JCQkJCQlcbiIKKwkJIgkJCQkJCQkJCQlcbiIJLyogUmVzdG9yZSB0aGUgY29udGV4dC4gKi8KKwkJIglsZHIgcjEsIFtyM10JCQkJCQlcbiIKKwkJIglsZHIgcjAsIFtyMV0JCQkJCQlcbiIgLyogVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJCSIJYWRkIHIxLCByMSwgIzQJCQkJCQlcbiIgLyogTW92ZSBvbnRvIHRoZSBzZWNvbmQgaXRlbSBpbiB0aGUgVENCLi4uICovCisJCSIJbGRyIHIyLCA9MHhlMDAwZWQ5YwkJCQkJXG4iIC8qIFJlZ2lvbiBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIuICovCisJCSIJbGRtaWEgcjEhLCB7cjQtcjExfQkJCQkJXG4iIC8qIFJlYWQgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJCSIJc3RtaWEgcjIhLCB7cjQtcjExfQkJCQkJXG4iIC8qIFdyaXRlIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCQkiCWxkbWlhIHIwISwge3IzLXIxMSwgcjE0fQkJCVxuIiAvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCBvbiBleGNlcHRpb24gZW50cnkuICovCisJCSIJbXNyIGNvbnRyb2wsIHIzCQkJCQkJXG4iCisJCSIJCQkJCQkJCQkJXG4iCisJCSIJdHN0IHIxNCwgIzB4MTAJCQkJCQlcbiIgLyogSXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHBvcCB0aGUgaGlnaCB2ZnAgcmVnaXN0ZXJzIHRvby4gKi8KKwkJIglpdCBlcQkJCQkJCQkJXG4iCisJCSIJdmxkbWlhZXEgcjAhLCB7czE2LXMzMX0JCQkJXG4iCisJCSIJCQkJCQkJCQkJXG4iCisJCSIJbXNyIHBzcCwgcjAJCQkJCQkJXG4iCisJCSIJYnggcjE0CQkJCQkJCQlcbiIKKwkJIgkJCQkJCQkJCQlcbiIKKwkJIgkuYWxpZ24gNAkJCQkJCQlcbiIKKwkJInB4Q3VycmVudFRDQkNvbnN0OiAud29yZCBweEN1cnJlbnRUQ0IJXG4iCisJCTo6ImkiKGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSkKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApCit7Cit1aW50MzJfdCB1bER1bW15OworCisJdWxEdW1teSA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCS8qIEluY3JlbWVudCB0aGUgUlRPUyB0aWNrLiAqLworCQlpZiggeFRhc2tJbmNyZW1lbnRUaWNrKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIFBlbmQgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkJCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCX0KKwl9CisJcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCB1bER1bW15ICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKKworCV9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCBUaWNrVHlwZV90IHhFeHBlY3RlZElkbGVUaW1lICkKKwl7CisJdWludDMyX3QgdWxSZWxvYWRWYWx1ZSwgdWxDb21wbGV0ZVRpY2tQZXJpb2RzLCB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzLCB1bFN5c1RpY2tDVFJMOworCVRpY2tUeXBlX3QgeE1vZGlmaWFibGVJZGxlVGltZTsKKworCQkvKiBNYWtlIHN1cmUgdGhlIFN5c1RpY2sgcmVsb2FkIHZhbHVlIGRvZXMgbm90IG92ZXJmbG93IHRoZSBjb3VudGVyLiAqLworCQlpZiggeEV4cGVjdGVkSWRsZVRpbWUgPiB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzICkKKwkJeworCQkJeEV4cGVjdGVkSWRsZVRpbWUgPSB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzOworCQl9CisKKwkJLyogU3RvcCB0aGUgU3lzVGljayBtb21lbnRhcmlseS4gIFRoZSB0aW1lIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgZm9yCisJCWlzIGFjY291bnRlZCBmb3IgYXMgYmVzdCBpdCBjYW4gYmUsIGJ1dCB1c2luZyB0aGUgdGlja2xlc3MgbW9kZSB3aWxsCisJCWluZXZpdGFibHkgcmVzdWx0IGluIHNvbWUgdGlueSBkcmlmdCBvZiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZQorCQlrZXJuZWwgd2l0aCByZXNwZWN0IHRvIGNhbGVuZGFyIHRpbWUuICovCisJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgJj0gfnBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworCisJCS8qIENhbGN1bGF0ZSB0aGUgcmVsb2FkIHZhbHVlIHJlcXVpcmVkIHRvIHdhaXQgeEV4cGVjdGVkSWRsZVRpbWUKKwkJdGljayBwZXJpb2RzLiAgLTEgaXMgdXNlZCBiZWNhdXNlIHRoaXMgY29kZSB3aWxsIGV4ZWN1dGUgcGFydCB3YXkKKwkJdGhyb3VnaCBvbmUgb2YgdGhlIHRpY2sgcGVyaW9kcy4gKi8KKwkJdWxSZWxvYWRWYWx1ZSA9IHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgKyAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICogKCB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTCApICk7CisJCWlmKCB1bFJlbG9hZFZhbHVlID4gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKQorCQl7CisJCQl1bFJlbG9hZFZhbHVlIC09IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uOworCQl9CisKKwkJLyogRW50ZXIgYSBjcml0aWNhbCBzZWN0aW9uIGJ1dCBkb24ndCB1c2UgdGhlIHRhc2tFTlRFUl9DUklUSUNBTCgpCisJCW1ldGhvZCBhcyB0aGF0IHdpbGwgbWFzayBpbnRlcnJ1cHRzIHRoYXQgc2hvdWxkIGV4aXQgc2xlZXAgbW9kZS4gKi8KKwkJX19hc20gdm9sYXRpbGUoICJjcHNpZCBpIiApOworCQlfX2FzbSB2b2xhdGlsZSggImRzYiIgKTsKKwkJX19hc20gdm9sYXRpbGUoICJpc2IiICk7CisKKwkJLyogSWYgYSBjb250ZXh0IHN3aXRjaCBpcyBwZW5kaW5nIG9yIGEgdGFzayBpcyB3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGVyCisJCXRvIGJlIHVuc3VzcGVuZGVkIHRoZW4gYWJhbmRvbiB0aGUgbG93IHBvd2VyIGVudHJ5LiAqLworCQlpZiggZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgPT0gZUFib3J0U2xlZXAgKQorCQl7CisJCQkvKiBSZXN0YXJ0IGZyb20gd2hhdGV2ZXIgaXMgbGVmdCBpbiB0aGUgY291bnQgcmVnaXN0ZXIgdG8gY29tcGxldGUKKwkJCXRoaXMgdGljayBwZXJpb2QuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKworCQkJLyogUmVzZXQgdGhlIHJlbG9hZCByZWdpc3RlciB0byB0aGUgdmFsdWUgcmVxdWlyZWQgZm9yIG5vcm1hbCB0aWNrCisJCQlwZXJpb2RzLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAtIHNlZSBjb21tZW50cyBhYm92ZSB0aGUgY3BzaWQgaW5zdHJ1Y3Rpb24oKQorCQkJYWJvdmUuICovCisJCQlfX2FzbSB2b2xhdGlsZSggImNwc2llIGkiICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTZXQgdGhlIG5ldyByZWxvYWQgdmFsdWUuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxSZWxvYWRWYWx1ZTsKKworCQkJLyogQ2xlYXIgdGhlIFN5c1RpY2sgY291bnQgZmxhZyBhbmQgc2V0IHRoZSBjb3VudCB2YWx1ZSBiYWNrIHRvCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKworCQkJLyogU2xlZXAgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMuICBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORygpIGNhbgorCQkJc2V0IGl0cyBwYXJhbWV0ZXIgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IGl0cyBpbXBsZW1lbnRhdGlvbiBjb250YWlucworCQkJaXRzIG93biB3YWl0IGZvciBpbnRlcnJ1cHQgb3Igd2FpdCBmb3IgZXZlbnQgaW5zdHJ1Y3Rpb24sIGFuZCBzbyB3ZmkKKwkJCXNob3VsZCBub3QgYmUgZXhlY3V0ZWQgYWdhaW4uICBIb3dldmVyLCB0aGUgb3JpZ2luYWwgZXhwZWN0ZWQgaWRsZQorCQkJdGltZSB2YXJpYWJsZSBtdXN0IHJlbWFpbiB1bm1vZGlmaWVkLCBzbyBhIGNvcHkgaXMgdGFrZW4uICovCisJCQl4TW9kaWZpYWJsZUlkbGVUaW1lID0geEV4cGVjdGVkSWRsZVRpbWU7CisJCQljb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyggJnhNb2RpZmlhYmxlSWRsZVRpbWUgKTsKKwkJCWlmKCB4TW9kaWZpYWJsZUlkbGVUaW1lID4gMCApCisJCQl7CisJCQkJX19hc20gdm9sYXRpbGUoICJkc2IiICk7CisJCQkJX19hc20gdm9sYXRpbGUoICJ3ZmkiICk7CisJCQkJX19hc20gdm9sYXRpbGUoICJpc2IiICk7CisJCQl9CisJCQljb25maWdQT1NUX1NMRUVQX1BST0NFU1NJTkcoICZ4RXhwZWN0ZWRJZGxlVGltZSApOworCisJCQkvKiBTdG9wIFN5c1RpY2suICBBZ2FpbiwgdGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IgaXMKKwkJCWFjY291bnRlZCBmb3IgYXMgYmVzdCBpdCBjYW4gYmUsIGJ1dCB1c2luZyB0aGUgdGlja2xlc3MgbW9kZSB3aWxsCisJCQlpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkgZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUKKwkJCWtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgdGltZS4gKi8KKwkJCXVsU3lzVGlja0NUUkwgPSBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHOworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9ICggdWxTeXNUaWNrQ1RSTCAmIH5wb3J0TlZJQ19TWVNUSUNLX0VOQUJMRSApOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAtIHNlZSBjb21tZW50cyBhYm92ZSB0aGUgY3BzaWQgaW5zdHJ1Y3Rpb24oKQorCQkJYWJvdmUuICovCisJCQlfX2FzbSB2b2xhdGlsZSggImNwc2llIGkiICk7CisKKwkJCWlmKCAoIHVsU3lzVGlja0NUUkwgJiBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUcgKSAhPSAwICkKKwkJCXsKKwkJCQl1aW50MzJfdCB1bENhbGN1bGF0ZWRMb2FkVmFsdWU7CisKKwkJCQkvKiBUaGUgdGljayBpbnRlcnJ1cHQgaGFzIGFscmVhZHkgZXhlY3V0ZWQsIGFuZCB0aGUgU3lzVGljaworCQkJCWNvdW50IHJlbG9hZGVkIHdpdGggdWxSZWxvYWRWYWx1ZS4gIFJlc2V0IHRoZQorCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgd2l0aCB3aGF0ZXZlciByZW1haW5zIG9mIHRoaXMgdGljaworCQkJCXBlcmlvZC4gKi8KKwkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICkgLSAoIHVsUmVsb2FkVmFsdWUgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHICk7CisKKwkJCQkvKiBEb24ndCBhbGxvdyBhIHRpbnkgdmFsdWUsIG9yIHZhbHVlcyB0aGF0IGhhdmUgc29tZWhvdworCQkJCXVuZGVyZmxvd2VkIGJlY2F1c2UgdGhlIHBvc3Qgc2xlZXAgaG9vayBkaWQgc29tZXRoaW5nCisJCQkJdGhhdCB0b29rIHRvbyBsb25nLiAqLworCQkJCWlmKCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA8IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uICkgfHwgKCB1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApICkKKwkJCQl7CisJCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKTsKKwkJCQl9CisKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogVGhlIHRpY2sgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBhbHJlYWR5IGhhdmUgcGVuZGVkIHRoZSB0aWNrCisJCQkJcHJvY2Vzc2luZyBpbiB0aGUga2VybmVsLiAgQXMgdGhlIHBlbmRpbmcgdGljayB3aWxsIGJlCisJCQkJcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBleGl0cywgdGhlIHRpY2sgdmFsdWUKKwkJCQltYWludGFpbmVkIGJ5IHRoZSB0aWNrIGlzIHN0ZXBwZWQgZm9yd2FyZCBieSBvbmUgbGVzcyB0aGFuIHRoZQorCQkJCXRpbWUgc3BlbnQgd2FpdGluZy4gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBTb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgdGljayBpbnRlcnJ1cHQgZW5kZWQgdGhlIHNsZWVwLgorCQkJCVdvcmsgb3V0IGhvdyBsb25nIHRoZSBzbGVlcCBsYXN0ZWQgcm91bmRlZCB0byBjb21wbGV0ZSB0aWNrCisJCQkJcGVyaW9kcyAobm90IHRoZSB1bFJlbG9hZCB2YWx1ZSB3aGljaCBhY2NvdW50ZWQgZm9yIHBhcnQKKwkJCQl0aWNrcykuICovCisJCQkJdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cyA9ICggeEV4cGVjdGVkSWRsZVRpbWUgKiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApIC0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJCS8qIEhvdyBtYW55IGNvbXBsZXRlIHRpY2sgcGVyaW9kcyBwYXNzZWQgd2hpbGUgdGhlIHByb2Nlc3NvcgorCQkJCXdhcyB3YWl0aW5nPyAqLworCQkJCXVsQ29tcGxldGVUaWNrUGVyaW9kcyA9IHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKworCQkJCS8qIFRoZSByZWxvYWQgdmFsdWUgaXMgc2V0IHRvIHdoYXRldmVyIGZyYWN0aW9uIG9mIGEgc2luZ2xlIHRpY2sKKwkJCQlwZXJpb2QgcmVtYWlucy4gKi8KKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCAoIHVsQ29tcGxldGVUaWNrUGVyaW9kcyArIDFVTCApICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHM7CisJCQl9CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljayBzbyBpdCBydW5zIGZyb20gcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRworCQkJYWdhaW4sIHRoZW4gc2V0IHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgYmFjayB0byBpdHMgc3RhbmRhcmQKKwkJCXZhbHVlLiAgVGhlIGNyaXRpY2FsIHNlY3Rpb24gaXMgdXNlZCB0byBlbnN1cmUgdGhlIHRpY2sgaW50ZXJydXB0CisJCQljYW4gb25seSBleGVjdXRlIG9uY2UgaW4gdGhlIGNhc2UgdGhhdCB0aGUgcmVsb2FkIHJlZ2lzdGVyIGlzIG5lYXIKKwkJCXplcm8uICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCQkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7CisJCQl7CisJCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKwkJCQl2VGFza1N0ZXBUaWNrKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKTsKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUw7CisJCQl9CisJCQlwb3J0RVhJVF9DUklUSUNBTCgpOworCQl9CisJfQorCisjZW5kaWYgLyogI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2V0dXAgdGhlIHN5c3RpY2sgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cyBhdCB0aGUgcmVxdWlyZWQKKyAqIGZyZXF1ZW5jeS4KKyAqLworX19hdHRyaWJ1dGVfXygoIHdlYWsgKSkgdm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKQoreworCS8qIENhbGN1bGF0ZSB0aGUgY29uc3RhbnRzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgdGljayBpbnRlcnJ1cHQuICovCisJI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKKwl7CisJCXVsVGltZXJDb3VudHNGb3JPbmVUaWNrID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICk7CisJCXhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKwkJdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKKwl9CisJI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKSAtIDFVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gKCBwb3J0TlZJQ19TWVNUSUNLX0NMSyB8IHBvcnROVklDX1NZU1RJQ0tfSU5UIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEUgKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoaXMgaXMgYSBuYWtlZCBmdW5jdGlvbi4gKi8KK3N0YXRpYyB2b2lkIHZQb3J0RW5hYmxlVkZQKCB2b2lkICkKK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIglsZHIudyByMCwgPTB4RTAwMEVEODgJCVxuIiAvKiBUaGUgRlBVIGVuYWJsZSBiaXRzIGFyZSBpbiB0aGUgQ1BBQ1IuICovCisJCSIJbGRyIHIxLCBbcjBdCQkJCVxuIgorCQkiCQkJCQkJCQlcbiIKKwkJIglvcnIgcjEsIHIxLCAjKCAweGYgPDwgMjAgKQlcbiIgLyogRW5hYmxlIENQMTAgYW5kIENQMTEgY29wcm9jZXNzb3JzLCB0aGVuIHNhdmUgYmFjay4gKi8KKwkJIglzdHIgcjEsIFtyMF0JCQkJXG4iCisJCSIJYnggcjE0CQkJCQkJIgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2U2V0dXBNUFUoIHZvaWQgKQoreworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX19bXTsKK2V4dGVybiB1aW50MzJfdCBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfX1tdOworZXh0ZXJuIHVpbnQzMl90IF9fRkxBU0hfc2VnbWVudF9lbmRfX1tdOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X19bXTsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfX1tdOworCisJCS8qIEZpcnN0IHNldHVwIHRoZSBlbnRpcmUgZmxhc2ggZm9yIHVucHJpdmlsZWdlZCByZWFkIG9ubHkgYWNjZXNzLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCQkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfZW5kX18gLSAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIFNldHVwIHRoZSBmaXJzdCAxNksgZm9yIHByaXZpbGVnZWQgb25seSBhY2Nlc3MgKGV2ZW4gdGhvdWdoIGxlc3MKKwkJdGhhbiAxMEsgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCkuICBUaGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgY29kZSBpcworCQlwbGFjZWQuICovCisJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJCQkJCQkoIHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9PTkxZICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCQkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX18gLSAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIFNldHVwIHRoZSBwcml2aWxlZ2VkIGRhdGEgUkFNIHJlZ2lvbi4gIFRoaXMgaXMgd2hlcmUgdGhlIGtlcm5lbCBkYXRhCisJCWlzIHBsYWNlZC4gKi8KKwkJcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRyA9CSggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OICk7CisKKwkJcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRyA9CSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCQkJCQkJcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXyAtICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogQnkgZGVmYXVsdCBhbGxvdyBldmVyeXRoaW5nIHRvIGFjY2VzcyB0aGUgZ2VuZXJhbCBwZXJpcGhlcmFscy4gIFRoZQorCQlzeXN0ZW0gcGVyaXBoZXJhbHMgYW5kIHJlZ2lzdGVycyBhcmUgcHJvdGVjdGVkLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCBwb3J0UEVSSVBIRVJBTFNfU1RBUlRfQUREUkVTUyApIHwKKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0R0VORVJBTF9QRVJJUEhFUkFMU19SRUdJT04gKTsKKworCQlwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHID0JKCBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFIHwgcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApIHwKKwkJCQkJCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCBwb3J0UEVSSVBIRVJBTFNfRU5EX0FERFJFU1MgLSBwb3J0UEVSSVBIRVJBTFNfU1RBUlRfQUREUkVTUyApICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogRW5hYmxlIHRoZSBtZW1vcnkgZmF1bHQgZXhjZXB0aW9uLiAqLworCQlwb3J0TlZJQ19TWVNfQ1RSTF9TVEFURV9SRUcgfD0gcG9ydE5WSUNfTUVNX0ZBVUxUX0VOQUJMRTsKKworCQkvKiBFbmFibGUgdGhlIE1QVSB3aXRoIHRoZSBiYWNrZ3JvdW5kIHJlZ2lvbiBjb25maWd1cmVkLiAqLworCQlwb3J0TVBVX0NUUkxfUkVHIHw9ICggcG9ydE1QVV9FTkFCTEUgfCBwb3J0TVBVX0JBQ0tHUk9VTkRfRU5BQkxFICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVpbnQzMl90IHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1aW50MzJfdCB1bEFjdHVhbFNpemVJbkJ5dGVzICkKK3sKK3VpbnQzMl90IHVsUmVnaW9uU2l6ZSwgdWxSZXR1cm5WYWx1ZSA9IDQ7CisKKwkvKiAzMiBpcyB0aGUgc21hbGxlc3QgcmVnaW9uIHNpemUsIDMxIGlzIHRoZSBsYXJnZXN0IHZhbGlkIHZhbHVlIGZvcgorCXVsUmV0dXJuVmFsdWUuICovCisJZm9yKCB1bFJlZ2lvblNpemUgPSAzMlVMOyB1bFJldHVyblZhbHVlIDwgMzFVTDsgKCB1bFJlZ2lvblNpemUgPDw9IDFVTCApICkKKwl7CisJCWlmKCB1bEFjdHVhbFNpemVJbkJ5dGVzIDw9IHVsUmVnaW9uU2l6ZSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJeworCQkJdWxSZXR1cm5WYWx1ZSsrOworCQl9CisJfQorCisJLyogU2hpZnQgdGhlIGNvZGUgYnkgb25lIGJlZm9yZSByZXR1cm5pbmcgc28gaXQgY2FuIGJlIHdyaXR0ZW4gZGlyZWN0bHkKKwlpbnRvIHRoZSB0aGUgY29ycmVjdCBiaXQgcG9zaXRpb24gb2YgdGhlIGF0dHJpYnV0ZSByZWdpc3Rlci4gKi8KKwlyZXR1cm4gKCB1bFJldHVyblZhbHVlIDw8IDFVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJXG4iCisJCSIJdHN0IHIwLCAjMQkJCQkJCQlcbiIgLyogSXMgdGhlIHRhc2sgcnVubmluZyBwcml2aWxlZ2VkPyAqLworCQkiCWl0dGUgbmUJCQkJCQkJCVxuIgorCQkiCW1vdm5lIHIwLCAjMAkJCQkJCVxuIiAvKiBDT05UUk9MWzBdIT0wLCByZXR1cm4gZmFsc2UuICovCisJCSIJc3ZjbmUgJTAJCQkJCQkJXG4iIC8qIFN3aXRjaCB0byBwcml2aWxlZ2VkLiAqLworCQkiCW1vdmVxIHIwLCAjMQkJCQkJCVxuIiAvKiBDT05UUk9MWzBdPT0wLCByZXR1cm4gdHJ1ZS4gKi8KKwkJIglieCBscgkJCQkJCQkJXG4iCisJCTo6ICJpIiAocG9ydFNWQ19SQUlTRV9QUklWSUxFR0UpIDogInIwIgorCSk7CisKKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0U3RvcmVUYXNrTVBVU2V0dGluZ3MoIHhNUFVfU0VUVElOR1MgKnhNUFVTZXR0aW5ncywgY29uc3Qgc3RydWN0IHhNRU1PUllfUkVHSU9OICogY29uc3QgeFJlZ2lvbnMsIFN0YWNrVHlwZV90ICpweEJvdHRvbU9mU3RhY2ssIHVpbnQzMl90IHVsU3RhY2tEZXB0aCApCit7CitleHRlcm4gdWludDMyX3QgX19TUkFNX3NlZ21lbnRfc3RhcnRfX1tdOworZXh0ZXJuIHVpbnQzMl90IF9fU1JBTV9zZWdtZW50X2VuZF9fW107CitleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfX1tdOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fW107CitpbnQzMl90IGxJbmRleDsKK3VpbnQzMl90IHVsOworCisJaWYoIHhSZWdpb25zID09IE5VTEwgKQorCXsKKwkJLyogTm8gTVBVIHJlZ2lvbnMgYXJlIHNwZWNpZmllZCBzbyBhbGxvdyBhY2Nlc3MgdG8gYWxsIFJBTS4gKi8KKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJKCAoIHVpbnQzMl90ICkgX19TUkFNX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJKCBwb3J0U1RBQ0tfUkVHSU9OICk7CisKKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApIHwKKwkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX1NSQU1fc2VnbWVudF9lbmRfXyAtICggdWludDMyX3QgKSBfX1NSQU1fc2VnbWVudF9zdGFydF9fICkgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBSZS1pbnN0YXRlIHRoZSBwcml2aWxlZ2VkIG9ubHkgUkFNIHJlZ2lvbiBhcyB4UmVnaW9uWyAwIF0gd2lsbCBoYXZlCisJCWp1c3QgcmVtb3ZlZCB0aGUgcHJpdmlsZWdlZCBvbmx5IHBhcmFtZXRlcnMuICovCisJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMSBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPQorCQkJCSggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCSggcG9ydFNUQUNLX1JFR0lPTiArIDEgKTsKKworCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDEgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQlwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fIC0gKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBJbnZhbGlkYXRlIGFsbCBvdGhlciByZWdpb25zLiAqLworCQlmb3IoIHVsID0gMjsgdWwgPD0gcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUzsgdWwrKyApCisJCXsKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0gKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKSB8IHBvcnRNUFVfUkVHSU9OX1ZBTElEOworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQXR0cmlidXRlID0gMFVMOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdGFzayBpcyBjcmVhdGVkIC0gaW4KKwkJd2hpY2ggY2FzZSB0aGUgc3RhY2sgcmVnaW9uIHBhcmFtZXRlcnMgd2lsbCBiZSB2YWxpZC4gIEF0IGFsbCBvdGhlcgorCQl0aW1lcyB0aGUgc3RhY2sgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSB2YWxpZCBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZQorCQlzdGFjayByZWdpb24gaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLiAqLworCQlpZiggdWxTdGFja0RlcHRoID4gMCApCisJCXsKKwkJCS8qIERlZmluZSB0aGUgcmVnaW9uIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgc3RhY2suICovCisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDAgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0KKwkJCQkJKCAoIHVpbnQzMl90ICkgcHhCb3R0b21PZlN0YWNrICkgfAorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkoIHBvcnRTVEFDS19SRUdJT04gKTsgLyogUmVnaW9uIG51bWJlci4gKi8KKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8IC8qIFJlYWQgYW5kIHdyaXRlLiAqLworCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1bFN0YWNrRGVwdGggKiAoIHVpbnQzMl90ICkgc2l6ZW9mKCBTdGFja1R5cGVfdCApICkgKSB8CisJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisJCX0KKworCQlsSW5kZXggPSAwOworCisJCWZvciggdWwgPSAxOyB1bCA8PSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TOyB1bCsrICkKKwkJeworCQkJaWYoICggeFJlZ2lvbnNbIGxJbmRleCBdICkudWxMZW5ndGhJbkJ5dGVzID4gMFVMICkKKwkJCXsKKwkJCQkvKiBUcmFuc2xhdGUgdGhlIGdlbmVyaWMgcmVnaW9uIGRlZmluaXRpb24gY29udGFpbmVkIGluCisJCQkJeFJlZ2lvbnMgaW50byB0aGUgQ00zIHNwZWNpZmljIE1QVSBzZXR0aW5ncyB0aGF0IGFyZSB0aGVuCisJCQkJc3RvcmVkIGluIHhNUFVTZXR0aW5ncy4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJCQkoICggdWludDMyX3QgKSB4UmVnaW9uc1sgbEluZGV4IF0ucHZCYXNlQWRkcmVzcyApIHwKKwkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkoIHBvcnRTVEFDS19SRUdJT04gKyB1bCApOyAvKiBSZWdpb24gbnVtYmVyLiAqLworCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQXR0cmlidXRlID0KKwkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgKSApIHwKKwkJCQkJCSggeFJlZ2lvbnNbIGxJbmRleCBdLnVsUGFyYW1ldGVycyApIHwKKwkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogSW52YWxpZGF0ZSB0aGUgcmVnaW9uLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0gKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKSB8IHBvcnRNUFVfUkVHSU9OX1ZBTElEOworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9IDBVTDsKKwkJCX0KKworCQkJbEluZGV4Kys7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKworCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICkKKwl7CisJdWludDMyX3QgdWxDdXJyZW50SW50ZXJydXB0OworCXVpbnQ4X3QgdWNDdXJyZW50UHJpb3JpdHk7CisKKwkJLyogT2J0YWluIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW50ZXJydXB0LiAqLworCQlfX2FzbSB2b2xhdGlsZSggIm1ycyAlMCwgaXBzciIgOiAiPXIiKCB1bEN1cnJlbnRJbnRlcnJ1cHQgKSApOworCisJCS8qIElzIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGEgdXNlciBkZWZpbmVkIGludGVycnVwdD8gKi8KKwkJaWYoIHVsQ3VycmVudEludGVycnVwdCA+PSBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSICkKKwkJeworCQkJLyogTG9vayB1cCB0aGUgaW50ZXJydXB0J3MgcHJpb3JpdHkuICovCisJCQl1Y0N1cnJlbnRQcmlvcml0eSA9IHBjSW50ZXJydXB0UHJpb3JpdHlSZWdpc3RlcnNbIHVsQ3VycmVudEludGVycnVwdCBdOworCisJCQkvKiBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYgYSBzZXJ2aWNlIHJvdXRpbmUgKElTUikgZm9yCisJCQlhbiBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgY2FsbHMgYW4gSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCQlmdW5jdGlvbi4gIElTUiBzYWZlIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgbXVzdCAqb25seSogYmUgY2FsbGVkCisJCQlmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhdCBvciBiZWxvdworCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlOdW1lcmljYWxseSBsb3cgaW50ZXJydXB0IHByaW9yaXR5IG51bWJlcnMgcmVwcmVzZW50IGxvZ2ljYWxseSBoaWdoCisJCQlpbnRlcnJ1cHQgcHJpb3JpdGllcywgdGhlcmVmb3JlIHRoZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0IG11c3QKKwkJCWJlIHNldCB0byBhIHZhbHVlIGVxdWFsIHRvIG9yIG51bWVyaWNhbGx5ICpoaWdoZXIqIHRoYW4KKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJSW50ZXJydXB0cyB0aGF0CXVzZSB0aGUgRnJlZVJUT1MgQVBJIG11c3Qgbm90IGJlIGxlZnQgYXQgdGhlaXIKKwkJCWRlZmF1bHQgcHJpb3JpdHkgb2YJemVybyBhcyB0aGF0IGlzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHByaW9yaXR5LAorCQkJd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBhYm92ZSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFksCisJCQlhbmQJdGhlcmVmb3JlIGFsc28gZ3VhcmFudGVlZCB0byBiZSBpbnZhbGlkLgorCisJCQlGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0byBlbnN1cmUKKwkJCWludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBzaW1wbGUgYXMgcG9zc2libGUuCisKKwkJCVRoZSBmb2xsb3dpbmcgbGlua3MgcHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbjoKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL0ZBUUhlbHAuaHRtbCAqLworCQkJY29uZmlnQVNTRVJUKCB1Y0N1cnJlbnRQcmlvcml0eSA+PSB1Y01heFN5c0NhbGxQcmlvcml0eSApOworCQl9CisKKwkJLyogUHJpb3JpdHkgZ3JvdXBpbmc6ICBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKE5WSUMpIGFsbG93cyB0aGUgYml0cworCQl0aGF0IGRlZmluZSBlYWNoIGludGVycnVwdCdzIHByaW9yaXR5IHRvIGJlIHNwbGl0IGJldHdlZW4gYml0cyB0aGF0CisJCWRlZmluZSB0aGUgaW50ZXJydXB0J3MgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cyBhbmQgYml0cyB0aGF0IGRlZmluZQorCQl0aGUgaW50ZXJydXB0J3Mgc3ViLXByaW9yaXR5LiAgRm9yIHNpbXBsaWNpdHkgYWxsIGJpdHMgbXVzdCBiZSBkZWZpbmVkCisJCXRvIGJlIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMuICBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYKKwkJdGhpcyBpcyBub3QgdGhlIGNhc2UgKGlmIHNvbWUgYml0cyByZXByZXNlbnQgYSBzdWItcHJpb3JpdHkpLgorCisJCUlmIHRoZSBhcHBsaWNhdGlvbiBvbmx5IHVzZXMgQ01TSVMgbGlicmFyaWVzIGZvciBpbnRlcnJ1cHQKKwkJY29uZmlndXJhdGlvbiB0aGVuIHRoZSBjb3JyZWN0IHNldHRpbmcgY2FuIGJlIGFjaGlldmVkIG9uIGFsbCBDb3J0ZXgtTQorCQlkZXZpY2VzIGJ5IGNhbGxpbmcgTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKCAwICk7IGJlZm9yZSBzdGFydGluZyB0aGUKKwkJc2NoZWR1bGVyLiAgTm90ZSBob3dldmVyIHRoYXQgc29tZSB2ZW5kb3Igc3BlY2lmaWMgcGVyaXBoZXJhbCBsaWJyYXJpZXMKKwkJYXNzdW1lIGEgbm9uLXplcm8gcHJpb3JpdHkgZ3JvdXAgc2V0dGluZywgaW4gd2hpY2ggY2FzZXMgdXNpbmcgYSB2YWx1ZQorCQlvZiB6ZXJvIHdpbGwgcmVzdWx0IGluIHVucHJlZGljYWJsZSBiZWhhdmlvdXIuICovCisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0QUlSQ1JfUkVHICYgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sgKSA8PSB1bE1heFBSSUdST1VQVmFsdWUgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWQ3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1QVSBzcGVjaWZpYyBjb25zdGFudHMuICovCisjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMJCTEKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkoIDB4ODAwMDAwMDBVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURQkJCQkoIDB4MDNVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkJCSggMHgwNVVMIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkJCQkJKCAweDA2VUwgPDwgMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURQkoIDB4MDFVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUJCSggMHgwN1VMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSCQkJKCAweDAxVUwgPDwgMjhVTCApCisKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCSggMFVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkJKCAxVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OCQkJKCAyVUwgKQorI2RlZmluZSBwb3J0R0VORVJBTF9QRVJJUEhFUkFMU19SRUdJT04JCSggM1VMICkKKyNkZWZpbmUgcG9ydFNUQUNLX1JFR0lPTgkJCQkJKCA0VUwgKQorI2RlZmluZSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkgICAgKCA1VUwgKQorI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkoIDdVTCApCisjZGVmaW5lIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMJCSggKCBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OIC0gcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04gKSArIDEgKQorI2RlZmluZSBwb3J0VE9UQUxfTlVNX1JFR0lPTlMJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCisKKyNkZWZpbmUgcG9ydFNXSVRDSF9UT19VU0VSX01PREUoKSBfX2FzbSB2b2xhdGlsZSAoICIgbXJzIHIwLCBjb250cm9sIFxuIG9yciByMCwgIzEgXG4gbXNyIGNvbnRyb2wsIHIwICIgOjo6InIwIiApCisKK3R5cGVkZWYgc3RydWN0IE1QVV9SRUdJT05fUkVHSVNURVJTCit7CisJdWludDMyX3QgdWxSZWdpb25CYXNlQWRkcmVzczsKKwl1aW50MzJfdCB1bFJlZ2lvbkF0dHJpYnV0ZTsKK30geE1QVV9SRUdJT05fUkVHSVNURVJTOworCisvKiBQbHVzIDEgdG8gY3JlYXRlIHNwYWNlIGZvciB0aGUgc3RhY2sgcmVnaW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgTVBVX1NFVFRJTkdTCit7CisJeE1QVV9SRUdJT05fUkVHSVNURVJTIHhSZWdpb25bIHBvcnRUT1RBTF9OVU1fUkVHSU9OUyBdOworfSB4TVBVX1NFVFRJTkdTOworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWNzLiAqLworI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCTgKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTVkMgbnVtYmVycyBmb3IgdmFyaW91cyBzZXJ2aWNlcy4gKi8KKyNkZWZpbmUgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIJCQkJMAorI2RlZmluZSBwb3J0U1ZDX1lJRUxECQkJCQkJMQorI2RlZmluZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRQkJCQkyCisKKy8qIFNjaGVkdWxlciB1dGlsaXRpZXMuICovCisKKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJX19hc20gdm9sYXRpbGUgKCAiCVNWQwklMAlcbiIgOjogImkiIChwb3J0U1ZDX1lJRUxEKSApCisjZGVmaW5lIHBvcnRZSUVMRF9XSVRISU5fQVBJKCkgCQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLwkJCQkJCQkJXAorCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMgY29tcGxldGVseQlcCisJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLwkJCQkJCVwKKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgKTsJCQkJCQkJCQkJCQkJXAorCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOwkJCQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkxfUkVHCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCQkoIDFVTCA8PCAyOFVMICkKKyNkZWZpbmUgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4U3dpdGNoUmVxdWlyZWQgKSBpZiggeFN3aXRjaFJlcXVpcmVkICkgcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVAorI2RlZmluZSBwb3J0WUlFTERfRlJPTV9JU1IoIHggKSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHggKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENyaXRpY2FsIHNlY3Rpb24gbWFuYWdlbWVudC4gKi8KK2V4dGVybiB2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApOworZXh0ZXJuIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKTsKKyNkZWZpbmUgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpCQl1bFBvcnRSYWlzZUJBU0VQUkkoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJdlBvcnRTZXRCQVNFUFJJKHgpCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQkJCQl2UG9ydFJhaXNlQkFTRVBSSSgpCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQl2UG9ydFNldEJBU0VQUkkoMCkKKyNkZWZpbmUgcG9ydEVOVEVSX0NSSVRJQ0FMKCkJCQkJCXZQb3J0RW50ZXJDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRFWElUX0NSSVRJQ0FMKCkJCQkJCQl2UG9ydEV4aXRDcml0aWNhbCgpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4gIFRoZXNlIGFyZQorbm90IG5lY2Vzc2FyeSBmb3IgdG8gdXNlIHRoaXMgcG9ydC4gIFRoZXkgYXJlIGRlZmluZWQgc28gdGhlIGNvbW1vbiBkZW1vIGZpbGVzCisod2hpY2ggYnVpbGQgd2l0aCBhbGwgdGhlIHBvcnRzKSB3aWxsIGJ1aWxkLiAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIG9wdGltaXNhdGlvbnMuICovCisjaWZuZGVmIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTgorCSNkZWZpbmUgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIDEKKyNlbmRpZgorCisjaWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OID09IDEKKworCS8qIEdlbmVyaWMgaGVscGVyIGZ1bmN0aW9uLiAqLworCV9fYXR0cmlidXRlX18oICggYWx3YXlzX2lubGluZSApICkgc3RhdGljIGlubGluZSB1aW50OF90IHVjUG9ydENvdW50TGVhZGluZ1plcm9zKCB1aW50MzJfdCB1bEJpdG1hcCApCisJeworCXVpbnQ4X3QgdWNSZXR1cm47CisKKwkJX19hc20gdm9sYXRpbGUgKCAiY2x6ICUwLCAlMSIgOiAiPXIiICggdWNSZXR1cm4gKSA6ICJyIiAoIHVsQml0bWFwICkgKTsKKwkJcmV0dXJuIHVjUmV0dXJuOworCX0KKworCS8qIENoZWNrIHRoZSBjb25maWd1cmF0aW9uLiAqLworCSNpZiggY29uZmlnTUFYX1BSSU9SSVRJRVMgPiAzMiApCisJCSNlcnJvciBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gY2FuIG9ubHkgYmUgc2V0IHRvIDEgd2hlbiBjb25maWdNQVhfUFJJT1JJVElFUyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzIuICBJdCBpcyB2ZXJ5IHJhcmUgdGhhdCBhIHN5c3RlbSByZXF1aXJlcyBtb3JlIHRoYW4gMTAgdG8gMTUgZGlmZmVyZW5jZSBwcmlvcml0aWVzIGFzIHRhc2tzIHRoYXQgc2hhcmUgYSBwcmlvcml0eSB3aWxsIHRpbWUgc2xpY2UuCisJI2VuZGlmCisKKwkvKiBTdG9yZS9jbGVhciB0aGUgcmVhZHkgcHJpb3JpdGllcyBpbiBhIGJpdCBtYXAuICovCisJI2RlZmluZSBwb3J0UkVDT1JEX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSB8PSAoIDFVTCA8PCAoIHV4UHJpb3JpdHkgKSApCisJI2RlZmluZSBwb3J0UkVTRVRfUkVBRFlfUFJJT1JJVFkoIHV4UHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgKCB1eFJlYWR5UHJpb3JpdGllcyApICY9IH4oIDFVTCA8PCAoIHV4UHJpb3JpdHkgKSApCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCSNkZWZpbmUgcG9ydEdFVF9ISUdIRVNUX1BSSU9SSVRZKCB1eFRvcFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApIHV4VG9wUHJpb3JpdHkgPSAoIDMxVUwgLSAoIHVpbnQzMl90ICkgdWNQb3J0Q291bnRMZWFkaW5nWmVyb3MoICggdXhSZWFkeVByaW9yaXRpZXMgKSApICkKKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIGNvbmZpZ0FTU0VSVAorCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICk7CisJI2RlZmluZSBwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCkgCXZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSgpCisjZW5kaWYKKworLyogcG9ydE5PUCgpIGlzIG5vdCByZXF1aXJlZCBieSB0aGlzIHBvcnQuICovCisjZGVmaW5lIHBvcnROT1AoKQorCisjZGVmaW5lIHBvcnRJTkxJTkUJX19pbmxpbmUKKworI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCisJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FIGlubGluZSBfX2F0dHJpYnV0ZV9fKCggYWx3YXlzX2lubGluZSkpCisjZW5kaWYKKworLyogU2V0IHRoZSBwcml2aWxlZ2UgbGV2ZWwgdG8gdXNlciBtb2RlIGlmIHhSdW5uaW5nUHJpdmlsZWdlZCBpcyBmYWxzZS4gKi8KK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKQoreworCWlmKCB4UnVubmluZ1ByaXZpbGVnZWQgIT0gcGRUUlVFICkgCisJeworCQlfX2FzbSB2b2xhdGlsZSAoICIgbXJzIHIwLCBjb250cm9sIAlcbiIgXAorCQkJCQkJICIgb3JyIHIwLCAjMSAJCVxuIiBcCisJCQkJCQkgIiBtc3IgY29udHJvbCwgcjAJXG4iCVwKKwkJCQkJCSA6OjoicjAiICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIEJhc2VUeXBlX3QgeFBvcnRJc0luc2lkZUludGVycnVwdCggdm9pZCApCit7Cit1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CitCYXNlVHlwZV90IHhSZXR1cm47CisKKwkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJX19hc20gdm9sYXRpbGUoICJtcnMgJTAsIGlwc3IiIDogIj1yIiggdWxDdXJyZW50SW50ZXJydXB0ICkgKTsKKworCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPT0gMCApCisJeworCQl4UmV0dXJuID0gcGRGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IHBkVFJVRTsKKwl9CisKKwlyZXR1cm4geFJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3BvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxOZXdCQVNFUFJJOworCisJX19hc20gdm9sYXRpbGUKKwkoCisJCSIJbW92ICUwLCAlMQkJCQkJCQkJCQkJCVxuIglcCisJCSIJY3BzaWQgaQkJCQkJCQkJCQkJCQlcbiIgXAorCQkiCW1zciBiYXNlcHJpLCAlMAkJCQkJCQkJCQkJXG4iIFwKKwkJIglpc2IJCQkJCQkJCQkJCQkJCVxuIiBcCisJCSIJZHNiCQkJCQkJCQkJCQkJCQlcbiIgXAorCQkiCWNwc2llIGkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJOiI9ciIgKHVsTmV3QkFTRVBSSSkgOiAiaSIgKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKQorCSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitwb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyB1aW50MzJfdCB1bFBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxPcmlnaW5hbEJBU0VQUkksIHVsTmV3QkFTRVBSSTsKKworCV9fYXNtIHZvbGF0aWxlCisJKAorCQkiCW1ycyAlMCwgYmFzZXByaQkJCQkJCQkJCQkJXG4iIFwKKwkJIgltb3YgJTEsICUyCQkJCQkJCQkJCQkJXG4iCVwKKwkJIgljcHNpZCBpCQkJCQkJCQkJCQkJCVxuIiBcCisJCSIJbXNyIGJhc2VwcmksICUxCQkJCQkJCQkJCQlcbiIgXAorCQkiCWlzYgkJCQkJCQkJCQkJCQkJXG4iIFwKKwkJIglkc2IJCQkJCQkJCQkJCQkJCVxuIiBcCisJCSIJY3BzaWUgaQkJCQkJCQkJCQkJCQlcbiIgXAorCQk6Ij1yIiAodWxPcmlnaW5hbEJBU0VQUkkpLCAiPXIiICh1bE5ld0JBU0VQUkkpIDogImkiICggY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZICkKKwkpOworCisJLyogVGhpcyByZXR1cm4gd2lsbCBub3QgYmUgcmVhY2hlZCBidXQgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgY29tcGlsZXIKKwl3YXJuaW5ncy4gKi8KKwlyZXR1cm4gdWxPcmlnaW5hbEJBU0VQUkk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgdm9pZCB2UG9ydFNldEJBU0VQUkkoIHVpbnQzMl90IHVsTmV3TWFza1ZhbHVlICkKK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkJIgltc3IgYmFzZXByaSwgJTAJIiA6OiAiciIgKCB1bE5ld01hc2tWYWx1ZSApCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTAvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00wL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWExODAxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00wL3BvcnQuYwpAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmggZm9yIHRoZSBBUk0gQ00wIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJQVIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiaW50cmluc2ljcy5oIgorCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyNpZm5kZWYgY29uZmlnU1lTVElDS19DTE9DS19IWgorCSNkZWZpbmUgY29uZmlnU1lTVElDS19DTE9DS19IWiBjb25maWdDUFVfQ0xPQ0tfSFoKKyNlbmRpZgorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTlZJQy4gKi8KKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBOVklDLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkwgICAgICAgICAgICAgICAgICAoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQUQgICAgICAgICAgICAgICAgICAoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgICAgICAgICAoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyICAgICAgICAgICAgICAgICAgICAgICAoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMSwkJMHgwMDAwMDAwNAorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0lOVAkJMHgwMDAwMDAwMgorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRQkJMHgwMDAwMDAwMQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUcJCSggMVVMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWQkoIDI1NVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCSggcG9ydE1JTl9JTlRFUlJVUFRfUFJJT1JJVFkgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkoIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZIDw8IDI0VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJKCAweDAxMDAwMDAwICkKKworLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGVuc3VyZSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZIGlzCitkZWZpbmVkLiAgVGhlIHZhbHVlIDI1NSBzaG91bGQgYWxzbyBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK0ZyZWVSVE9TLm9yZyB2ZXJzaW9ucyBwcmlvciB0byBWNC4zLjAgZGlkIG5vdCBpbmNsdWRlIHRoaXMgZGVmaW5pdGlvbi4gKi8KKyNpZm5kZWYgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWQorCSNkZWZpbmUgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSAwCisjZW5kaWYKKworLyogVGhlIHN5c3RpY2sgaXMgYSAyNC1iaXQgY291bnRlci4gKi8KKyNkZWZpbmUgcG9ydE1BWF8yNF9CSVRfTlVNQkVSCQkJCSggMHhmZmZmZmZVTCApCisKKy8qIEEgZmlkZGxlIGZhY3RvciB0byBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIFN5c1RpY2sgY291bnRzIHRoYXQgd291bGQgaGF2ZQorb2NjdXJyZWQgd2hpbGUgdGhlIFN5c1RpY2sgY291bnRlciBpcyBzdG9wcGVkIGR1cmluZyB0aWNrbGVzcyBpZGxlCitjYWxjdWxhdGlvbnMuICovCisjZGVmaW5lIHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUgkJCSggNDVVTCApCisKKy8qIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCit2YXJpYWJsZS4gKi8KK3N0YXRpYyBVQmFzZVR5cGVfdCB1eENyaXRpY2FsTmVzdGluZyA9IDB4YWFhYWFhYWE7CisKKy8qCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApOworCisvKgorICogRXhjZXB0aW9uIGhhbmRsZXJzLgorICovCit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKTsKKworLyoKKyAqIFN0YXJ0IGZpcnN0IHRhc2sgaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgdGVzdGVkIGluIGlzb2xhdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRTdGFydEZpcnN0VGFzayggdm9pZCApOworCisvKgorICogVXNlZCB0byBjYXRjaCB0YXNrcyB0aGF0IGF0dGVtcHQgdG8gcmV0dXJuIGZyb20gdGhlaXIgaW1wbGVtZW50aW5nIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhlIG51bWJlciBvZiBTeXNUaWNrIGluY3JlbWVudHMgdGhhdCBtYWtlIHVwIG9uZSB0aWNrIHBlcmlvZC4KKyAqLworI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrIHBlcmlvZHMgdGhhdCBjYW4gYmUgc3VwcHJlc3NlZCBpcyBsaW1pdGVkIGJ5IHRoZQorICogMjQgYml0IHJlc29sdXRpb24gb2YgdGhlIFN5c1RpY2sgdGltZXIuCisgKi8KKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisJc3RhdGljIHVuc2lnbmVkIGxvbmcgeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIENvbXBlbnNhdGUgZm9yIHRoZSBDUFUgY3ljbGVzIHRoYXQgcGFzcyB3aGlsZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIChsb3cKKyAqIHBvd2VyIGZ1bmN0aW9uYWxpdHkgb25seS4KKyAqLworI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK1N0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkKK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJaW50ZXJydXB0LiAqLworCXB4VG9wT2ZTdGFjay0tOyAvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQgb2YgaW50ZXJydXB0cy4gKi8KKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJLyogeFBTUiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhDb2RlOwkvKiBQQyAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHJ2VGFza0V4aXRFcnJvcjsJLyogTFIgKi8KKwlweFRvcE9mU3RhY2sgLT0gNTsJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkvKiBSMCAqLworCXB4VG9wT2ZTdGFjayAtPSA4OyAvKiBSMTEuLlI0LiAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCWl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uICBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCXNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4KKworCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQoKSB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMKKwlkZWZpbmVkLCB0aGVuIHN0b3AgaGVyZSBzbyBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCWZvciggOzsgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJcG9ydE5WSUNfU1lTUFJJMiB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOworCXBvcnROVklDX1NZU1BSSTIgfD0gcG9ydE5WSUNfU1lTVElDS19QUkk7CisKKwkvKiBTdGFydCB0aGUgdGltZXIgdGhhdCBnZW5lcmF0ZXMgdGhlIHRpY2sgSVNSLiAgSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKwloZXJlIGFscmVhZHkuICovCisJcHJ2U2V0dXBUaW1lckludGVycnVwdCgpOworCisJLyogSW5pdGlhbGlzZSB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCByZWFkeSBmb3IgdGhlIGZpcnN0IHRhc2suICovCisJdXhDcml0aWNhbE5lc3RpbmcgPSAwOworCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJdlBvcnRTdGFydEZpcnN0VGFzaygpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSEgKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApCit7CisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkqKHBvcnROVklDX0lOVF9DVFJMKSA9IHBvcnROVklDX1BFTkRTVlNFVDsKKworCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQgYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CisJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLworCV9fRFNCKCk7CisJX19JU0IoKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApCit7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXV4Q3JpdGljYWxOZXN0aW5nKys7CisJX19EU0IoKTsKKwlfX0lTQigpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKQoreworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgKTsKKwl1eENyaXRpY2FsTmVzdGluZy0tOworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKQorewordWludDMyX3QgdWxQcmV2aW91c01hc2s7CisKKwl1bFByZXZpb3VzTWFzayA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCS8qIEluY3JlbWVudCB0aGUgUlRPUyB0aWNrLiAqLworCQlpZiggeFRhc2tJbmNyZW1lbnRUaWNrKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIFBlbmQgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkJCSoocG9ydE5WSUNfSU5UX0NUUkwpID0gcG9ydE5WSUNfUEVORFNWU0VUOworCQl9CisJfQorCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdWxQcmV2aW91c01hc2sgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCisJX193ZWFrIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKQorCXsKKwl1aW50MzJfdCB1bFJlbG9hZFZhbHVlLCB1bENvbXBsZXRlVGlja1BlcmlvZHMsIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMsIHVsU3lzVGlja0NUUkw7CisJVGlja1R5cGVfdCB4TW9kaWZpYWJsZUlkbGVUaW1lOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgU3lzVGljayByZWxvYWQgdmFsdWUgZG9lcyBub3Qgb3ZlcmZsb3cgdGhlIGNvdW50ZXIuICovCisJCWlmKCB4RXhwZWN0ZWRJZGxlVGltZSA+IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgKQorCQl7CisJCQl4RXhwZWN0ZWRJZGxlVGltZSA9IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3M7CisJCX0KKworCQkvKiBTdG9wIHRoZSBTeXNUaWNrIG1vbWVudGFyaWx5LiAgVGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IKKwkJaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiBiZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwKKwkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCisJCWtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgdGltZS4gKi8KKwkJcG9ydE5WSUNfU1lTVElDS19DVFJMICY9IH5wb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIHJlbG9hZCB2YWx1ZSByZXF1aXJlZCB0byB3YWl0IHhFeHBlY3RlZElkbGVUaW1lCisJCXRpY2sgcGVyaW9kcy4gIC0xIGlzIHVzZWQgYmVjYXVzZSB0aGlzIGNvZGUgd2lsbCBleGVjdXRlIHBhcnQgd2F5CisJCXRocm91Z2ggb25lIG9mIHRoZSB0aWNrIHBlcmlvZHMuICovCisJCXVsUmVsb2FkVmFsdWUgPSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgKyAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICogKCB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTCApICk7CisJCWlmKCB1bFJlbG9hZFZhbHVlID4gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKQorCQl7CisJCQl1bFJlbG9hZFZhbHVlIC09IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uOworCQl9CisKKwkJLyogRW50ZXIgYSBjcml0aWNhbCBzZWN0aW9uIGJ1dCBkb24ndCB1c2UgdGhlIHRhc2tFTlRFUl9DUklUSUNBTCgpCisJCW1ldGhvZCBhcyB0aGF0IHdpbGwgbWFzayBpbnRlcnJ1cHRzIHRoYXQgc2hvdWxkIGV4aXQgc2xlZXAgbW9kZS4gKi8KKwkJX19kaXNhYmxlX2ludGVycnVwdCgpOworCisJCS8qIElmIGEgY29udGV4dCBzd2l0Y2ggaXMgcGVuZGluZyBvciBhIHRhc2sgaXMgd2FpdGluZyBmb3IgdGhlIHNjaGVkdWxlcgorCQl0byBiZSB1bnN1c3BlbmRlZCB0aGVuIGFiYW5kb24gdGhlIGxvdyBwb3dlciBlbnRyeS4gKi8KKwkJaWYoIGVUYXNrQ29uZmlybVNsZWVwTW9kZVN0YXR1cygpID09IGVBYm9ydFNsZWVwICkKKwkJeworCQkJLyogUmVzdGFydCBmcm9tIHdoYXRldmVyIGlzIGxlZnQgaW4gdGhlIGNvdW50IHJlZ2lzdGVyIHRvIGNvbXBsZXRlCisJCQl0aGlzIHRpY2sgcGVyaW9kLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkwgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7CisKKwkJCS8qIFJlc2V0IHRoZSByZWxvYWQgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciBub3JtYWwgdGljaworCQkJcGVyaW9kcy4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAtIHNlZSBjb21tZW50cyBhYm92ZSBfX2Rpc2FibGVfaW50ZXJydXB0KCkKKwkJCWNhbGwgYWJvdmUuICovCisJCQlfX2VuYWJsZV9pbnRlcnJ1cHQoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFNldCB0aGUgbmV3IHJlbG9hZCB2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9IHVsUmVsb2FkVmFsdWU7CisKKwkJCS8qIENsZWFyIHRoZSBTeXNUaWNrIGNvdW50IGZsYWcgYW5kIHNldCB0aGUgY291bnQgdmFsdWUgYmFjayB0bworCQkJemVyby4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRSA9IDBVTDsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworCisJCQkvKiBTbGVlcCB1bnRpbCBzb21ldGhpbmcgaGFwcGVucy4gIGNvbmZpZ1BSRV9TTEVFUF9QUk9DRVNTSU5HKCkgY2FuCisJCQlzZXQgaXRzIHBhcmFtZXRlciB0byAwIHRvIGluZGljYXRlIHRoYXQgaXRzIGltcGxlbWVudGF0aW9uIGNvbnRhaW5zCisJCQlpdHMgb3duIHdhaXQgZm9yIGludGVycnVwdCBvciB3YWl0IGZvciBldmVudCBpbnN0cnVjdGlvbiwgYW5kIHNvIHdmaQorCQkJc2hvdWxkIG5vdCBiZSBleGVjdXRlZCBhZ2Fpbi4gIEhvd2V2ZXIsIHRoZSBvcmlnaW5hbCBleHBlY3RlZCBpZGxlCisJCQl0aW1lIHZhcmlhYmxlIG11c3QgcmVtYWluIHVubW9kaWZpZWQsIHNvIGEgY29weSBpcyB0YWtlbi4gKi8KKwkJCXhNb2RpZmlhYmxlSWRsZVRpbWUgPSB4RXhwZWN0ZWRJZGxlVGltZTsKKwkJCWNvbmZpZ1BSRV9TTEVFUF9QUk9DRVNTSU5HKCAmeE1vZGlmaWFibGVJZGxlVGltZSApOworCQkJaWYoIHhNb2RpZmlhYmxlSWRsZVRpbWUgPiAwICkKKwkJCXsKKwkJCQlfX0RTQigpOworCQkJCV9fV0ZJKCk7CisJCQkJX19JU0IoKTsKKwkJCX0KKwkJCWNvbmZpZ1BPU1RfU0xFRVBfUFJPQ0VTU0lORyggJnhFeHBlY3RlZElkbGVUaW1lICk7CisKKwkJCS8qIFN0b3AgU3lzVGljay4gIEFnYWluLCB0aGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvciBpcworCQkJYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiBiZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwKKwkJCWluZXZpdGFibHkgcmVzdWx0IGluIHNvbWUgdGlueSBkcmlmdCBvZiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZQorCQkJa2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhciB0aW1lLiAqLworCQkJdWxTeXNUaWNrQ1RSTCA9IHBvcnROVklDX1NZU1RJQ0tfQ1RSTDsKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTCA9ICggdWxTeXNUaWNrQ1RSTCAmIH5wb3J0TlZJQ19TWVNUSUNLX0VOQUJMRSApOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAtIHNlZSBjb21tZW50cyBhYm92ZSBfX2Rpc2FibGVfaW50ZXJydXB0KCkKKwkJCWNhbGwgYWJvdmUuICovCisJCQlfX2VuYWJsZV9pbnRlcnJ1cHQoKTsKKworCQkJaWYoICggdWxTeXNUaWNrQ1RSTCAmIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBRyApICE9IDAgKQorCQkJeworCQkJCXVpbnQzMl90IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBoYXMgYWxyZWFkeSBleGVjdXRlZCwgYW5kIHRoZSBTeXNUaWNrCisJCQkJY291bnQgcmVsb2FkZWQgd2l0aCB1bFJlbG9hZFZhbHVlLiAgUmVzZXQgdGhlCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyB3aXRoIHdoYXRldmVyIHJlbWFpbnMgb2YgdGhpcyB0aWNrCisJCQkJcGVyaW9kLiAqLworCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKSAtICggdWxSZWxvYWRWYWx1ZSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRSApOworCisJCQkJLyogRG9uJ3QgYWxsb3cgYSB0aW55IHZhbHVlLCBvciB2YWx1ZXMgdGhhdCBoYXZlIHNvbWVob3cKKwkJCQl1bmRlcmZsb3dlZCBiZWNhdXNlIHRoZSBwb3N0IHNsZWVwIGhvb2sgZGlkIHNvbWV0aGluZworCQkJCXRoYXQgdG9vayB0b28gbG9uZy4gKi8KKwkJCQlpZiggKCB1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPCB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApIHx8ICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlID4gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSApCisJCQkJeworCQkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICk7CisJCQkJfQorCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEID0gdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogVGhlIHRpY2sgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBhbHJlYWR5IGhhdmUgcGVuZGVkIHRoZSB0aWNrCisJCQkJcHJvY2Vzc2luZyBpbiB0aGUga2VybmVsLiAgQXMgdGhlIHBlbmRpbmcgdGljayB3aWxsIGJlCisJCQkJcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBleGl0cywgdGhlIHRpY2sgdmFsdWUKKwkJCQltYWludGFpbmVkIGJ5IHRoZSB0aWNrIGlzIHN0ZXBwZWQgZm9yd2FyZCBieSBvbmUgbGVzcyB0aGFuIHRoZQorCQkJCXRpbWUgc3BlbnQgd2FpdGluZy4gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBTb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgdGljayBpbnRlcnJ1cHQgZW5kZWQgdGhlIHNsZWVwLgorCQkJCVdvcmsgb3V0IGhvdyBsb25nIHRoZSBzbGVlcCBsYXN0ZWQgcm91bmRlZCB0byBjb21wbGV0ZSB0aWNrCisJCQkJcGVyaW9kcyAobm90IHRoZSB1bFJlbG9hZCB2YWx1ZSB3aGljaCBhY2NvdW50ZWQgZm9yIHBhcnQKKwkJCQl0aWNrcykuICovCisJCQkJdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cyA9ICggeEV4cGVjdGVkSWRsZVRpbWUgKiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApIC0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFOworCisJCQkJLyogSG93IG1hbnkgY29tcGxldGUgdGljayBwZXJpb2RzIHBhc3NlZCB3aGlsZSB0aGUgcHJvY2Vzc29yCisJCQkJd2FzIHdhaXRpbmc/ICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0gdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cyAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCisJCQkJLyogVGhlIHJlbG9hZCB2YWx1ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgZnJhY3Rpb24gb2YgYSBzaW5nbGUgdGljaworCQkJCXBlcmlvZCByZW1haW5zLiAqLworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9ICggKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKyAxICkgKiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApIC0gdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50czsKKwkJCX0KKworCQkJLyogUmVzdGFydCBTeXNUaWNrIHNvIGl0IHJ1bnMgZnJvbSBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHCisJCQlhZ2FpbiwgdGhlbiBzZXQgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyBiYWNrIHRvIGl0cyBzdGFuZGFyZAorCQkJdmFsdWUuICBUaGUgY3JpdGljYWwgc2VjdGlvbiBpcyB1c2VkIHRvIGVuc3VyZSB0aGUgdGljayBpbnRlcnJ1cHQKKwkJCWNhbiBvbmx5IGV4ZWN1dGUgb25jZSBpbiB0aGUgY2FzZSB0aGF0IHRoZSByZWxvYWQgcmVnaXN0ZXIgaXMgbmVhcgorCQkJemVyby4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRSA9IDBVTDsKKwkJCXBvcnRFTlRFUl9DUklUSUNBTCgpOworCQkJeworCQkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTCB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKwkJCQl2VGFza1N0ZXBUaWNrKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKTsKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQUQgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKKwkJCX0KKwkJCXBvcnRFWElUX0NSSVRJQ0FMKCk7CisJCX0KKwl9CisKKyNlbmRpZiAvKiAjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2V0dXAgdGhlIHN5c3RpY2sgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cyBhdCB0aGUgcmVxdWlyZWQKKyAqIGZyZXF1ZW5jeS4KKyAqLworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCit7CisJLyogQ2FsY3VsYXRlIHRoZSBjb25zdGFudHMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSB0aWNrIGludGVycnVwdC4gKi8KKwkjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCXsKKwkJdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKTsKKwkJeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IHBvcnRNQVhfMjRfQklUX05VTUJFUiAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCQl1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUiAvICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnU1lTVElDS19DTE9DS19IWiApOworCX0KKwkjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworCS8qIFN0b3AgYW5kIHJlc2V0IHRoZSBTeXNUaWNrLiAqLworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTCA9IDBVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgPSAwVUw7CisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9ICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJcG9ydE5WSUNfU1lTVElDS19DVFJMID0gcG9ydE5WSUNfU1lTVElDS19DTEsgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMC9wb3J0YXNtLnMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTAvcG9ydGFzbS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOThhODYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTAvcG9ydGFzbS5zCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2luY2x1ZGUgPEZyZWVSVE9TQ29uZmlnLmg+CisKKwlSU0VHICAgIENPREU6Q09ERSgyKQorCXRodW1iCisKKwlFWFRFUk4gdlBvcnRZaWVsZEZyb21JU1IKKwlFWFRFUk4gcHhDdXJyZW50VENCCisJRVhURVJOIHZUYXNrU3dpdGNoQ29udGV4dAorCisJUFVCTElDIHZTZXRNU1AKKwlQVUJMSUMgeFBvcnRQZW5kU1ZIYW5kbGVyCisJUFVCTElDIHZQb3J0U1ZDSGFuZGxlcgorCVBVQkxJQyB2UG9ydFN0YXJ0Rmlyc3RUYXNrCisJUFVCTElDIHVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IKKwlQVUJMSUMgdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZTZXRNU1AKKwltc3IgbXNwLCByMAorCWJ4IGxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit4UG9ydFBlbmRTVkhhbmRsZXI6CisJbXJzIHIwLCBwc3AKKworCWxkcglyMywgPXB4Q3VycmVudFRDQgkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIJcjIsIFtyM10KKworCXN1YnMgcjAsIHIwLCAjMzIJCS8qIE1ha2Ugc3BhY2UgZm9yIHRoZSByZW1haW5pbmcgbG93IHJlZ2lzdGVycy4gKi8KKwlzdHIgcjAsIFtyMl0JCQkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrLiAqLworCXN0bWlhIHIwISwge3I0LXI3fQkJLyogU3RvcmUgdGhlIGxvdyByZWdpc3RlcnMgdGhhdCBhcmUgbm90IHNhdmVkIGF1dG9tYXRpY2FsbHkuICovCisJbW92IHI0LCByOAkJCQkvKiBTdG9yZSB0aGUgaGlnaCByZWdpc3RlcnMuICovCisJbW92IHI1LCByOQorCW1vdiByNiwgcjEwCisJbW92IHI3LCByMTEKKwlzdG1pYSByMCEsIHtyNC1yN30KKworCXB1c2gge3IzLCByMTR9CisJY3BzaWQgaQorCWJsIHZUYXNrU3dpdGNoQ29udGV4dAorCWNwc2llIGkKKwlwb3Age3IyLCByM30JCQkvKiBsciBnb2VzIGluIHIzLiByMiBub3cgaG9sZHMgdGNiIHBvaW50ZXIuICovCisKKwlsZHIgcjEsIFtyMl0KKwlsZHIgcjAsIFtyMV0JCQkvKiBUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCWFkZHMgcjAsIHIwLCAjMTYJCS8qIE1vdmUgdG8gdGhlIGhpZ2ggcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIwISwge3I0LXI3fQkJLyogUG9wIHRoZSBoaWdoIHJlZ2lzdGVycy4gKi8KKwltb3YgcjgsIHI0CisJbW92IHI5LCByNQorCW1vdiByMTAsIHI2CisJbW92IHIxMSwgcjcKKworCW1zciBwc3AsIHIwCQkJCS8qIFJlbWVtYmVyIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGZvciB0aGUgdGFzay4gKi8KKworCXN1YnMgcjAsIHIwLCAjMzIJCS8qIEdvIGJhY2sgZm9yIHRoZSBsb3cgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHJlc3RvcmVkLiAqLworCWxkbWlhIHIwISwge3I0LXI3fQkJLyogUG9wIGxvdyByZWdpc3RlcnMuICAqLworCisJYnggcjMKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0U1ZDSGFuZGxlcjsKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vIGxvbmdlciB1c2VkLCBidXQgcmV0YWluZWQgZm9yIGJhY2t3YXJkCisJY29tcGF0aWJpbGl0eS4gKi8KKwlieCBscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlBvcnRTdGFydEZpcnN0VGFzaworCS8qIFRoZSBNU1Agc3RhY2sgaXMgbm90IHJlc2V0IGFzLCB1bmxpa2Ugb24gTTMvNCBwYXJ0cywgdGhlcmUgaXMgbm8gdmVjdG9yCisJdGFibGUgb2Zmc2V0IHJlZ2lzdGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9jYXRlIHRoZSBpbml0aWFsIHN0YWNrIHZhbHVlLgorCU5vdCBhbGwgTTAgcGFydHMgaGF2ZSB0aGUgYXBwbGljYXRpb24gdmVjdG9yIHRhYmxlIGF0IGFkZHJlc3MgMC4gKi8KKworCWxkcglyMywgPXB4Q3VycmVudFRDQgkvKiBPYnRhaW4gbG9jYXRpb24gb2YgcHhDdXJyZW50VENCLiAqLworCWxkciByMSwgW3IzXQorCWxkciByMCwgW3IxXQkJCS8qIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJYWRkcyByMCwgIzMyCQkJLyogRGlzY2FyZCBldmVyeXRoaW5nIHVwIHRvIHIwLiAqLworCW1zciBwc3AsIHIwCQkJCS8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwltb3ZzIHIwLCAjMgkJCQkvKiBTd2l0Y2ggdG8gdGhlIHBzcCBzdGFjay4gKi8KKwltc3IgQ09OVFJPTCwgcjAKKwlpc2IKKwlwb3Age3IwLXI1fQkJCQkvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBzYXZlZCBhdXRvbWF0aWNhbGx5LiAqLworCW1vdiBsciwgcjUJCQkJLyogbHIgaXMgbm93IGluIHI1LiAqLworCXBvcCB7cjN9CQkJCS8qIFRoZSByZXR1cm4gYWRkcmVzcyBpcyBub3cgaW4gcjMuICovCisJcG9wIHtyMn0JCQkJLyogUG9wIGFuZCBkaXNjYXJkIHRoZSBYUFNSLiAqLworCWNwc2llIGkJCQkJCS8qIFRoZSBmaXJzdCB0YXNrIGhhcyBpdHMgY29udGV4dCBhbmQgaW50ZXJydXB0cyBjYW4gYmUgZW5hYmxlZC4gKi8KKwlieCByMwkJCQkJLyogSnVtcCB0byB0aGUgdXNlciBkZWZpbmVkIHRhc2sgY29kZS4gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3VsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IKKwltcnMgcjAsIFBSSU1BU0sKKwljcHNpZCBpCisJYnggbHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSCisJbXNyIFBSSU1BU0ssIHIwCisJYnggbHIKKworCUVORApkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00wL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00wL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTJjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTAvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisKKyNpZm5kZWYgUE9SVE1BQ1JPX0gKKyNkZWZpbmUgUE9SVE1BQ1JPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb3J0IHNwZWNpZmljIGRlZmluaXRpb25zLgorICoKKyAqIFRoZSBzZXR0aW5ncyBpbiB0aGlzIGZpbGUgY29uZmlndXJlIEZyZWVSVE9TIGNvcnJlY3RseSBmb3IgdGhlCisgKiBnaXZlbiBoYXJkd2FyZSBhbmQgY29tcGlsZXIuCisgKgorICogVGhlc2Ugc2V0dGluZ3Mgc2hvdWxkIG5vdCBiZSBhbHRlcmVkLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIFR5cGUgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIHBvcnRDSEFSCQljaGFyCisjZGVmaW5lIHBvcnRGTE9BVAkJZmxvYXQKKyNkZWZpbmUgcG9ydERPVUJMRQkJZG91YmxlCisjZGVmaW5lIHBvcnRMT05HCQlsb25nCisjZGVmaW5lIHBvcnRTSE9SVAkJc2hvcnQKKyNkZWZpbmUgcG9ydFNUQUNLX1RZUEUJdWludDMyX3QKKyNkZWZpbmUgcG9ydEJBU0VfVFlQRQlsb25nCisKK3R5cGVkZWYgcG9ydFNUQUNLX1RZUEUgU3RhY2tUeXBlX3Q7Cit0eXBlZGVmIGxvbmcgQmFzZVR5cGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVQmFzZVR5cGVfdDsKKworCisjaWYoIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMSApCisJdHlwZWRlZiB1aW50MTZfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmYKKyNlbHNlCisJdHlwZWRlZiB1aW50MzJfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmZmZmZmVUwKKworCS8qIDMyLWJpdCB0aWNrIHR5cGUgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyByZWFkcyBvZiB0aGUgdGljayBjb3VudCBkbworCW5vdCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQyAxCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWNzLiAqLworI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCTgKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qIFNjaGVkdWxlciB1dGlsaXRpZXMuICovCitleHRlcm4gdm9pZCB2UG9ydFlpZWxkKCB2b2lkICk7CisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICopIDB4ZTAwMGVkMDQgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVQJCQkweDEwMDAwMDAwCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCQl2UG9ydFlpZWxkKCkKKyNkZWZpbmUgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4U3dpdGNoUmVxdWlyZWQgKSBpZiggeFN3aXRjaFJlcXVpcmVkICkgCSoocG9ydE5WSUNfSU5UX0NUUkwpID0gcG9ydE5WSUNfUEVORFNWU0VUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuICovCisKK2V4dGVybiB2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApOworZXh0ZXJuIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKTsKK2V4dGVybiB1aW50MzJfdCB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCB2b2lkICk7CitleHRlcm4gdm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdWludDMyX3QgdWxNYXNrICk7CisKKyNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCV9fYXNtIHZvbGF0aWxlKCAiY3BzaWQgaSIgKQorI2RlZmluZSBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQkJCQkJX19hc20gdm9sYXRpbGUoICJjcHNpZSBpIiApCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQkJCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCXVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHggKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGlja2xlc3MgaWRsZS9sb3cgcG93ZXIgZnVuY3Rpb25hbGl0eS4gKi8KKyNpZm5kZWYgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUAorCWV4dGVybiB2b2lkIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCBUaWNrVHlwZV90IHhFeHBlY3RlZElkbGVUaW1lICk7CisJI2RlZmluZSBwb3J0U1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQKCB4RXhwZWN0ZWRJZGxlVGltZSApIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCB4RXhwZWN0ZWRJZGxlVGltZSApCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVGFzayBmdW5jdGlvbiBtYWNyb3MgYXMgZGVzY3JpYmVkIG9uIHRoZSBGcmVlUlRPUy5vcmcgV0VCIHNpdGUuICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKworI2RlZmluZSBwb3J0Tk9QKCkKKworLyogU3VwcHJlc3Mgd2FybmluZ3MgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBJQVIgdG9vbHMsIGJ1dCBjYW5ub3QgYmUgZml4ZWQgaW4KK3RoZSBzb3VyY2UgY29kZSBiZWNhdXNlIHRvIGRvIHNvIHdvdWxkIGNhdXNlIG90aGVyIGNvbXBpbGVycyB0byBnZW5lcmF0ZQord2FybmluZ3MuICovCisjcHJhZ21hIGRpYWdfc3VwcHJlc3M9UGEwODIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMy9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjM2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMvcG9ydC5jCkBAIC0wLDAgKzEsNjE5IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gcG9ydGFibGUuaCBmb3IgdGhlIEFSTSBDTTMgcG9ydC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIElBUiBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlIDxpbnRyaW5zaWNzLmg+CisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworI2lmKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgPT0gMCApCisJI2Vycm9yIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBtdXN0IG5vdCBiZSBzZXQgdG8gMC4gIFNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdTWVNUSUNLX0NMT0NLX0haCisJI2RlZmluZSBjb25maWdTWVNUSUNLX0NMT0NLX0haIGNvbmZpZ0NQVV9DTE9DS19IWgorCS8qIEVuc3VyZSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGF0IHRoZSBzYW1lIGZyZXF1ZW5jeSBhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDFVTCA8PCAyVUwgKQorI2Vsc2UKKwkvKiBUaGUgd2F5IHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgaXMgbm90IG1vZGlmaWVkIGluIGNhc2UgaXQgaXMgbm90IHRoZSBzYW1lCisJYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQJKCAwICkKKyNlbmRpZgorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29yZS4gIFJlZ2lzdGVycyBmaXJzdC4uLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTQgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMl9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApICkKKy8qIC4uLnRoZW4gYml0cyBpbiB0aGUgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0lOVF9CSVQJCQkoIDFVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQJCQkoIDFVTCA8PCAwVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUdfQklUCQkoIDFVTCA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWQ0xFQVJfQklUIAkJCSggMVVMIDw8IDI3VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EX1NZU1RJQ0tfQ0xFQVJfQklUCQkoIDFVTCA8PCAyNVVMICkKKworI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZfUFJJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMjRVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgYW4gaW50ZXJydXB0IHByaW9yaXR5LiAqLworI2RlZmluZSBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSCQkoIDE2ICkKKyNkZWZpbmUgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiAJKCAweEUwMDBFM0YwICkKKyNkZWZpbmUgcG9ydEFJUkNSX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4RTAwMEVEMEMgKSApCisjZGVmaW5lIHBvcnRNQVhfOF9CSVRfVkFMVUUJCQkJCSggKCB1aW50OF90ICkgMHhmZiApCisjZGVmaW5lIHBvcnRUT1BfQklUX09GX0JZVEUJCQkJCSggKCB1aW50OF90ICkgMHg4MCApCisjZGVmaW5lIHBvcnRNQVhfUFJJR1JPVVBfQklUUwkJCQkoICggdWludDhfdCApIDcgKQorI2RlZmluZSBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSwkJCQkoIDB4MDdVTCA8PCA4VUwgKQorI2RlZmluZSBwb3J0UFJJR1JPVVBfU0hJRlQJCQkJCSggOFVMICkKKworLyogTWFza3Mgb2ZmIGFsbCBiaXRzIGJ1dCB0aGUgVkVDVEFDVElWRSBiaXRzIGluIHRoZSBJQ1NSIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0VkVDVEFDVElWRV9NQVNLCQkJCQkoIDB4RkZVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suICovCisjZGVmaW5lIHBvcnRJTklUSUFMX1hQU1IJCQkJCSggMHgwMTAwMDAwMCApCisKKy8qIFRoZSBzeXN0aWNrIGlzIGEgMjQtYml0IGNvdW50ZXIuICovCisjZGVmaW5lIHBvcnRNQVhfMjRfQklUX05VTUJFUgkJCQkoIDB4ZmZmZmZmVUwgKQorCisvKiBBIGZpZGRsZSBmYWN0b3IgdG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBTeXNUaWNrIGNvdW50cyB0aGF0IHdvdWxkIGhhdmUKK29jY3VycmVkIHdoaWxlIHRoZSBTeXNUaWNrIGNvdW50ZXIgaXMgc3RvcHBlZCBkdXJpbmcgdGlja2xlc3MgaWRsZQorY2FsY3VsYXRpb25zLiAqLworI2RlZmluZSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IJCQkoIDQ1VUwgKQorCisvKiBGb3Igc3RyaWN0IGNvbXBsaWFuY2Ugd2l0aCB0aGUgQ29ydGV4LU0gc3BlYyB0aGUgdGFzayBzdGFydCBhZGRyZXNzIHNob3VsZAoraGF2ZSBiaXQtMCBjbGVhciwgYXMgaXQgaXMgbG9hZGVkIGludG8gdGhlIFBDIG9uIGV4aXQgZnJvbSBhbiBJU1IuICovCisjZGVmaW5lIHBvcnRTVEFSVF9BRERSRVNTX01BU0sJCQkJKCAoIFN0YWNrVHlwZV90ICkgMHhmZmZmZmZmZVVMICkKKworLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGVuc3VyZSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZIGlzCitkZWZpbmVkLiAgVGhlIHZhbHVlIDI1NSBzaG91bGQgYWxzbyBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK0ZyZWVSVE9TLm9yZyB2ZXJzaW9ucyBwcmlvciB0byBWNC4zLjAgZGlkIG5vdCBpbmNsdWRlIHRoaXMgZGVmaW5pdGlvbi4gKi8KKyNpZm5kZWYgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWQorCSNkZWZpbmUgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSAyNTUKKyNlbmRpZgorCisvKgorICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuICBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcworICogZmlsZSBpcyB3ZWFrIHRvIGFsbG93IGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gY2hhbmdlIHRoZSB0aW1lciB1c2VkIHRvCisgKiBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CisKKy8qCisgKiBFeGNlcHRpb24gaGFuZGxlcnMuCisgKi8KK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApOworCisvKgorICogU3RhcnQgZmlyc3QgdGFzayBpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSB0ZXN0ZWQgaW4gaXNvbGF0aW9uLgorICovCitleHRlcm4gdm9pZCB2UG9ydFN0YXJ0Rmlyc3RUYXNrKCB2b2lkICk7CisKKy8qCisgKiBVc2VkIHRvIGNhdGNoIHRhc2tzIHRoYXQgYXR0ZW1wdCB0byByZXR1cm4gZnJvbSB0aGVpciBpbXBsZW1lbnRpbmcgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCit2YXJpYWJsZS4gKi8KK3N0YXRpYyBVQmFzZVR5cGVfdCB1eENyaXRpY2FsTmVzdGluZyA9IDB4YWFhYWFhYWE7CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIFN5c1RpY2sgaW5jcmVtZW50cyB0aGF0IG1ha2UgdXAgb25lIHRpY2sgcGVyaW9kLgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrIHBlcmlvZHMgdGhhdCBjYW4gYmUgc3VwcHJlc3NlZCBpcyBsaW1pdGVkIGJ5IHRoZQorICogMjQgYml0IHJlc29sdXRpb24gb2YgdGhlIFN5c1RpY2sgdGltZXIuCisgKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJc3RhdGljIHVpbnQzMl90IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBDb21wZW5zYXRlIGZvciB0aGUgQ1BVIGN5Y2xlcyB0aGF0IHBhc3Mgd2hpbGUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCAobG93CisgKiBwb3dlciBmdW5jdGlvbmFsaXR5IG9ubHkuCisgKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJc3RhdGljIHVpbnQzMl90IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogVXNlZCBieSB0aGUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIG1hY3JvIHRvIGVuc3VyZQorICogRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBhcmUgbm90IGNhbGxlZCBmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQKKyAqIGEgcHJpb3JpdHkgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorICovCisjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCSBzdGF0aWMgdWludDhfdCB1Y01heFN5c0NhbGxQcmlvcml0eSA9IDA7CisJIHN0YXRpYyB1aW50MzJfdCB1bE1heFBSSUdST1VQVmFsdWUgPSAwOworCSBzdGF0aWMgY29uc3Qgdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHBjSW50ZXJydXB0UHJpb3JpdHlSZWdpc3RlcnMgPSAoIGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCApIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTY7CisjZW5kaWYgLyogY29uZmlnQVNTRVJUX0RFRklORUQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZWUgaGVhZGVyIGZpbGUgZm9yIGRlc2NyaXB0aW9uLgorICovCitTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycyApCit7CisJLyogU2ltdWxhdGUgdGhlIHN0YWNrIGZyYW1lIGFzIGl0IHdvdWxkIGJlIGNyZWF0ZWQgYnkgYSBjb250ZXh0IHN3aXRjaAorCWludGVycnVwdC4gKi8KKwlweFRvcE9mU3RhY2stLTsgLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0IG9mIGludGVycnVwdHMuICovCisJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX1hQU1I7CS8qIHhQU1IgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCAoIFN0YWNrVHlwZV90ICkgcHhDb2RlICkgJiBwb3J0U1RBUlRfQUREUkVTU19NQVNLOwkvKiBQQyAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHJ2VGFza0V4aXRFcnJvcjsJLyogTFIgKi8KKwlweFRvcE9mU3RhY2sgLT0gNTsJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkvKiBSMCAqLworCXB4VG9wT2ZTdGFjayAtPSA4OwkvKiBSMTEsIFIxMCwgUjksIFI4LCBSNywgUjYsIFI1IGFuZCBSNC4gKi8KKworCXJldHVybiBweFRvcE9mU3RhY2s7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApCit7CisJLyogQSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYSB0YXNrIG11c3Qgbm90IGV4aXQgb3IgYXR0ZW1wdCB0byByZXR1cm4gdG8KKwlpdHMgY2FsbGVyIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLiAgSWYgYSB0YXNrIHdhbnRzIHRvIGV4aXQgaXQKKwlzaG91bGQgaW5zdGVhZCBjYWxsIHZUYXNrRGVsZXRlKCBOVUxMICkuCisKKwlBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0KCkgdG8gYmUgdHJpZ2dlcmVkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzCisJZGVmaW5lZCwgdGhlbiBzdG9wIGhlcmUgc28gYXBwbGljYXRpb24gd3JpdGVycyBjYW4gY2F0Y2ggdGhlIGVycm9yLiAqLworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgPT0gfjBVTCApOworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwlmb3IoIDs7ICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApCit7CisJLyogY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLgorCVNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCisJY29uZmlnQVNTRVJUKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKTsKKworCSNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJeworCQl2b2xhdGlsZSB1aW50MzJfdCB1bE9yaWdpbmFsUHJpb3JpdHk7CisJCXZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCBwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gKCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgKSAoIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgKyBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSICk7CisJCXZvbGF0aWxlIHVpbnQ4X3QgdWNNYXhQcmlvcml0eVZhbHVlOworCisJCS8qIERldGVybWluZSB0aGUgbWF4aW11bSBwcmlvcml0eSBmcm9tIHdoaWNoIElTUiBzYWZlIEZyZWVSVE9TIEFQSQorCQlmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZC4gIElTUiBzYWZlIGZ1bmN0aW9ucyBhcmUgdGhvc2UgdGhhdCBlbmQgaW4KKwkJIkZyb21JU1IiLiAgRnJlZVJUT1MgbWFpbnRhaW5zIHNlcGFyYXRlIHRocmVhZCBhbmQgSVNSIEFQSSBmdW5jdGlvbnMgdG8KKwkJZW5zdXJlIGludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBzaW1wbGUgYXMgcG9zc2libGUuCisKKwkJU2F2ZSB0aGUgaW50ZXJydXB0IHByaW9yaXR5IHZhbHVlIHRoYXQgaXMgYWJvdXQgdG8gYmUgY2xvYmJlcmVkLiAqLworCQl1bE9yaWdpbmFsUHJpb3JpdHkgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGF2YWlsYWJsZS4gIEZpcnN0IHdyaXRlIHRvIGFsbAorCQlwb3NzaWJsZSBiaXRzLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHBvcnRNQVhfOF9CSVRfVkFMVUU7CisKKwkJLyogUmVhZCB0aGUgdmFsdWUgYmFjayB0byBzZWUgaG93IG1hbnkgYml0cyBzdHVjay4gKi8KKwkJdWNNYXhQcmlvcml0eVZhbHVlID0gKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXI7CisKKwkJLyogVXNlIHRoZSBzYW1lIG1hc2sgb24gdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkuICovCisJCXVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZICYgdWNNYXhQcmlvcml0eVZhbHVlOworCisJCS8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBhY2NlcHRhYmxlIHByaW9yaXR5IGdyb3VwIHZhbHVlIGZvciB0aGUgbnVtYmVyCisJCW9mIGJpdHMgcmVhZCBiYWNrLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPSBwb3J0TUFYX1BSSUdST1VQX0JJVFM7CisJCXdoaWxlKCAoIHVjTWF4UHJpb3JpdHlWYWx1ZSAmIHBvcnRUT1BfQklUX09GX0JZVEUgKSA9PSBwb3J0VE9QX0JJVF9PRl9CWVRFICkKKwkJeworCQkJdWxNYXhQUklHUk9VUFZhbHVlLS07CisJCQl1Y01heFByaW9yaXR5VmFsdWUgPDw9ICggdWludDhfdCApIDB4MDE7CisJCX0KKworCQkjaWZkZWYgX19OVklDX1BSSU9fQklUUworCQl7CisJCQkvKiBDaGVjayB0aGUgQ01TSVMgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZgorCQkJcHJpb3JpdHkgYml0cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhY3R1YWxseSBxdWVyaWVkCisJCQlmcm9tIHRoZSBoYXJkd2FyZS4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TUFYX1BSSUdST1VQX0JJVFMgLSB1bE1heFBSSUdST1VQVmFsdWUgKSA9PSBfX05WSUNfUFJJT19CSVRTICk7CisJCX0KKwkJI2VuZGlmCisKKwkJI2lmZGVmIGNvbmZpZ1BSSU9fQklUUworCQl7CisJCQkvKiBDaGVjayB0aGUgRnJlZVJUT1MgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZgorCQkJcHJpb3JpdHkgYml0cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhY3R1YWxseSBxdWVyaWVkCisJCQlmcm9tIHRoZSBoYXJkd2FyZS4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TUFYX1BSSUdST1VQX0JJVFMgLSB1bE1heFBSSUdST1VQVmFsdWUgKSA9PSBjb25maWdQUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkvKiBTaGlmdCB0aGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgYmFjayB0byBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBBSVJDUgorCQlyZWdpc3Rlci4gKi8KKwkJdWxNYXhQUklHUk9VUFZhbHVlIDw8PSBwb3J0UFJJR1JPVVBfU0hJRlQ7CisJCXVsTWF4UFJJR1JPVVBWYWx1ZSAmPSBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSzsKKworCQkvKiBSZXN0b3JlIHRoZSBjbG9iYmVyZWQgaW50ZXJydXB0IHByaW9yaXR5IHJlZ2lzdGVyIHRvIGl0cyBvcmlnaW5hbAorCQl2YWx1ZS4gKi8KKwkJKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSB1bE9yaWdpbmFsUHJpb3JpdHk7CisJfQorCSNlbmRpZiAvKiBjb25pZmdBU1NFUlRfREVGSU5FRCAqLworCisJLyogTWFrZSBQZW5kU1YgYW5kIFN5c1RpY2sgdGhlIGxvd2VzdCBwcmlvcml0eSBpbnRlcnJ1cHRzLiAqLworCXBvcnROVklDX1NZU1BSSTJfUkVHIHw9IHBvcnROVklDX1BFTkRTVl9QUkk7CisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19QUkk7CisKKwkvKiBTdGFydCB0aGUgdGltZXIgdGhhdCBnZW5lcmF0ZXMgdGhlIHRpY2sgSVNSLiAgSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKwloZXJlIGFscmVhZHkuICovCisJdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCk7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IHJlYWR5IGZvciB0aGUgZmlyc3QgdGFzay4gKi8KKwl1eENyaXRpY2FsTmVzdGluZyA9IDA7CisKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwl2UG9ydFN0YXJ0Rmlyc3RUYXNrKCk7CisKKwkvKiBTaG91bGQgbm90IGdldCBoZXJlISAqLworCXJldHVybiAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbmRTY2hlZHVsZXIoIHZvaWQgKQoreworCS8qIE5vdCBpbXBsZW1lbnRlZCBpbiBwb3J0cyB3aGVyZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiB0by4KKwlBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0LiAqLworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgPT0gMTAwMFVMICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKQoreworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl1eENyaXRpY2FsTmVzdGluZysrOworCisJLyogVGhpcyBpcyBub3QgdGhlIGludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIGVudGVyIGNyaXRpY2FsIGZ1bmN0aW9uIHNvCisJYXNzZXJ0KCkgaWYgaXQgaXMgYmVpbmcgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQuICBPbmx5IEFQSQorCWZ1bmN0aW9ucyB0aGF0IGVuZCBpbiAiRnJvbUlTUiIgY2FuIGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0LiAgT25seSBhc3NlcnQgaWYKKwl0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCBpcyAxIHRvIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpdmUgY2FsbHMgaWYgdGhlCisJYXNzZXJ0IGZ1bmN0aW9uIGFsc28gdXNlcyBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEgKQorCXsKKwkJY29uZmlnQVNTRVJUKCAoIHBvcnROVklDX0lOVF9DVFJMX1JFRyAmIHBvcnRWRUNUQUNUSVZFX01BU0sgKSA9PSAwICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKQoreworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgKTsKKwl1eENyaXRpY2FsTmVzdGluZy0tOworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKQoreworCS8qIFRoZSBTeXNUaWNrIHJ1bnMgYXQgdGhlIGxvd2VzdCBpbnRlcnJ1cHQgcHJpb3JpdHksIHNvIHdoZW4gdGhpcyBpbnRlcnJ1cHQKKwlleGVjdXRlcyBhbGwgaW50ZXJydXB0cyBtdXN0IGJlIHVubWFza2VkLiAgVGhlcmUgaXMgdGhlcmVmb3JlIG5vIG5lZWQgdG8KKwlzYXZlIGFuZCB0aGVuIHJlc3RvcmUgdGhlIGludGVycnVwdCBtYXNrIHZhbHVlIGFzIGl0cyB2YWx1ZSBpcyBhbHJlYWR5CisJa25vd24uICovCisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXsKKwkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2suICovCisJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogQSBjb250ZXh0IHN3aXRjaCBpcyByZXF1aXJlZC4gIENvbnRleHQgc3dpdGNoaW5nIGlzIHBlcmZvcm1lZCBpbgorCQkJdGhlIFBlbmRTViBpbnRlcnJ1cHQuICBQZW5kIHRoZSBQZW5kU1YgaW50ZXJydXB0LiAqLworCQkJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsKKwkJfQorCX0KKwlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCisJX193ZWFrIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKQorCXsKKwl1aW50MzJfdCB1bFJlbG9hZFZhbHVlLCB1bENvbXBsZXRlVGlja1BlcmlvZHMsIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHM7CisJVGlja1R5cGVfdCB4TW9kaWZpYWJsZUlkbGVUaW1lOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgU3lzVGljayByZWxvYWQgdmFsdWUgZG9lcyBub3Qgb3ZlcmZsb3cgdGhlIGNvdW50ZXIuICovCisJCWlmKCB4RXhwZWN0ZWRJZGxlVGltZSA+IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgKQorCQl7CisJCQl4RXhwZWN0ZWRJZGxlVGltZSA9IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3M7CisJCX0KKworCQkvKiBTdG9wIHRoZSBTeXNUaWNrIG1vbWVudGFyaWx5LiAgVGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IKKwkJaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiBiZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwKKwkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCisJCWtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgdGltZS4gKi8KKwkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyAmPSB+cG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOworCisJCS8qIENhbGN1bGF0ZSB0aGUgcmVsb2FkIHZhbHVlIHJlcXVpcmVkIHRvIHdhaXQgeEV4cGVjdGVkSWRsZVRpbWUKKwkJdGljayBwZXJpb2RzLiAgLTEgaXMgdXNlZCBiZWNhdXNlIHRoaXMgY29kZSB3aWxsIGV4ZWN1dGUgcGFydCB3YXkKKwkJdGhyb3VnaCBvbmUgb2YgdGhlIHRpY2sgcGVyaW9kcy4gKi8KKwkJdWxSZWxvYWRWYWx1ZSA9IHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgKyAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICogKCB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTCApICk7CisJCWlmKCB1bFJlbG9hZFZhbHVlID4gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKQorCQl7CisJCQl1bFJlbG9hZFZhbHVlIC09IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uOworCQl9CisKKwkJLyogRW50ZXIgYSBjcml0aWNhbCBzZWN0aW9uIGJ1dCBkb24ndCB1c2UgdGhlIHRhc2tFTlRFUl9DUklUSUNBTCgpCisJCW1ldGhvZCBhcyB0aGF0IHdpbGwgbWFzayBpbnRlcnJ1cHRzIHRoYXQgc2hvdWxkIGV4aXQgc2xlZXAgbW9kZS4gKi8KKwkJX19kaXNhYmxlX2ludGVycnVwdCgpOworCQlfX0RTQigpOworCQlfX0lTQigpOworCisJCS8qIElmIGEgY29udGV4dCBzd2l0Y2ggaXMgcGVuZGluZyBvciBhIHRhc2sgaXMgd2FpdGluZyBmb3IgdGhlIHNjaGVkdWxlcgorCQl0byBiZSB1bnN1c3BlbmRlZCB0aGVuIGFiYW5kb24gdGhlIGxvdyBwb3dlciBlbnRyeS4gKi8KKwkJaWYoIGVUYXNrQ29uZmlybVNsZWVwTW9kZVN0YXR1cygpID09IGVBYm9ydFNsZWVwICkKKwkJeworCQkJLyogUmVzdGFydCBmcm9tIHdoYXRldmVyIGlzIGxlZnQgaW4gdGhlIGNvdW50IHJlZ2lzdGVyIHRvIGNvbXBsZXRlCisJCQl0aGlzIHRpY2sgcGVyaW9kLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUc7CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljay4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOworCisJCQkvKiBSZXNldCB0aGUgcmVsb2FkIHJlZ2lzdGVyIHRvIHRoZSB2YWx1ZSByZXF1aXJlZCBmb3Igbm9ybWFsIHRpY2sKKwkJCXBlcmlvZHMuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUw7CisKKwkJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIC0gc2VlIGNvbW1lbnRzIGFib3ZlIF9fZGlzYWJsZV9pbnRlcnJ1cHQoKQorCQkJY2FsbCBhYm92ZS4gKi8KKwkJCV9fZW5hYmxlX2ludGVycnVwdCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogU2V0IHRoZSBuZXcgcmVsb2FkIHZhbHVlLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsUmVsb2FkVmFsdWU7CisKKwkJCS8qIENsZWFyIHRoZSBTeXNUaWNrIGNvdW50IGZsYWcgYW5kIHNldCB0aGUgY291bnQgdmFsdWUgYmFjayB0bworCQkJemVyby4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljay4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOworCisJCQkvKiBTbGVlcCB1bnRpbCBzb21ldGhpbmcgaGFwcGVucy4gIGNvbmZpZ1BSRV9TTEVFUF9QUk9DRVNTSU5HKCkgY2FuCisJCQlzZXQgaXRzIHBhcmFtZXRlciB0byAwIHRvIGluZGljYXRlIHRoYXQgaXRzIGltcGxlbWVudGF0aW9uIGNvbnRhaW5zCisJCQlpdHMgb3duIHdhaXQgZm9yIGludGVycnVwdCBvciB3YWl0IGZvciBldmVudCBpbnN0cnVjdGlvbiwgYW5kIHNvIHdmaQorCQkJc2hvdWxkIG5vdCBiZSBleGVjdXRlZCBhZ2Fpbi4gIEhvd2V2ZXIsIHRoZSBvcmlnaW5hbCBleHBlY3RlZCBpZGxlCisJCQl0aW1lIHZhcmlhYmxlIG11c3QgcmVtYWluIHVubW9kaWZpZWQsIHNvIGEgY29weSBpcyB0YWtlbi4gKi8KKwkJCXhNb2RpZmlhYmxlSWRsZVRpbWUgPSB4RXhwZWN0ZWRJZGxlVGltZTsKKwkJCWNvbmZpZ1BSRV9TTEVFUF9QUk9DRVNTSU5HKCAmeE1vZGlmaWFibGVJZGxlVGltZSApOworCQkJaWYoIHhNb2RpZmlhYmxlSWRsZVRpbWUgPiAwICkKKwkJCXsKKwkJCQlfX0RTQigpOworCQkJCV9fV0ZJKCk7CisJCQkJX19JU0IoKTsKKwkJCX0KKwkJCWNvbmZpZ1BPU1RfU0xFRVBfUFJPQ0VTU0lORyggJnhFeHBlY3RlZElkbGVUaW1lICk7CisKKwkJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIHRvIGFsbG93IHRoZSBpbnRlcnJ1cHQgdGhhdCBicm91Z2h0IHRoZSBNQ1UKKwkJCW91dCBvZiBzbGVlcCBtb2RlIHRvIGV4ZWN1dGUgaW1tZWRpYXRlbHkuICBzZWUgY29tbWVudHMgYWJvdmUKKwkJCV9fZGlzYWJsZV9pbnRlcnJ1cHQoKSBjYWxsIGFib3ZlLiAqLworCQkJX19lbmFibGVfaW50ZXJydXB0KCk7CisJCQlfX0RTQigpOworCQkJX19JU0IoKTsKKworCQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluIGJlY2F1c2UgdGhlIGNsb2NrIGlzIGFib3V0IHRvIGJlIHN0b3BwZWQKKwkJCWFuZCBpbnRlcnJ1cHRzIHRoYXQgZXhlY3V0ZSB3aGlsZSB0aGUgY2xvY2sgaXMgc3RvcHBlZCB3aWxsIGluY3JlYXNlCisJCQlhbnkgc2xpcHBhZ2UgYmV0d2VlbiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZSBSVE9TIGFuZCBjYWxlbmRhcgorCQkJdGltZS4gKi8KKwkJCV9fZGlzYWJsZV9pbnRlcnJ1cHQoKTsKKwkJCV9fRFNCKCk7CisJCQlfX0lTQigpOworCQkJCisJCQkvKiBEaXNhYmxlIHRoZSBTeXNUaWNrIGNsb2NrIHdpdGhvdXQgcmVhZGluZyB0aGUgCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHJlZ2lzdGVyIHRvIGVuc3VyZSB0aGUKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQgaXMgbm90IGNsZWFyZWQgaWYgaXQgaXMgc2V0LiAgQWdhaW4sIAorCQkJdGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IgaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiAKKwkJCWJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbCBpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkgCisJCQlkcmlmdCBvZiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZSBrZXJuZWwgd2l0aCByZXNwZWN0IHRvIGNhbGVuZGFyIAorCQkJdGltZSovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gKCBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVF9CSVQgKTsKKworCQkJLyogRGV0ZXJtaW5lIGlmIHRoZSBTeXNUaWNrIGNsb2NrIGhhcyBhbHJlYWR5IGNvdW50ZWQgdG8gemVybyBhbmQKKwkJCWJlZW4gc2V0IGJhY2sgdG8gdGhlIGN1cnJlbnQgcmVsb2FkIHZhbHVlICh0aGUgcmVsb2FkIGJhY2sgYmVpbmcKKwkJCWNvcnJlY3QgZm9yIHRoZSBlbnRpcmUgZXhwZWN0ZWQgaWRsZSB0aW1lKSBvciBpZiB0aGUgU3lzVGljayBpcyB5ZXQKKwkJCXRvIGNvdW50IHRvIHplcm8gKGluIHdoaWNoIGNhc2UgYW4gaW50ZXJydXB0IG90aGVyIHRoYW4gdGhlIFN5c1RpY2sKKwkJCW11c3QgaGF2ZSBicm91Z2h0IHRoZSBzeXN0ZW0gb3V0IG9mIHNsZWVwIG1vZGUpLiAqLworCQkJaWYoICggcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyAmIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQgKSAhPSAwICkKKwkJCXsKKwkJCQl1aW50MzJfdCB1bENhbGN1bGF0ZWRMb2FkVmFsdWU7CisKKwkJCQkvKiBUaGUgdGljayBpbnRlcnJ1cHQgaXMgYWxyZWFkeSBwZW5kaW5nLCBhbmQgdGhlIFN5c1RpY2sgY291bnQKKwkJCQlyZWxvYWRlZCB3aXRoIHVsUmVsb2FkVmFsdWUuICBSZXNldCB0aGUKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHIHdpdGggd2hhdGV2ZXIgcmVtYWlucyBvZiB0aGlzIHRpY2sKKwkJCQlwZXJpb2QuICovCisJCQkJdWxDYWxjdWxhdGVkTG9hZFZhbHVlID0gKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTCApIC0gKCB1bFJlbG9hZFZhbHVlIC0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyApOworCisJCQkJLyogRG9uJ3QgYWxsb3cgYSB0aW55IHZhbHVlLCBvciB2YWx1ZXMgdGhhdCBoYXZlIHNvbWVob3cKKwkJCQl1bmRlcmZsb3dlZCBiZWNhdXNlIHRoZSBwb3N0IHNsZWVwIGhvb2sgZGlkIHNvbWV0aGluZworCQkJCXRoYXQgdG9vayB0b28gbG9uZy4gKi8KKwkJCQlpZiggKCB1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPCB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApIHx8ICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlID4gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSApCisJCQkJeworCQkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICk7CisJCQkJfQorCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIEFzIHRoZSBwZW5kaW5nIHRpY2sgd2lsbCBiZSBwcm9jZXNzZWQgYXMgc29vbiBhcyB0aGlzCisJCQkJZnVuY3Rpb24gZXhpdHMsIHRoZSB0aWNrIHZhbHVlIG1haW50YWluZWQgYnkgdGhlIHRpY2sgaXMgc3RlcHBlZAorCQkJCWZvcndhcmQgYnkgb25lIGxlc3MgdGhhbiB0aGUgdGltZSBzcGVudCB3YWl0aW5nLiAqLworCQkJCXVsQ29tcGxldGVUaWNrUGVyaW9kcyA9IHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIFNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSB0aWNrIGludGVycnVwdCBlbmRlZCB0aGUgc2xlZXAuCisJCQkJV29yayBvdXQgaG93IGxvbmcgdGhlIHNsZWVwIGxhc3RlZCByb3VuZGVkIHRvIGNvbXBsZXRlIHRpY2sKKwkJCQlwZXJpb2RzIChub3QgdGhlIHVsUmVsb2FkIHZhbHVlIHdoaWNoIGFjY291bnRlZCBmb3IgcGFydAorCQkJCXRpY2tzKS4gKi8KKwkJCQl1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzID0gKCB4RXhwZWN0ZWRJZGxlVGltZSAqIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHOworCisJCQkJLyogSG93IG1hbnkgY29tcGxldGUgdGljayBwZXJpb2RzIHBhc3NlZCB3aGlsZSB0aGUgcHJvY2Vzc29yCisJCQkJd2FzIHdhaXRpbmc/ICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0gdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cyAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCisJCQkJLyogVGhlIHJlbG9hZCB2YWx1ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgZnJhY3Rpb24gb2YgYSBzaW5nbGUgdGljaworCQkJCXBlcmlvZCByZW1haW5zLiAqLworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSAoICggdWxDb21wbGV0ZVRpY2tQZXJpb2RzICsgMVVMICkgKiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApIC0gdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50czsKKwkJCX0KKworCQkJLyogUmVzdGFydCBTeXNUaWNrIHNvIGl0IHJ1bnMgZnJvbSBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHCisJCQlhZ2FpbiwgdGhlbiBzZXQgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyBiYWNrIHRvIGl0cyBzdGFuZGFyZAorCQkJdmFsdWUuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisJCQl2VGFza1N0ZXBUaWNrKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKTsKKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKKworCQkJLyogRXhpdCB3aXRoIGludGVycnB0cyBlbmFibGVkLiAqLworCQkJX19lbmFibGVfaW50ZXJydXB0KCk7CisJCX0KKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZXR1cCB0aGUgc3lzdGljayB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzIGF0IHRoZSByZXF1aXJlZAorICogZnJlcXVlbmN5LgorICovCitfX3dlYWsgdm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKQoreworCS8qIENhbGN1bGF0ZSB0aGUgY29uc3RhbnRzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgdGljayBpbnRlcnJ1cHQuICovCisJI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwl7CisJCXVsVGltZXJDb3VudHNGb3JPbmVUaWNrID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICk7CisJCXhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKwkJdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKKwl9CisJI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKwkvKiBTdG9wIGFuZCBjbGVhciB0aGUgU3lzVGljay4gKi8KKwlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gMFVMOworCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKSAtIDFVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gKCBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVF9CSVQgfCBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKQorCXsKKwl1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CisJdWludDhfdCB1Y0N1cnJlbnRQcmlvcml0eTsKKworCQkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApIDo6ICJtZW1vcnkiICk7CisKKwkJLyogSXMgdGhlIGludGVycnVwdCBudW1iZXIgYSB1c2VyIGRlZmluZWQgaW50ZXJydXB0PyAqLworCQlpZiggdWxDdXJyZW50SW50ZXJydXB0ID49IHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKQorCQl7CisJCQkvKiBMb29rIHVwIHRoZSBpbnRlcnJ1cHQncyBwcmlvcml0eS4gKi8KKwkJCXVjQ3VycmVudFByaW9yaXR5ID0gcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVyc1sgdWxDdXJyZW50SW50ZXJydXB0IF07CisKKwkJCS8qIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZiBhIHNlcnZpY2Ugcm91dGluZSAoSVNSKSBmb3IKKwkJCWFuIGludGVycnVwdCB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYWJvdmUKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBjYWxscyBhbiBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJCWZ1bmN0aW9uLiAgSVNSIHNhZmUgRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBtdXN0ICpvbmx5KiBiZSBjYWxsZWQKKwkJCWZyb20gaW50ZXJydXB0cyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGF0IG9yIGJlbG93CisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCU51bWVyaWNhbGx5IGxvdyBpbnRlcnJ1cHQgcHJpb3JpdHkgbnVtYmVycyByZXByZXNlbnQgbG9naWNhbGx5IGhpZ2gKKwkJCWludGVycnVwdCBwcmlvcml0aWVzLCB0aGVyZWZvcmUgdGhlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQgbXVzdAorCQkJYmUgc2V0IHRvIGEgdmFsdWUgZXF1YWwgdG8gb3IgbnVtZXJpY2FsbHkgKmhpZ2hlciogdGhhbgorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlJbnRlcnJ1cHRzIHRoYXQJdXNlIHRoZSBGcmVlUlRPUyBBUEkgbXVzdCBub3QgYmUgbGVmdCBhdCB0aGVpcgorCQkJZGVmYXVsdCBwcmlvcml0eSBvZgl6ZXJvIGFzIHRoYXQgaXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgcHJpb3JpdHksCisJCQl3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSwKKwkJCWFuZAl0aGVyZWZvcmUgYWxzbyBndWFyYW50ZWVkIHRvIGJlIGludmFsaWQuCisKKwkJCUZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvIGVuc3VyZQorCQkJaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQkJVGhlIGZvbGxvd2luZyBsaW5rcyBwcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uOgorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbAorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvRkFRSGVscC5odG1sICovCisJCQljb25maWdBU1NFUlQoIHVjQ3VycmVudFByaW9yaXR5ID49IHVjTWF4U3lzQ2FsbFByaW9yaXR5ICk7CisJCX0KKworCQkvKiBQcmlvcml0eSBncm91cGluZzogIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykgYWxsb3dzIHRoZSBiaXRzCisJCXRoYXQgZGVmaW5lIGVhY2ggaW50ZXJydXB0J3MgcHJpb3JpdHkgdG8gYmUgc3BsaXQgYmV0d2VlbiBiaXRzIHRoYXQKKwkJZGVmaW5lIHRoZSBpbnRlcnJ1cHQncyBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzIGFuZCBiaXRzIHRoYXQgZGVmaW5lCisJCXRoZSBpbnRlcnJ1cHQncyBzdWItcHJpb3JpdHkuICBGb3Igc2ltcGxpY2l0eSBhbGwgYml0cyBtdXN0IGJlIGRlZmluZWQKKwkJdG8gYmUgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cy4gIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZgorCQl0aGlzIGlzIG5vdCB0aGUgY2FzZSAoaWYgc29tZSBiaXRzIHJlcHJlc2VudCBhIHN1Yi1wcmlvcml0eSkuCisKKwkJSWYgdGhlIGFwcGxpY2F0aW9uIG9ubHkgdXNlcyBDTVNJUyBsaWJyYXJpZXMgZm9yIGludGVycnVwdAorCQljb25maWd1cmF0aW9uIHRoZW4gdGhlIGNvcnJlY3Qgc2V0dGluZyBjYW4gYmUgYWNoaWV2ZWQgb24gYWxsIENvcnRleC1NCisJCWRldmljZXMgYnkgY2FsbGluZyBOVklDX1NldFByaW9yaXR5R3JvdXBpbmcoIDAgKTsgYmVmb3JlIHN0YXJ0aW5nIHRoZQorCQlzY2hlZHVsZXIuICBOb3RlIGhvd2V2ZXIgdGhhdCBzb21lIHZlbmRvciBzcGVjaWZpYyBwZXJpcGhlcmFsIGxpYnJhcmllcworCQlhc3N1bWUgYSBub24temVybyBwcmlvcml0eSBncm91cCBzZXR0aW5nLCBpbiB3aGljaCBjYXNlcyB1c2luZyBhIHZhbHVlCisJCW9mIHplcm8gd2lsbCByZXN1bHQgaW4gdW5wcmVkaWN0YWJsZSBiZWhhdmlvdXIuICovCisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0QUlSQ1JfUkVHICYgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sgKSA8PSB1bE1heFBSSUdST1VQVmFsdWUgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zL3BvcnRhc20ucyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMy9wb3J0YXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyZTEzZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMy9wb3J0YXNtLnMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaW5jbHVkZSA8RnJlZVJUT1NDb25maWcuaD4KKworCVJTRUcgICAgQ09ERTpDT0RFKDIpCisJdGh1bWIKKworCUVYVEVSTiBweEN1cnJlbnRUQ0IKKwlFWFRFUk4gdlRhc2tTd2l0Y2hDb250ZXh0CisKKwlQVUJMSUMgeFBvcnRQZW5kU1ZIYW5kbGVyCisJUFVCTElDIHZQb3J0U1ZDSGFuZGxlcgorCVBVQkxJQyB2UG9ydFN0YXJ0Rmlyc3RUYXNrCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworeFBvcnRQZW5kU1ZIYW5kbGVyOgorCW1ycyByMCwgcHNwCisJaXNiCisJbGRyCXIzLCA9cHhDdXJyZW50VENCCQkJLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJbGRyCXIyLCBbcjNdCisKKwlzdG1kYiByMCEsIHtyNC1yMTF9CQkJCS8qIFNhdmUgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMuICovCisJc3RyIHIwLCBbcjJdCQkJCQkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGludG8gdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgVENCLiAqLworCisJc3RtZGIgc3AhLCB7cjMsIHIxNH0KKwltb3YgcjAsICNjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkKKwltc3IgYmFzZXByaSwgcjAKKwlkc2IKKwlpc2IKKwlibCB2VGFza1N3aXRjaENvbnRleHQKKwltb3YgcjAsICMwCisJbXNyIGJhc2VwcmksIHIwCisJbGRtaWEgc3AhLCB7cjMsIHIxNH0KKworCWxkciByMSwgW3IzXQorCWxkciByMCwgW3IxXQkJCQkJLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwlsZG1pYSByMCEsIHtyNC1yMTF9CQkJCS8qIFBvcCB0aGUgcmVnaXN0ZXJzLiAqLworCW1zciBwc3AsIHIwCisJaXNiCisJYnggcjE0CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0U1ZDSGFuZGxlcjoKKwkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IKKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0KKwkvKiBQb3AgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIwISwge3I0LXIxMX0KKwltc3IgcHNwLCByMAorCWlzYgorCW1vdiByMCwgIzAKKwltc3IJYmFzZXByaSwgcjAKKwlvcnIgcjE0LCByMTQsICMxMworCWJ4IHIxNAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlBvcnRTdGFydEZpcnN0VGFzaworCS8qIFVzZSB0aGUgTlZJQyBvZmZzZXQgcmVnaXN0ZXIgdG8gbG9jYXRlIHRoZSBzdGFjay4gKi8KKwlsZHIgcjAsID0weEUwMDBFRDA4CisJbGRyIHIwLCBbcjBdCisJbGRyIHIwLCBbcjBdCisJLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCW1zciBtc3AsIHIwCisJLyogQ2FsbCBTVkMgdG8gc3RhcnQgdGhlIGZpcnN0IHRhc2ssIGVuc3VyaW5nIGludGVycnVwdHMgYXJlIGVuYWJsZWQuICovCisJY3BzaWUgaQorCWNwc2llIGYKKwlkc2IKKwlpc2IKKwlzdmMgMAorCisJRU5ECmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjNTljMgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMy9wb3J0bWFjcm8uaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKworI2lmbmRlZiBQT1JUTUFDUk9fSAorI2RlZmluZSBQT1JUTUFDUk9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnQgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgKgorICogVGhlIHNldHRpbmdzIGluIHRoaXMgZmlsZSBjb25maWd1cmUgRnJlZVJUT1MgY29ycmVjdGx5IGZvciB0aGUKKyAqIGdpdmVuIGhhcmR3YXJlIGFuZCBjb21waWxlci4KKyAqCisgKiBUaGVzZSBzZXR0aW5ncyBzaG91bGQgbm90IGJlIGFsdGVyZWQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogSUFSIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPGludHJpbnNpY3MuaD4KKworLyogVHlwZSBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydENIQVIJCWNoYXIKKyNkZWZpbmUgcG9ydEZMT0FUCQlmbG9hdAorI2RlZmluZSBwb3J0RE9VQkxFCQlkb3VibGUKKyNkZWZpbmUgcG9ydExPTkcJCWxvbmcKKyNkZWZpbmUgcG9ydFNIT1JUCQlzaG9ydAorI2RlZmluZSBwb3J0U1RBQ0tfVFlQRQl1aW50MzJfdAorI2RlZmluZSBwb3J0QkFTRV9UWVBFCWxvbmcKKwordHlwZWRlZiBwb3J0U1RBQ0tfVFlQRSBTdGFja1R5cGVfdDsKK3R5cGVkZWYgbG9uZyBCYXNlVHlwZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVCYXNlVHlwZV90OworCisjaWYoIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMSApCisJdHlwZWRlZiB1aW50MTZfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmYKKyNlbHNlCisJdHlwZWRlZiB1aW50MzJfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmZmZmZmVUwKKworCS8qIDMyLWJpdCB0aWNrIHR5cGUgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyByZWFkcyBvZiB0aGUgdGljayBjb3VudCBkbworCW5vdCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQyAxCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWNzLiAqLworI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCTgKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTY2hlZHVsZXIgdXRpbGl0aWVzLiAqLworI2RlZmluZSBwb3J0WUlFTEQoKQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCVwKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLwkJCVwKKwlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOwkJCVwKKwlfX0RTQigpOwkJCQkJCQkJCQkJCVwKKwlfX0lTQigpOwkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVF9CSVQJCSggMVVMIDw8IDI4VUwgKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApIGlmKCB4U3dpdGNoUmVxdWlyZWQgIT0gcGRGQUxTRSApIHBvcnRZSUVMRCgpCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgb3B0aW1pc2F0aW9ucy4gKi8KKyNpZm5kZWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OCisJI2RlZmluZSBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gMQorI2VuZGlmCisKKyNpZiggY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OID09IDEgKQorCisJLyogQ2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24uICovCisJI2lmKCBjb25maWdNQVhfUFJJT1JJVElFUyA+IDMyICkKKwkJI2Vycm9yIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiBjYW4gb25seSBiZSBzZXQgdG8gMSB3aGVuIGNvbmZpZ01BWF9QUklPUklUSUVTIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzMi4gIEl0IGlzIHZlcnkgcmFyZSB0aGF0IGEgc3lzdGVtIHJlcXVpcmVzIG1vcmUgdGhhbiAxMCB0byAxNSBkaWZmZXJlbmNlIHByaW9yaXRpZXMgYXMgdGFza3MgdGhhdCBzaGFyZSBhIHByaW9yaXR5IHdpbGwgdGltZSBzbGljZS4KKwkjZW5kaWYKKworCS8qIFN0b3JlL2NsZWFyIHRoZSByZWFkeSBwcmlvcml0aWVzIGluIGEgYml0IG1hcC4gKi8KKwkjZGVmaW5lIHBvcnRSRUNPUkRfUkVBRFlfUFJJT1JJVFkoIHV4UHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgKCB1eFJlYWR5UHJpb3JpdGllcyApIHw9ICggMVVMIDw8ICggdXhQcmlvcml0eSApICkKKwkjZGVmaW5lIHBvcnRSRVNFVF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgJj0gfiggMVVMIDw8ICggdXhQcmlvcml0eSApICkKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJI2RlZmluZSBwb3J0R0VUX0hJR0hFU1RfUFJJT1JJVFkoIHV4VG9wUHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgdXhUb3BQcmlvcml0eSA9ICggMzFVTCAtICggKCB1aW50MzJfdCApIF9fQ0xaKCAoIHV4UmVhZHlQcmlvcml0aWVzICkgKSApICkKKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENyaXRpY2FsIHNlY3Rpb24gbWFuYWdlbWVudC4gKi8KK2V4dGVybiB2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApOworZXh0ZXJuIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKTsKKworI2RlZmluZSBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCVwKKwlfX3NldF9CQVNFUFJJKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKTsJXAorCV9fRFNCKCk7CQkJCQkJCQkJCQkJXAorCV9fSVNCKCk7CQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQlfX3NldF9CQVNFUFJJKCAwICkKKyNkZWZpbmUgcG9ydEVOVEVSX0NSSVRJQ0FMKCkJCQkJCXZQb3J0RW50ZXJDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRFWElUX0NSSVRJQ0FMKCkJCQkJCQl2UG9ydEV4aXRDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQkJX19nZXRfQkFTRVBSSSgpOyBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkKKyNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKHgpCV9fc2V0X0JBU0VQUkkoIHggKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRpY2tsZXNzIGlkbGUvbG93IHBvd2VyIGZ1bmN0aW9uYWxpdHkuICovCisjaWZuZGVmIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAKKwlleHRlcm4gdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApOworCSNkZWZpbmUgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCggeEV4cGVjdGVkSWRsZVRpbWUgKSB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggeEV4cGVjdGVkSWRsZVRpbWUgKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4gIFRoZXNlIGFyZQorbm90IG5lY2Vzc2FyeSBmb3IgdG8gdXNlIHRoaXMgcG9ydC4gIFRoZXkgYXJlIGRlZmluZWQgc28gdGhlIGNvbW1vbiBkZW1vIGZpbGVzCisod2hpY2ggYnVpbGQgd2l0aCBhbGwgdGhlIHBvcnRzKSB3aWxsIGJ1aWxkLiAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIGNvbmZpZ0FTU0VSVAorCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICk7CisJI2RlZmluZSBwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCkgCXZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSgpCisjZW5kaWYKKworLyogcG9ydE5PUCgpIGlzIG5vdCByZXF1aXJlZCBieSB0aGlzIHBvcnQuICovCisjZGVmaW5lIHBvcnROT1AoKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3VwcHJlc3Mgd2FybmluZ3MgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBJQVIgdG9vbHMsIGJ1dCBjYW5ub3QgYmUgZml4ZWQgaW4KK3RoZSBzb3VyY2UgY29kZSBiZWNhdXNlIHRvIGRvIHNvIHdvdWxkIGNhdXNlIG90aGVyIGNvbXBpbGVycyB0byBnZW5lcmF0ZQord2FybmluZ3MuICovCisjcHJhZ21hIGRpYWdfc3VwcHJlc3M9UGUxOTEKKyNwcmFnbWEgZGlhZ19zdXBwcmVzcz1QYTA4MgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogUE9SVE1BQ1JPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000Ri9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRGL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzEwZDJmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000Ri9wb3J0LmMKQEAgLTAsMCArMSw2NTYgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiBwb3J0YWJsZS5oIGZvciB0aGUgQVJNIENNNEYgcG9ydC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIElBUiBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlIDxpbnRyaW5zaWNzLmg+CisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworI2lmbmRlZiBfX0FSTVZGUF9fCisJI2Vycm9yIFRoaXMgcG9ydCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIHByb2plY3Qgb3B0aW9ucyBhcmUgY29uZmlndXJlZCB0byBlbmFibGUgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydC4KKyNlbmRpZgorCisjaWYoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSA9PSAwICkKKwkjZXJyb3IgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLiAgU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFoKKwkjZGVmaW5lIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogY29uZmlnQ1BVX0NMT0NLX0haCisJLyogRW5zdXJlIHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgYXQgdGhlIHNhbWUgZnJlcXVlbmN5IGFzIHRoZSBjb3JlLiAqLworCSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEtfQklUCSggMVVMIDw8IDJVTCApCisjZWxzZQorCS8qIFRoZSB3YXkgdGhlIFN5c1RpY2sgaXMgY2xvY2tlZCBpcyBub3QgbW9kaWZpZWQgaW4gY2FzZSBpdCBpcyBub3QgdGhlIHNhbWUKKwlhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDAgKQorI2VuZGlmCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBjb3JlLiAgUmVnaXN0ZXJzIGZpcnN0Li4uICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRwkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkgKQorLyogLi4udGhlbiBiaXRzIGluIHRoZSByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVAkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVAkJCSggMVVMIDw8IDBVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQJCSggMVVMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZDTEVBUl9CSVQgCQkJKCAxVUwgPDwgMjdVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRfU1lTVElDS19DTEVBUl9CSVQJCSggMVVMIDw8IDI1VUwgKQorCisvKiBDb25zdGFudHMgdXNlZCB0byBkZXRlY3QgYSBDb3J0ZXgtTTcgcjBwMSBjb3JlLCB3aGljaCBzaG91bGQgdXNlIHRoZSBBUk1fQ003CityMHAxIHBvcnQuICovCisjZGVmaW5lIHBvcnRDUFVJRAkJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBlZDAwICkgKQorI2RlZmluZSBwb3J0Q09SVEVYX003X3IwcDFfSUQJCQkJKCAweDQxMEZDMjcxVUwgKQorI2RlZmluZSBwb3J0Q09SVEVYX003X3IwcDBfSUQJCQkJKCAweDQxMEZDMjcwVUwgKQorCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVl9QUkkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAyNFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBhbiBpbnRlcnJ1cHQgcHJpb3JpdHkuICovCisjZGVmaW5lIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIJCSggMTYgKQorI2RlZmluZSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2IAkoIDB4RTAwMEUzRjAgKQorI2RlZmluZSBwb3J0QUlSQ1JfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhFMDAwRUQwQyApICkKKyNkZWZpbmUgcG9ydE1BWF84X0JJVF9WQUxVRQkJCQkJKCAoIHVpbnQ4X3QgKSAweGZmICkKKyNkZWZpbmUgcG9ydFRPUF9CSVRfT0ZfQllURQkJCQkJKCAoIHVpbnQ4X3QgKSAweDgwICkKKyNkZWZpbmUgcG9ydE1BWF9QUklHUk9VUF9CSVRTCQkJCSggKCB1aW50OF90ICkgNyApCisjZGVmaW5lIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLCQkJCSggMHgwN1VMIDw8IDhVTCApCisjZGVmaW5lIHBvcnRQUklHUk9VUF9TSElGVAkJCQkJKCA4VUwgKQorCisvKiBNYXNrcyBvZmYgYWxsIGJpdHMgYnV0IHRoZSBWRUNUQUNUSVZFIGJpdHMgaW4gdGhlIElDU1IgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRWRUNUQUNUSVZFX01BU0sJCQkJCSggMHhGRlVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIFZGUC4gKi8KKyNkZWZpbmUgcG9ydEZQQ0NSCQkJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWYzNCApIC8qIEZsb2F0aW5nIHBvaW50IGNvbnRleHQgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydEFTUEVOX0FORF9MU1BFTl9CSVRTCQkJKCAweDNVTCA8PCAzMFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBzdGFjay4gKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJKCAweDAxMDAwMDAwICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCQkoIDB4ZmZmZmZmZmQgKQorCisvKiBUaGUgc3lzdGljayBpcyBhIDI0LWJpdCBjb3VudGVyLiAqLworI2RlZmluZSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIJCQkJKCAweGZmZmZmZlVMICkKKworLyogQSBmaWRkbGUgZmFjdG9yIHRvIGVzdGltYXRlIHRoZSBudW1iZXIgb2YgU3lzVGljayBjb3VudHMgdGhhdCB3b3VsZCBoYXZlCitvY2N1cnJlZCB3aGlsZSB0aGUgU3lzVGljayBjb3VudGVyIGlzIHN0b3BwZWQgZHVyaW5nIHRpY2tsZXNzIGlkbGUKK2NhbGN1bGF0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SCQkJKCA0NVVMICkKKworLyogRm9yIHN0cmljdCBjb21wbGlhbmNlIHdpdGggdGhlIENvcnRleC1NIHNwZWMgdGhlIHRhc2sgc3RhcnQgYWRkcmVzcyBzaG91bGQKK2hhdmUgYml0LTAgY2xlYXIsIGFzIGl0IGlzIGxvYWRlZCBpbnRvIHRoZSBQQyBvbiBleGl0IGZyb20gYW4gSVNSLiAqLworI2RlZmluZSBwb3J0U1RBUlRfQUREUkVTU19NQVNLCQkJCSggKCBTdGFja1R5cGVfdCApIDB4ZmZmZmZmZmVVTCApCisKKy8qCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzCisgKiBmaWxlIGlzIHdlYWsgdG8gYWxsb3cgYXBwbGljYXRpb24gd3JpdGVycyB0byBjaGFuZ2UgdGhlIHRpbWVyIHVzZWQgdG8KKyAqIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdC4KKyAqLwordm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKTsKKworLyoKKyAqIEV4Y2VwdGlvbiBoYW5kbGVycy4KKyAqLwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICk7CisKKy8qCisgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0U3RhcnRGaXJzdFRhc2soIHZvaWQgKTsKKworLyoKKyAqIFR1cm4gdGhlIFZGUCBvbi4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbmFibGVWRlAoIHZvaWQgKTsKKworLyoKKyAqIFVzZWQgdG8gY2F0Y2ggdGFza3MgdGhhdCBhdHRlbXB0IHRvIHJldHVybiBmcm9tIHRoZWlyIGltcGxlbWVudGluZyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKK3ZhcmlhYmxlLiAqLworc3RhdGljIFVCYXNlVHlwZV90IHV4Q3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYTsKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgU3lzVGljayBpbmNyZW1lbnRzIHRoYXQgbWFrZSB1cCBvbmUgdGljayBwZXJpb2QuCisgKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJc3RhdGljIHVpbnQzMl90IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpY2sgcGVyaW9kcyB0aGF0IGNhbiBiZSBzdXBwcmVzc2VkIGlzIGxpbWl0ZWQgYnkgdGhlCisgKiAyNCBiaXQgcmVzb2x1dGlvbiBvZiB0aGUgU3lzVGljayB0aW1lci4KKyAqLworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwlzdGF0aWMgdWludDMyX3QgeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIENvbXBlbnNhdGUgZm9yIHRoZSBDUFUgY3ljbGVzIHRoYXQgcGFzcyB3aGlsZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIChsb3cKKyAqIHBvd2VyIGZ1bmN0aW9uYWxpdHkgb25seS4KKyAqLworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwlzdGF0aWMgdWludDMyX3QgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBVc2VkIGJ5IHRoZSBwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCkgbWFjcm8gdG8gZW5zdXJlCisgKiBGcmVlUlRPUyBBUEkgZnVuY3Rpb25zIGFyZSBub3QgY2FsbGVkIGZyb20gaW50ZXJydXB0cyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZAorICogYSBwcmlvcml0eSBhYm92ZSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisgKi8KKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJIHN0YXRpYyB1aW50OF90IHVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gMDsKKwkgc3RhdGljIHVpbnQzMl90IHVsTWF4UFJJR1JPVVBWYWx1ZSA9IDA7CisJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggY29uc3Qgdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0ICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK1N0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkKK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJaW50ZXJydXB0LiAqLworCisJLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0CisJb2YgaW50ZXJydXB0cywgYW5kIHRvIGVuc3VyZSBhbGlnbm1lbnQuICovCisJcHhUb3BPZlN0YWNrLS07CisKKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJLyogeFBTUiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoICggU3RhY2tUeXBlX3QgKSBweENvZGUgKSAmIHBvcnRTVEFSVF9BRERSRVNTX01BU0s7CS8qIFBDICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwcnZUYXNrRXhpdEVycm9yOwkvKiBMUiAqLworCisJLyogU2F2ZSBjb2RlIHNwYWNlIGJ5IHNraXBwaW5nIHJlZ2lzdGVyIGluaXRpYWxpc2F0aW9uLiAqLworCXB4VG9wT2ZTdGFjayAtPSA1OwkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CS8qIFIwICovCisKKwkvKiBBIHNhdmUgbWV0aG9kIGlzIGJlaW5nIHVzZWQgdGhhdCByZXF1aXJlcyBlYWNoIHRhc2sgdG8gbWFpbnRhaW4gaXRzCisJb3duIGV4ZWMgcmV0dXJuIHZhbHVlLiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCisJcHhUb3BPZlN0YWNrIC09IDg7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCWl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uICBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCXNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4KKworCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQoKSB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMKKwlkZWZpbmVkLCB0aGVuIHN0b3AgaGVyZSBzbyBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCWZvciggOzsgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgbXVzdCBub3QgYmUgc2V0IHRvIDAuCisJU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwljb25maWdBU1NFUlQoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOworCisJLyogVGhpcyBwb3J0IGNhbiBiZSB1c2VkIG9uIGFsbCByZXZpc2lvbnMgb2YgdGhlIENvcnRleC1NNyBjb3JlIG90aGVyIHRoYW4KKwl0aGUgcjBwMSBwYXJ0cy4gIHIwcDEgcGFydHMgc2hvdWxkIHVzZSB0aGUgcG9ydCBmcm9tIHRoZQorCS9zb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTcvcjBwMSBkaXJlY3RvcnkuICovCisJY29uZmlnQVNTRVJUKCBwb3J0Q1BVSUQgIT0gcG9ydENPUlRFWF9NN19yMHAxX0lEICk7CisJY29uZmlnQVNTRVJUKCBwb3J0Q1BVSUQgIT0gcG9ydENPUlRFWF9NN19yMHAwX0lEICk7CisKKwkjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCXsKKwkJdm9sYXRpbGUgdWludDMyX3QgdWxPcmlnaW5hbFByaW9yaXR5OworCQl2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9ICggdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0ICkgKCBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2ICsgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApOworCQl2b2xhdGlsZSB1aW50OF90IHVjTWF4UHJpb3JpdHlWYWx1ZTsKKworCQkvKiBEZXRlcm1pbmUgdGhlIG1heGltdW0gcHJpb3JpdHkgZnJvbSB3aGljaCBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQuICBJU1Igc2FmZSBmdW5jdGlvbnMgYXJlIHRob3NlIHRoYXQgZW5kIGluCisJCSJGcm9tSVNSIi4gIEZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvCisJCWVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCVNhdmUgdGhlIGludGVycnVwdCBwcmlvcml0eSB2YWx1ZSB0aGF0IGlzIGFib3V0IHRvIGJlIGNsb2JiZXJlZC4gKi8KKwkJdWxPcmlnaW5hbFByaW9yaXR5ID0gKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXI7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhdmFpbGFibGUuICBGaXJzdCB3cml0ZSB0byBhbGwKKwkJcG9zc2libGUgYml0cy4gKi8KKwkJKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSBwb3J0TUFYXzhfQklUX1ZBTFVFOworCisJCS8qIFJlYWQgdGhlIHZhbHVlIGJhY2sgdG8gc2VlIGhvdyBtYW55IGJpdHMgc3R1Y2suICovCisJCXVjTWF4UHJpb3JpdHlWYWx1ZSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIFVzZSB0aGUgc2FtZSBtYXNrIG9uIHRoZSBtYXhpbXVtIHN5c3RlbSBjYWxsIHByaW9yaXR5LiAqLworCQl1Y01heFN5c0NhbGxQcmlvcml0eSA9IGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSAmIHVjTWF4UHJpb3JpdHlWYWx1ZTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBwcmlvcml0eSBncm91cCB2YWx1ZSBmb3IgdGhlIG51bWJlcgorCQlvZiBiaXRzIHJlYWQgYmFjay4gKi8KKwkJdWxNYXhQUklHUk9VUFZhbHVlID0gcG9ydE1BWF9QUklHUk9VUF9CSVRTOworCQl3aGlsZSggKCB1Y01heFByaW9yaXR5VmFsdWUgJiBwb3J0VE9QX0JJVF9PRl9CWVRFICkgPT0gcG9ydFRPUF9CSVRfT0ZfQllURSApCisJCXsKKwkJCXVsTWF4UFJJR1JPVVBWYWx1ZS0tOworCQkJdWNNYXhQcmlvcml0eVZhbHVlIDw8PSAoIHVpbnQ4X3QgKSAweDAxOworCQl9CisKKwkJI2lmZGVmIF9fTlZJQ19QUklPX0JJVFMKKwkJeworCQkJLyogQ2hlY2sgdGhlIENNU0lTIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSBudW1iZXIgb2YKKwkJCXByaW9yaXR5IGJpdHMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYWN0dWFsbHkgcXVlcmllZAorCQkJZnJvbSB0aGUgaGFyZHdhcmUuICovCisJCQljb25maWdBU1NFUlQoICggcG9ydE1BWF9QUklHUk9VUF9CSVRTIC0gdWxNYXhQUklHUk9VUFZhbHVlICkgPT0gX19OVklDX1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCSNpZmRlZiBjb25maWdQUklPX0JJVFMKKwkJeworCQkJLyogQ2hlY2sgdGhlIEZyZWVSVE9TIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSBudW1iZXIgb2YKKwkJCXByaW9yaXR5IGJpdHMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYWN0dWFsbHkgcXVlcmllZAorCQkJZnJvbSB0aGUgaGFyZHdhcmUuICovCisJCQljb25maWdBU1NFUlQoICggcG9ydE1BWF9QUklHUk9VUF9CSVRTIC0gdWxNYXhQUklHUk9VUFZhbHVlICkgPT0gY29uZmlnUFJJT19CSVRTICk7CisJCX0KKwkJI2VuZGlmCisKKwkJLyogU2hpZnQgdGhlIHByaW9yaXR5IGdyb3VwIHZhbHVlIGJhY2sgdG8gaXRzIHBvc2l0aW9uIHdpdGhpbiB0aGUgQUlSQ1IKKwkJcmVnaXN0ZXIuICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA8PD0gcG9ydFBSSUdST1VQX1NISUZUOworCQl1bE1heFBSSUdST1VQVmFsdWUgJj0gcG9ydFBSSU9SSVRZX0dST1VQX01BU0s7CisKKwkJLyogUmVzdG9yZSB0aGUgY2xvYmJlcmVkIGludGVycnVwdCBwcmlvcml0eSByZWdpc3RlciB0byBpdHMgb3JpZ2luYWwKKwkJdmFsdWUuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gdWxPcmlnaW5hbFByaW9yaXR5OworCX0KKwkjZW5kaWYgLyogY29uaWZnQVNTRVJUX0RFRklORUQgKi8KKworCS8qIE1ha2UgUGVuZFNWIGFuZCBTeXNUaWNrIHRoZSBsb3dlc3QgcHJpb3JpdHkgaW50ZXJydXB0cy4gKi8KKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOworCXBvcnROVklDX1NZU1BSSTJfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfUFJJOworCisJLyogU3RhcnQgdGhlIHRpbWVyIHRoYXQgZ2VuZXJhdGVzIHRoZSB0aWNrIElTUi4gIEludGVycnVwdHMgYXJlIGRpc2FibGVkCisJaGVyZSBhbHJlYWR5LiAqLworCXZQb3J0U2V0dXBUaW1lckludGVycnVwdCgpOworCisJLyogSW5pdGlhbGlzZSB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCByZWFkeSBmb3IgdGhlIGZpcnN0IHRhc2suICovCisJdXhDcml0aWNhbE5lc3RpbmcgPSAwOworCisJLyogRW5zdXJlIHRoZSBWRlAgaXMgZW5hYmxlZCAtIGl0IHNob3VsZCBiZSBhbnl3YXkuICovCisJdlBvcnRFbmFibGVWRlAoKTsKKworCS8qIExhenkgc2F2ZSBhbHdheXMuICovCisJKiggcG9ydEZQQ0NSICkgfD0gcG9ydEFTUEVOX0FORF9MU1BFTl9CSVRTOworCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJdlBvcnRTdGFydEZpcnN0VGFzaygpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSEgKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkKK3sKKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJdXhDcml0aWNhbE5lc3RpbmcrKzsKKworCS8qIFRoaXMgaXMgbm90IHRoZSBpbnRlcnJ1cHQgc2FmZSB2ZXJzaW9uIG9mIHRoZSBlbnRlciBjcml0aWNhbCBmdW5jdGlvbiBzbworCWFzc2VydCgpIGlmIGl0IGlzIGJlaW5nIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LiAgT25seSBBUEkKKwlmdW5jdGlvbnMgdGhhdCBlbmQgaW4gIkZyb21JU1IiIGNhbiBiZSB1c2VkIGluIGFuIGludGVycnVwdC4gIE9ubHkgYXNzZXJ0IGlmCisJdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgaXMgMSB0byBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaXZlIGNhbGxzIGlmIHRoZQorCWFzc2VydCBmdW5jdGlvbiBhbHNvIHVzZXMgYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxICkKKwl7CisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgJiBwb3J0VkVDVEFDVElWRV9NQVNLICkgPT0gMCApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkKK3sKKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nICk7CisJdXhDcml0aWNhbE5lc3RpbmctLTsKKwlpZiggdXhDcml0aWNhbE5lc3RpbmcgPT0gMCApCisJeworCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBUaGUgU3lzVGljayBydW5zIGF0IHRoZSBsb3dlc3QgaW50ZXJydXB0IHByaW9yaXR5LCBzbyB3aGVuIHRoaXMgaW50ZXJydXB0CisJZXhlY3V0ZXMgYWxsIGludGVycnVwdHMgbXVzdCBiZSB1bm1hc2tlZC4gIFRoZXJlIGlzIHRoZXJlZm9yZSBubyBuZWVkIHRvCisJc2F2ZSBhbmQgdGhlbiByZXN0b3JlIHRoZSBpbnRlcnJ1cHQgbWFzayB2YWx1ZSBhcyBpdHMgdmFsdWUgaXMgYWxyZWFkeQorCWtub3duLiAqLworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl7CisJCS8qIEluY3JlbWVudCB0aGUgUlRPUyB0aWNrLiAqLworCQlpZiggeFRhc2tJbmNyZW1lbnRUaWNrKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIEEgY29udGV4dCBzd2l0Y2ggaXMgcmVxdWlyZWQuICBDb250ZXh0IHN3aXRjaGluZyBpcyBwZXJmb3JtZWQgaW4KKwkJCXRoZSBQZW5kU1YgaW50ZXJydXB0LiAgUGVuZCB0aGUgUGVuZFNWIGludGVycnVwdC4gKi8KKwkJCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCX0KKwl9CisJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKworCV9fd2VhayB2b2lkIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCBUaWNrVHlwZV90IHhFeHBlY3RlZElkbGVUaW1lICkKKwl7CisJdWludDMyX3QgdWxSZWxvYWRWYWx1ZSwgdWxDb21wbGV0ZVRpY2tQZXJpb2RzLCB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzOworCVRpY2tUeXBlX3QgeE1vZGlmaWFibGVJZGxlVGltZTsKKworCQkvKiBNYWtlIHN1cmUgdGhlIFN5c1RpY2sgcmVsb2FkIHZhbHVlIGRvZXMgbm90IG92ZXJmbG93IHRoZSBjb3VudGVyLiAqLworCQlpZiggeEV4cGVjdGVkSWRsZVRpbWUgPiB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzICkKKwkJeworCQkJeEV4cGVjdGVkSWRsZVRpbWUgPSB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzOworCQl9CisKKwkJLyogU3RvcCB0aGUgU3lzVGljayBtb21lbnRhcmlseS4gIFRoZSB0aW1lIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgZm9yCisJCWlzIGFjY291bnRlZCBmb3IgYXMgYmVzdCBpdCBjYW4gYmUsIGJ1dCB1c2luZyB0aGUgdGlja2xlc3MgbW9kZSB3aWxsCisJCWluZXZpdGFibHkgcmVzdWx0IGluIHNvbWUgdGlueSBkcmlmdCBvZiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZQorCQlrZXJuZWwgd2l0aCByZXNwZWN0IHRvIGNhbGVuZGFyIHRpbWUuICovCisJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgJj0gfnBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKworCQkvKiBDYWxjdWxhdGUgdGhlIHJlbG9hZCB2YWx1ZSByZXF1aXJlZCB0byB3YWl0IHhFeHBlY3RlZElkbGVUaW1lCisJCXRpY2sgcGVyaW9kcy4gIC0xIGlzIHVzZWQgYmVjYXVzZSB0aGlzIGNvZGUgd2lsbCBleGVjdXRlIHBhcnQgd2F5CisJCXRocm91Z2ggb25lIG9mIHRoZSB0aWNrIHBlcmlvZHMuICovCisJCXVsUmVsb2FkVmFsdWUgPSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHICsgKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAqICggeEV4cGVjdGVkSWRsZVRpbWUgLSAxVUwgKSApOworCQlpZiggdWxSZWxvYWRWYWx1ZSA+IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uICkKKwkJeworCQkJdWxSZWxvYWRWYWx1ZSAtPSB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbjsKKwkJfQorCisJCS8qIEVudGVyIGEgY3JpdGljYWwgc2VjdGlvbiBidXQgZG9uJ3QgdXNlIHRoZSB0YXNrRU5URVJfQ1JJVElDQUwoKQorCQltZXRob2QgYXMgdGhhdCB3aWxsIG1hc2sgaW50ZXJydXB0cyB0aGF0IHNob3VsZCBleGl0IHNsZWVwIG1vZGUuICovCisJCV9fZGlzYWJsZV9pbnRlcnJ1cHQoKTsKKwkJX19EU0IoKTsKKwkJX19JU0IoKTsKKworCQkvKiBJZiBhIGNvbnRleHQgc3dpdGNoIGlzIHBlbmRpbmcgb3IgYSB0YXNrIGlzIHdhaXRpbmcgZm9yIHRoZSBzY2hlZHVsZXIKKwkJdG8gYmUgdW5zdXNwZW5kZWQgdGhlbiBhYmFuZG9uIHRoZSBsb3cgcG93ZXIgZW50cnkuICovCisJCWlmKCBlVGFza0NvbmZpcm1TbGVlcE1vZGVTdGF0dXMoKSA9PSBlQWJvcnRTbGVlcCApCisJCXsKKwkJCS8qIFJlc3RhcnQgZnJvbSB3aGF0ZXZlciBpcyBsZWZ0IGluIHRoZSBjb3VudCByZWdpc3RlciB0byBjb21wbGV0ZQorCQkJdGhpcyB0aWNrIHBlcmlvZC4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKworCQkJLyogUmVzZXQgdGhlIHJlbG9hZCByZWdpc3RlciB0byB0aGUgdmFsdWUgcmVxdWlyZWQgZm9yIG5vcm1hbCB0aWNrCisJCQlwZXJpb2RzLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAtIHNlZSBjb21tZW50cyBhYm92ZSBfX2Rpc2FibGVfaW50ZXJydXB0KCkKKwkJCWNhbGwgYWJvdmUuICovCisJCQlfX2VuYWJsZV9pbnRlcnJ1cHQoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFNldCB0aGUgbmV3IHJlbG9hZCB2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFJlbG9hZFZhbHVlOworCisJCQkvKiBDbGVhciB0aGUgU3lzVGljayBjb3VudCBmbGFnIGFuZCBzZXQgdGhlIGNvdW50IHZhbHVlIGJhY2sgdG8KKwkJCXplcm8uICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKworCQkJLyogU2xlZXAgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMuICBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORygpIGNhbgorCQkJc2V0IGl0cyBwYXJhbWV0ZXIgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IGl0cyBpbXBsZW1lbnRhdGlvbiBjb250YWlucworCQkJaXRzIG93biB3YWl0IGZvciBpbnRlcnJ1cHQgb3Igd2FpdCBmb3IgZXZlbnQgaW5zdHJ1Y3Rpb24sIGFuZCBzbyB3ZmkKKwkJCXNob3VsZCBub3QgYmUgZXhlY3V0ZWQgYWdhaW4uICBIb3dldmVyLCB0aGUgb3JpZ2luYWwgZXhwZWN0ZWQgaWRsZQorCQkJdGltZSB2YXJpYWJsZSBtdXN0IHJlbWFpbiB1bm1vZGlmaWVkLCBzbyBhIGNvcHkgaXMgdGFrZW4uICovCisJCQl4TW9kaWZpYWJsZUlkbGVUaW1lID0geEV4cGVjdGVkSWRsZVRpbWU7CisJCQljb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyggJnhNb2RpZmlhYmxlSWRsZVRpbWUgKTsKKwkJCWlmKCB4TW9kaWZpYWJsZUlkbGVUaW1lID4gMCApCisJCQl7CisJCQkJX19EU0IoKTsKKwkJCQlfX1dGSSgpOworCQkJCV9fSVNCKCk7CisJCQl9CisJCQljb25maWdQT1NUX1NMRUVQX1BST0NFU1NJTkcoICZ4RXhwZWN0ZWRJZGxlVGltZSApOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyB0byBhbGxvdyB0aGUgaW50ZXJydXB0IHRoYXQgYnJvdWdodCB0aGUgTUNVCisJCQlvdXQgb2Ygc2xlZXAgbW9kZSB0byBleGVjdXRlIGltbWVkaWF0ZWx5LiAgc2VlIGNvbW1lbnRzIGFib3ZlCisJCQlfX2Rpc2FibGVfaW50ZXJydXB0KCkgY2FsbCBhYm92ZS4gKi8KKwkJCV9fZW5hYmxlX2ludGVycnVwdCgpOworCQkJX19EU0IoKTsKKwkJCV9fSVNCKCk7CisKKwkJCS8qIERpc2FibGUgaW50ZXJydXB0cyBhZ2FpbiBiZWNhdXNlIHRoZSBjbG9jayBpcyBhYm91dCB0byBiZSBzdG9wcGVkCisJCQlhbmQgaW50ZXJydXB0cyB0aGF0IGV4ZWN1dGUgd2hpbGUgdGhlIGNsb2NrIGlzIHN0b3BwZWQgd2lsbCBpbmNyZWFzZQorCQkJYW55IHNsaXBwYWdlIGJldHdlZW4gdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUgUlRPUyBhbmQgY2FsZW5kYXIKKwkJCXRpbWUuICovCisJCQlfX2Rpc2FibGVfaW50ZXJydXB0KCk7CisJCQlfX0RTQigpOworCQkJX19JU0IoKTsKKwkJCQorCQkJLyogRGlzYWJsZSB0aGUgU3lzVGljayBjbG9jayB3aXRob3V0IHJlYWRpbmcgdGhlIAorCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyByZWdpc3RlciB0byBlbnN1cmUgdGhlCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUdfQklUIGlzIG5vdCBjbGVhcmVkIGlmIGl0IGlzIHNldC4gIEFnYWluLCAKKwkJCXRoZSB0aW1lIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgZm9yIGlzIGFjY291bnRlZCBmb3IgYXMgYmVzdCBpdCBjYW4gCisJCQliZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwgaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IAorCQkJZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUga2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhciAKKwkJCXRpbWUqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9ICggcG9ydE5WSUNfU1lTVElDS19DTEtfQklUIHwgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUICk7CisKKwkJCS8qIERldGVybWluZSBpZiB0aGUgU3lzVGljayBjbG9jayBoYXMgYWxyZWFkeSBjb3VudGVkIHRvIHplcm8gYW5kCisJCQliZWVuIHNldCBiYWNrIHRvIHRoZSBjdXJyZW50IHJlbG9hZCB2YWx1ZSAodGhlIHJlbG9hZCBiYWNrIGJlaW5nCisJCQljb3JyZWN0IGZvciB0aGUgZW50aXJlIGV4cGVjdGVkIGlkbGUgdGltZSkgb3IgaWYgdGhlIFN5c1RpY2sgaXMgeWV0CisJCQl0byBjb3VudCB0byB6ZXJvIChpbiB3aGljaCBjYXNlIGFuIGludGVycnVwdCBvdGhlciB0aGFuIHRoZSBTeXNUaWNrCisJCQltdXN0IGhhdmUgYnJvdWdodCB0aGUgc3lzdGVtIG91dCBvZiBzbGVlcCBtb2RlKS4gKi8KKwkJCWlmKCAoIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgJiBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUdfQklUICkgIT0gMCApCisJCQl7CisJCQkJdWludDMyX3QgdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogVGhlIHRpY2sgaW50ZXJydXB0IGlzIGFscmVhZHkgcGVuZGluZywgYW5kIHRoZSBTeXNUaWNrIGNvdW50CisJCQkJcmVsb2FkZWQgd2l0aCB1bFJlbG9hZFZhbHVlLiAgUmVzZXQgdGhlCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyB3aXRoIHdoYXRldmVyIHJlbWFpbnMgb2YgdGhpcyB0aWNrCisJCQkJcGVyaW9kLiAqLworCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKSAtICggdWxSZWxvYWRWYWx1ZSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgKTsKKworCQkJCS8qIERvbid0IGFsbG93IGEgdGlueSB2YWx1ZSwgb3IgdmFsdWVzIHRoYXQgaGF2ZSBzb21laG93CisJCQkJdW5kZXJmbG93ZWQgYmVjYXVzZSB0aGUgcG9zdCBzbGVlcCBob29rIGRpZCBzb21ldGhpbmcKKwkJCQl0aGF0IHRvb2sgdG9vIGxvbmcuICovCisJCQkJaWYoICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlIDwgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKSB8fCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA+IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgKQorCQkJCXsKKwkJCQkJdWxDYWxjdWxhdGVkTG9hZFZhbHVlID0gKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTCApOworCQkJCX0KKworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bENhbGN1bGF0ZWRMb2FkVmFsdWU7CisKKwkJCQkvKiBBcyB0aGUgcGVuZGluZyB0aWNrIHdpbGwgYmUgcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhpcworCQkJCWZ1bmN0aW9uIGV4aXRzLCB0aGUgdGljayB2YWx1ZSBtYWludGFpbmVkIGJ5IHRoZSB0aWNrIGlzIHN0ZXBwZWQKKwkJCQlmb3J3YXJkIGJ5IG9uZSBsZXNzIHRoYW4gdGhlIHRpbWUgc3BlbnQgd2FpdGluZy4gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBTb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgdGljayBpbnRlcnJ1cHQgZW5kZWQgdGhlIHNsZWVwLgorCQkJCVdvcmsgb3V0IGhvdyBsb25nIHRoZSBzbGVlcCBsYXN0ZWQgcm91bmRlZCB0byBjb21wbGV0ZSB0aWNrCisJCQkJcGVyaW9kcyAobm90IHRoZSB1bFJlbG9hZCB2YWx1ZSB3aGljaCBhY2NvdW50ZWQgZm9yIHBhcnQKKwkJCQl0aWNrcykuICovCisJCQkJdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cyA9ICggeEV4cGVjdGVkSWRsZVRpbWUgKiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApIC0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJCS8qIEhvdyBtYW55IGNvbXBsZXRlIHRpY2sgcGVyaW9kcyBwYXNzZWQgd2hpbGUgdGhlIHByb2Nlc3NvcgorCQkJCXdhcyB3YWl0aW5nPyAqLworCQkJCXVsQ29tcGxldGVUaWNrUGVyaW9kcyA9IHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKworCQkJCS8qIFRoZSByZWxvYWQgdmFsdWUgaXMgc2V0IHRvIHdoYXRldmVyIGZyYWN0aW9uIG9mIGEgc2luZ2xlIHRpY2sKKwkJCQlwZXJpb2QgcmVtYWlucy4gKi8KKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCAoIHVsQ29tcGxldGVUaWNrUGVyaW9kcyArIDFVTCApICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHM7CisJCQl9CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljayBzbyBpdCBydW5zIGZyb20gcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRworCQkJYWdhaW4sIHRoZW4gc2V0IHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgYmFjayB0byBpdHMgc3RhbmRhcmQKKwkJCXZhbHVlLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOworCQkJdlRhc2tTdGVwVGljayggdWxDb21wbGV0ZVRpY2tQZXJpb2RzICk7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUw7CisKKwkJCS8qIEV4aXQgd2l0aCBpbnRlcnJwdHMgZW5hYmxlZC4gKi8KKwkJCV9fZW5hYmxlX2ludGVycnVwdCgpOworCQl9CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2V0dXAgdGhlIHN5c3RpY2sgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cyBhdCB0aGUgcmVxdWlyZWQKKyAqIGZyZXF1ZW5jeS4KKyAqLworX193ZWFrIHZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkKK3sKKwkvKiBDYWxjdWxhdGUgdGhlIGNvbnN0YW50cyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlIHRpY2sgaW50ZXJydXB0LiAqLworCSNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJeworCQl1bFRpbWVyQ291bnRzRm9yT25lVGljayA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApOworCQl4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzID0gcG9ydE1BWF8yNF9CSVRfTlVNQkVSIC8gdWxUaW1lckNvdW50c0Zvck9uZVRpY2s7CisJCXVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SIC8gKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdTWVNUSUNLX0NMT0NLX0haICk7CisJfQorCSNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisJLyogU3RvcCBhbmQgY2xlYXIgdGhlIFN5c1RpY2suICovCisJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9IDBVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCisJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9ICggcG9ydE5WSUNfU1lTVElDS19DTEtfQklUIHwgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKworCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICkKKwl7CisJdWludDMyX3QgdWxDdXJyZW50SW50ZXJydXB0OworCXVpbnQ4X3QgdWNDdXJyZW50UHJpb3JpdHk7CisKKwkJLyogT2J0YWluIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW50ZXJydXB0LiAqLworCQlfX2FzbSB2b2xhdGlsZSggIm1ycyAlMCwgaXBzciIgOiAiPXIiKCB1bEN1cnJlbnRJbnRlcnJ1cHQgKSA6OiAibWVtb3J5IiApOworCisJCS8qIElzIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGEgdXNlciBkZWZpbmVkIGludGVycnVwdD8gKi8KKwkJaWYoIHVsQ3VycmVudEludGVycnVwdCA+PSBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSICkKKwkJeworCQkJLyogTG9vayB1cCB0aGUgaW50ZXJydXB0J3MgcHJpb3JpdHkuICovCisJCQl1Y0N1cnJlbnRQcmlvcml0eSA9IHBjSW50ZXJydXB0UHJpb3JpdHlSZWdpc3RlcnNbIHVsQ3VycmVudEludGVycnVwdCBdOworCisJCQkvKiBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYgYSBzZXJ2aWNlIHJvdXRpbmUgKElTUikgZm9yCisJCQlhbiBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgY2FsbHMgYW4gSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCQlmdW5jdGlvbi4gIElTUiBzYWZlIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgbXVzdCAqb25seSogYmUgY2FsbGVkCisJCQlmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhdCBvciBiZWxvdworCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlOdW1lcmljYWxseSBsb3cgaW50ZXJydXB0IHByaW9yaXR5IG51bWJlcnMgcmVwcmVzZW50IGxvZ2ljYWxseSBoaWdoCisJCQlpbnRlcnJ1cHQgcHJpb3JpdGllcywgdGhlcmVmb3JlIHRoZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0IG11c3QKKwkJCWJlIHNldCB0byBhIHZhbHVlIGVxdWFsIHRvIG9yIG51bWVyaWNhbGx5ICpoaWdoZXIqIHRoYW4KKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJSW50ZXJydXB0cyB0aGF0CXVzZSB0aGUgRnJlZVJUT1MgQVBJIG11c3Qgbm90IGJlIGxlZnQgYXQgdGhlaXIKKwkJCWRlZmF1bHQgcHJpb3JpdHkgb2YJemVybyBhcyB0aGF0IGlzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHByaW9yaXR5LAorCQkJd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBhYm92ZSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFksCisJCQlhbmQJdGhlcmVmb3JlIGFsc28gZ3VhcmFudGVlZCB0byBiZSBpbnZhbGlkLgorCisJCQlGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0byBlbnN1cmUKKwkJCWludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBzaW1wbGUgYXMgcG9zc2libGUuCisKKwkJCVRoZSBmb2xsb3dpbmcgbGlua3MgcHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbjoKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL0ZBUUhlbHAuaHRtbCAqLworCQkJY29uZmlnQVNTRVJUKCB1Y0N1cnJlbnRQcmlvcml0eSA+PSB1Y01heFN5c0NhbGxQcmlvcml0eSApOworCQl9CisKKwkJLyogUHJpb3JpdHkgZ3JvdXBpbmc6ICBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKE5WSUMpIGFsbG93cyB0aGUgYml0cworCQl0aGF0IGRlZmluZSBlYWNoIGludGVycnVwdCdzIHByaW9yaXR5IHRvIGJlIHNwbGl0IGJldHdlZW4gYml0cyB0aGF0CisJCWRlZmluZSB0aGUgaW50ZXJydXB0J3MgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cyBhbmQgYml0cyB0aGF0IGRlZmluZQorCQl0aGUgaW50ZXJydXB0J3Mgc3ViLXByaW9yaXR5LiAgRm9yIHNpbXBsaWNpdHkgYWxsIGJpdHMgbXVzdCBiZSBkZWZpbmVkCisJCXRvIGJlIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMuICBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYKKwkJdGhpcyBpcyBub3QgdGhlIGNhc2UgKGlmIHNvbWUgYml0cyByZXByZXNlbnQgYSBzdWItcHJpb3JpdHkpLgorCisJCUlmIHRoZSBhcHBsaWNhdGlvbiBvbmx5IHVzZXMgQ01TSVMgbGlicmFyaWVzIGZvciBpbnRlcnJ1cHQKKwkJY29uZmlndXJhdGlvbiB0aGVuIHRoZSBjb3JyZWN0IHNldHRpbmcgY2FuIGJlIGFjaGlldmVkIG9uIGFsbCBDb3J0ZXgtTQorCQlkZXZpY2VzIGJ5IGNhbGxpbmcgTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKCAwICk7IGJlZm9yZSBzdGFydGluZyB0aGUKKwkJc2NoZWR1bGVyLiAgTm90ZSBob3dldmVyIHRoYXQgc29tZSB2ZW5kb3Igc3BlY2lmaWMgcGVyaXBoZXJhbCBsaWJyYXJpZXMKKwkJYXNzdW1lIGEgbm9uLXplcm8gcHJpb3JpdHkgZ3JvdXAgc2V0dGluZywgaW4gd2hpY2ggY2FzZXMgdXNpbmcgYSB2YWx1ZQorCQlvZiB6ZXJvIHdpbGwgcmVzdWx0IGluIHVucHJlZGljdGFibGUgYmVoYXZpb3VyLiAqLworCQljb25maWdBU1NFUlQoICggcG9ydEFJUkNSX1JFRyAmIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLICkgPD0gdWxNYXhQUklHUk9VUFZhbHVlICk7CisJfQorCisjZW5kaWYgLyogY29uZmlnQVNTRVJUX0RFRklORUQgKi8KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNEYvcG9ydGFzbS5zIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000Ri9wb3J0YXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmZDlkMgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNEYvcG9ydGFzbS5zCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2luY2x1ZGUgPEZyZWVSVE9TQ29uZmlnLmg+CisKKwlSU0VHICAgIENPREU6Q09ERSgyKQorCXRodW1iCisKKwlFWFRFUk4gcHhDdXJyZW50VENCCisJRVhURVJOIHZUYXNrU3dpdGNoQ29udGV4dAorCisJUFVCTElDIHhQb3J0UGVuZFNWSGFuZGxlcgorCVBVQkxJQyB2UG9ydFNWQ0hhbmRsZXIKKwlQVUJMSUMgdlBvcnRTdGFydEZpcnN0VGFzaworCVBVQkxJQyB2UG9ydEVuYWJsZVZGUAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit4UG9ydFBlbmRTVkhhbmRsZXI6CisJbXJzIHIwLCBwc3AKKwlpc2IKKwkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IKKwlsZHIJcjIsIFtyM10KKworCS8qIElzIHRoZSB0YXNrIHVzaW5nIHRoZSBGUFUgY29udGV4dD8gIElmIHNvLCBwdXNoIGhpZ2ggdmZwIHJlZ2lzdGVycy4gKi8KKwl0c3QgcjE0LCAjMHgxMAorCWl0IGVxCisJdnN0bWRiZXEgcjAhLCB7czE2LXMzMX0KKworCS8qIFNhdmUgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLworCXN0bWRiIHIwISwge3I0LXIxMSwgcjE0fQorCisJLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbnRvIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIFRDQi4gKi8KKwlzdHIgcjAsIFtyMl0KKworCXN0bWRiIHNwISwge3IwLCByM30KKwltb3YgcjAsICNjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkKKwltc3IgYmFzZXByaSwgcjAKKwlkc2IKKwlpc2IKKwlibCB2VGFza1N3aXRjaENvbnRleHQKKwltb3YgcjAsICMwCisJbXNyIGJhc2VwcmksIHIwCisJbGRtaWEgc3AhLCB7cjAsIHIzfQorCisJLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0KKworCS8qIFBvcCB0aGUgY29yZSByZWdpc3RlcnMuICovCisJbGRtaWEgcjAhLCB7cjQtcjExLCByMTR9CisKKwkvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcG9wIHRoZSBoaWdoIHZmcCByZWdpc3RlcnMKKwl0b28uICovCisJdHN0IHIxNCwgIzB4MTAKKwlpdCBlcQorCXZsZG1pYWVxIHIwISwge3MxNi1zMzF9CisKKwltc3IgcHNwLCByMAorCWlzYgorCSNpZmRlZiBXT1JLQVJPVU5EX1BNVV9DTTAwMSAvKiBYTUM0MDAwIHNwZWNpZmljIGVycmF0YSAqLworCQkjaWYgV09SS0FST1VORF9QTVVfQ00wMDEgPT0gMQorCQkJcHVzaCB7IHIxNCB9CisJCQlwb3AgeyBwYyB9CisJCSNlbmRpZgorCSNlbmRpZgorCisJYnggcjE0CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0U1ZDSGFuZGxlcjoKKwkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IKKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0KKwkvKiBQb3AgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIwISwge3I0LXIxMSwgcjE0fQorCW1zciBwc3AsIHIwCisJaXNiCisJbW92IHIwLCAjMAorCW1zcgliYXNlcHJpLCByMAorCWJ4IHIxNAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlBvcnRTdGFydEZpcnN0VGFzaworCS8qIFVzZSB0aGUgTlZJQyBvZmZzZXQgcmVnaXN0ZXIgdG8gbG9jYXRlIHRoZSBzdGFjay4gKi8KKwlsZHIgcjAsID0weEUwMDBFRDA4CisJbGRyIHIwLCBbcjBdCisJbGRyIHIwLCBbcjBdCisJLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCW1zciBtc3AsIHIwCisJLyogQ2xlYXIgdGhlIGJpdCB0aGF0IGluZGljYXRlcyB0aGUgRlBVIGlzIGluIHVzZSBpbiBjYXNlIHRoZSBGUFUgd2FzIHVzZWQKKwliZWZvcmUgdGhlIHNjaGVkdWxlciB3YXMgc3RhcnRlZCAtIHdoaWNoIHdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdGhlCisJdW5uZWNlc3NhcnkgbGVhdmluZyBvZiBzcGFjZSBpbiB0aGUgU1ZDIHN0YWNrIGZvciBsYXp5IHNhdmluZyBvZiBGUFUKKwlyZWdpc3RlcnMuICovCisJbW92IHIwLCAjMAorCW1zciBjb250cm9sLCByMAorCS8qIENhbGwgU1ZDIHRvIHN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCWNwc2llIGkKKwljcHNpZSBmCisJZHNiCisJaXNiCisJc3ZjIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0RW5hYmxlVkZQOgorCS8qIFRoZSBGUFUgZW5hYmxlIGJpdHMgYXJlIGluIHRoZSBDUEFDUi4gKi8KKwlsZHIudyByMCwgPTB4RTAwMEVEODgKKwlsZHIJcjEsIFtyMF0KKworCS8qIEVuYWJsZSBDUDEwIGFuZCBDUDExIGNvcHJvY2Vzc29ycywgdGhlbiBzYXZlIGJhY2suICovCisJb3JyCXIxLCByMSwgIyggMHhmIDw8IDIwICkKKwlzdHIgcjEsIFtyMF0KKwlieAlyMTQKKworCisKKwlFTkQKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000Ri9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNEYvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5ZWY0NQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNEYvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBJQVIgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8aW50cmluc2ljcy5oPgorCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNjaGVkdWxlciB1dGlsaXRpZXMuICovCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJXAorCS8qIFNldCBhIFBlbmRTViB0byByZXF1ZXN0IGEgY29udGV4dCBzd2l0Y2guICovCQkJXAorCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CQkJXAorCV9fRFNCKCk7CQkJCQkJCQkJCQkJXAorCV9fSVNCKCk7CQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUX0JJVAkJKCAxVUwgPDwgMjhVTCApCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkgaWYoIHhTd2l0Y2hSZXF1aXJlZCAhPSBwZEZBTFNFICkgcG9ydFlJRUxEKCkKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBvcHRpbWlzYXRpb25zLiAqLworI2lmbmRlZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04KKwkjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAxCisjZW5kaWYKKworI2lmKCBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gPT0gMSApCisKKwkvKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KKwkjaWYoIGNvbmZpZ01BWF9QUklPUklUSUVTID4gMzIgKQorCQkjZXJyb3IgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIGNhbiBvbmx5IGJlIHNldCB0byAxIHdoZW4gY29uZmlnTUFYX1BSSU9SSVRJRVMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLiAgSXQgaXMgdmVyeSByYXJlIHRoYXQgYSBzeXN0ZW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEwIHRvIDE1IGRpZmZlcmVuY2UgcHJpb3JpdGllcyBhcyB0YXNrcyB0aGF0IHNoYXJlIGEgcHJpb3JpdHkgd2lsbCB0aW1lIHNsaWNlLgorCSNlbmRpZgorCisJLyogU3RvcmUvY2xlYXIgdGhlIHJlYWR5IHByaW9yaXRpZXMgaW4gYSBiaXQgbWFwLiAqLworCSNkZWZpbmUgcG9ydFJFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgfD0gKCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCSNkZWZpbmUgcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSAmPSB+KCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkjZGVmaW5lIHBvcnRHRVRfSElHSEVTVF9QUklPUklUWSggdXhUb3BQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSB1eFRvcFByaW9yaXR5ID0gKCAzMVVMIC0gKCAoIHVpbnQzMl90ICkgX19DTFooICggdXhSZWFkeVByaW9yaXRpZXMgKSApICkgKQorCisjZW5kaWYgLyogY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LiAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApOworCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJXAorCV9fc2V0X0JBU0VQUkkoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOwlcCisJX19EU0IoKTsJCQkJCQkJCQkJCQlcCisJX19JU0IoKTsJCQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCkJCQkJCV9fc2V0X0JBU0VQUkkoIDAgKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpCQlfX2dldF9CQVNFUFJJKCk7IHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJX19zZXRfQkFTRVBSSSggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGlja2xlc3MgaWRsZS9sb3cgcG93ZXIgZnVuY3Rpb25hbGl0eS4gKi8KKyNpZm5kZWYgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUAorCWV4dGVybiB2b2lkIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCBUaWNrVHlwZV90IHhFeHBlY3RlZElkbGVUaW1lICk7CisJI2RlZmluZSBwb3J0U1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQKCB4RXhwZWN0ZWRJZGxlVGltZSApIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCB4RXhwZWN0ZWRJZGxlVGltZSApCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRhc2sgZnVuY3Rpb24gbWFjcm9zIGFzIGRlc2NyaWJlZCBvbiB0aGUgRnJlZVJUT1Mub3JnIFdFQiBzaXRlLiAgVGhlc2UgYXJlCitub3QgbmVjZXNzYXJ5IGZvciB0byB1c2UgdGhpcyBwb3J0LiAgVGhleSBhcmUgZGVmaW5lZCBzbyB0aGUgY29tbW9uIGRlbW8gZmlsZXMKKyh3aGljaCBidWlsZCB3aXRoIGFsbCB0aGUgcG9ydHMpIHdpbGwgYnVpbGQuICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgY29uZmlnQVNTRVJUCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKTsKKwkjZGVmaW5lIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSAJdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCkKKyNlbmRpZgorCisvKiBwb3J0Tk9QKCkgaXMgbm90IHJlcXVpcmVkIGJ5IHRoaXMgcG9ydC4gKi8KKyNkZWZpbmUgcG9ydE5PUCgpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTdXBwcmVzcyB3YXJuaW5ncyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIElBUiB0b29scywgYnV0IGNhbm5vdCBiZSBmaXhlZCBpbgordGhlIHNvdXJjZSBjb2RlIGJlY2F1c2UgdG8gZG8gc28gd291bGQgY2F1c2Ugb3RoZXIgY29tcGlsZXJzIHRvIGdlbmVyYXRlCit3YXJuaW5ncy4gKi8KKyNwcmFnbWEgZGlhZ19zdXBwcmVzcz1QZTE5MQorI3ByYWdtYSBkaWFnX3N1cHByZXNzPVBhMDgyCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRfTVBVL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExM2FmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRfTVBVL3BvcnQuYwpAQCAtMCwwICsxLDc0OSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4wCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIElmIHlvdSB3aXNoIHRvIHVzZSBvdXIgQW1hem9uCisgKiBGcmVlUlRPUyBuYW1lLCBwbGVhc2UgZG8gc28gaW4gYSBmYWlyIHVzZSB3YXkgdGhhdCBkb2VzIG5vdCBjYXVzZSBjb25mdXNpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmggZm9yIHRoZSBBUk0gQ000RiBwb3J0LgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSUFSIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPGludHJpbnNpY3MuaD4KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiAgVGhhdCBzaG91bGQgb25seSBiZSBkb25lIHdoZW4KK3Rhc2suaCBpcyBpbmNsdWRlZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZpbGUuICovCisjZGVmaW5lIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKyNpZm5kZWYgX19BUk1WRlBfXworCSNlcnJvciBUaGlzIHBvcnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgdG8gZW5hYmxlIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQuCisjZW5kaWYKKworI2lmKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgPT0gMCApCisJI2Vycm9yIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBtdXN0IG5vdCBiZSBzZXQgdG8gMC4gIFNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdTWVNUSUNLX0NMT0NLX0haCisJI2RlZmluZSBjb25maWdTWVNUSUNLX0NMT0NLX0haIGNvbmZpZ0NQVV9DTE9DS19IWgorCS8qIEVuc3VyZSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGF0IHRoZSBzYW1lIGZyZXF1ZW5jeSBhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDFVTCA8PCAyVUwgKQorI2Vsc2UKKwkvKiBUaGUgd2F5IHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgaXMgbm90IG1vZGlmaWVkIGluIGNhc2UgaXQgaXMgbm90IHRoZSBzYW1lCisJYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQJKCAwICkKKyNlbmRpZgorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29yZS4gIFJlZ2lzdGVycyBmaXJzdC4uLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTAgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjAgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDFjICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNfQ1RSTF9TVEFURV9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfTUVNX0ZBVUxUX0VOQUJMRQkJCQkoIDFVTCA8PCAxNlVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZSB0aGUgTVBVLiAqLworI2RlZmluZSBwb3J0TVBVX1RZUEVfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5MCApICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOUMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZEEwICkgKQorI2RlZmluZSBwb3J0TVBVX0NUUkxfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5NCApICkKKyNkZWZpbmUgcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFCQkJCSggOFVMIDw8IDhVTCApIC8qIDggcmVnaW9ucywgdW5pZmllZC4gKi8KKyNkZWZpbmUgcG9ydE1QVV9FTkFCTEUJCQkJCQkJKCAweDAxVUwgKQorI2RlZmluZSBwb3J0TVBVX0JBQ0tHUk9VTkRfRU5BQkxFCQkJCSggMVVMIDw8IDJVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX0VYRUNVVElPTl9TVEFSVF9BRERSRVNTCSggMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fVkFMSUQJCQkJCSggMHgxMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fRU5BQkxFCQkJCQkoIDB4MDFVTCApCisjZGVmaW5lIHBvcnRQRVJJUEhFUkFMU19TVEFSVF9BRERSRVNTCQkJMHg0MDAwMDAwMFVMCisjZGVmaW5lIHBvcnRQRVJJUEhFUkFMU19FTkRfQUREUkVTUwkJCQkweDVGRkZGRkZGVUwKKworLyogLi4udGhlbiBiaXRzIGluIHRoZSByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVAkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVAkJCSggMVVMIDw8IDBVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQJCSggMVVMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZDTEVBUl9CSVQgCQkJKCAxVUwgPDwgMjdVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRfU1lTVElDS19DTEVBUl9CSVQJCSggMVVMIDw8IDI1VUwgKQorCisvKiBDb25zdGFudHMgdXNlZCB0byBkZXRlY3QgYSBDb3J0ZXgtTTcgcjBwMSBjb3JlLCB3aGljaCBzaG91bGQgdXNlIHRoZSBBUk1fQ003CityMHAxIHBvcnQuICovCisjZGVmaW5lIHBvcnRDUFVJRAkJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBlZDAwICkgKQorI2RlZmluZSBwb3J0Q09SVEVYX003X3IwcDFfSUQJCQkJKCAweDQxMEZDMjcxVUwgKQorI2RlZmluZSBwb3J0Q09SVEVYX003X3IwcDBfSUQJCQkJKCAweDQxMEZDMjcwVUwgKQorCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVl9QUkkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1ZDX1BSSQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgLSAxVUwgKSA8PCAyNFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBhbiBpbnRlcnJ1cHQgcHJpb3JpdHkuICovCisjZGVmaW5lIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIJCSggMTYgKQorI2RlZmluZSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2IAkoIDB4RTAwMEUzRjAgKQorI2RlZmluZSBwb3J0QUlSQ1JfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhFMDAwRUQwQyApICkKKyNkZWZpbmUgcG9ydE1BWF84X0JJVF9WQUxVRQkJCQkJKCAoIHVpbnQ4X3QgKSAweGZmICkKKyNkZWZpbmUgcG9ydFRPUF9CSVRfT0ZfQllURQkJCQkJKCAoIHVpbnQ4X3QgKSAweDgwICkKKyNkZWZpbmUgcG9ydE1BWF9QUklHUk9VUF9CSVRTCQkJCSggKCB1aW50OF90ICkgNyApCisjZGVmaW5lIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLCQkJCSggMHgwN1VMIDw8IDhVTCApCisjZGVmaW5lIHBvcnRQUklHUk9VUF9TSElGVAkJCQkJKCA4VUwgKQorCisvKiBNYXNrcyBvZmYgYWxsIGJpdHMgYnV0IHRoZSBWRUNUQUNUSVZFIGJpdHMgaW4gdGhlIElDU1IgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRWRUNUQUNUSVZFX01BU0sJCQkJCSggMHhGRlVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIFZGUC4gKi8KKyNkZWZpbmUgcG9ydEZQQ0NSCQkJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWYzNCApIC8qIEZsb2F0aW5nIHBvaW50IGNvbnRleHQgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydEFTUEVOX0FORF9MU1BFTl9CSVRTCQkJKCAweDNVTCA8PCAzMFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBzdGFjay4gKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJKCAweDAxMDAwMDAwICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCQkoIDB4ZmZmZmZmZmQgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRAkoIDB4MDMgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1BSSVZJTEVHRUQJKCAweDAyICkKKworLyogT2Zmc2V0cyBpbiB0aGUgc3RhY2sgdG8gdGhlIHBhcmFtZXRlcnMgd2hlbiBpbnNpZGUgdGhlIFNWQyBoYW5kbGVyLiAqLworI2RlZmluZSBwb3J0T0ZGU0VUX1RPX1BDCQkJCQkJKCA2ICkKKworLyogVGhlIHN5c3RpY2sgaXMgYSAyNC1iaXQgY291bnRlci4gKi8KKyNkZWZpbmUgcG9ydE1BWF8yNF9CSVRfTlVNQkVSCQkJCSggMHhmZmZmZmZVTCApCisKKy8qIEEgZmlkZGxlIGZhY3RvciB0byBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIFN5c1RpY2sgY291bnRzIHRoYXQgd291bGQgaGF2ZQorb2NjdXJyZWQgd2hpbGUgdGhlIFN5c1RpY2sgY291bnRlciBpcyBzdG9wcGVkIGR1cmluZyB0aWNrbGVzcyBpZGxlCitjYWxjdWxhdGlvbnMuICovCisjZGVmaW5lIHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUgkJCSggNDVVTCApCisKKy8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCitoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KKyNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKgorICogQ29uZmlndXJlIGEgbnVtYmVyIG9mIHN0YW5kYXJkIE1QVSByZWdpb25zIHRoYXQgYXJlIHVzZWQgYnkgYWxsIHRhc2tzLgorICovCitQUklWSUxFR0VEX0ZVTkNUSU9OIHN0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICk7CisKKy8qCisgKiBSZXR1cm4gdGhlIHNtYWxsZXN0IE1QVSByZWdpb24gc2l6ZSB0aGF0IGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIHdpbGwgZml0CisgKiBpbnRvLiAgVGhlIHJlZ2lvbiBzaXplIGlzIHJldHVybmVkIGFzIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBwcm9ncmFtbWVkCisgKiBpbnRvIHRoZSByZWdpb24gYXR0cmlidXRlIHJlZ2lzdGVyIGZvciB0aGF0IHJlZ2lvbi4KKyAqLworUFJJVklMRUdFRF9GVU5DVElPTiBzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKTsKKworLyoKKyAqIENoZWNrcyB0byBzZWUgaWYgYmVpbmcgY2FsbGVkIGZyb20gdGhlIGNvbnRleHQgb2YgYW4gdW5wcml2aWxlZ2VkIHRhc2ssIGFuZAorICogaWYgc28gcmFpc2VzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYW5kIHJldHVybnMgZmFsc2UgLSBvdGhlcndpc2UgZG9lcyBub3RoaW5nCisgKiBvdGhlciB0aGFuIHJldHVybiB0cnVlLgorICovCitleHRlcm4gQmFzZVR5cGVfdCB4UG9ydFJhaXNlUHJpdmlsZWdlKCB2b2lkICk7CisKKy8qCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzCisgKiBmaWxlIGlzIHdlYWsgdG8gYWxsb3cgYXBwbGljYXRpb24gd3JpdGVycyB0byBjaGFuZ2UgdGhlIHRpbWVyIHVzZWQgdG8KKyAqIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdC4KKyAqLwordm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKTsKKworLyoKKyAqIEV4Y2VwdGlvbiBoYW5kbGVycy4KKyAqLworUFJJVklMRUdFRF9GVU5DVElPTiB2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKTsKKworLyoKKyAqIFN0YXJ0IGZpcnN0IHRhc2sgaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgdGVzdGVkIGluIGlzb2xhdGlvbi4KKyAqLworUFJJVklMRUdFRF9GVU5DVElPTiBleHRlcm4gdm9pZCB2UG9ydFN0YXJ0Rmlyc3RUYXNrKCB2b2lkICk7CisKKy8qCisgKiBUdXJuIHRoZSBWRlAgb24uCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0RW5hYmxlVkZQKCB2b2lkICk7CisKKy8qCisgKiBUaGUgQyBwb3J0aW9uIG9mIHRoZSBTVkMgaGFuZGxlci4KKyAqLwordm9pZCB2UG9ydFNWQ0hhbmRsZXJfQyggdWludDMyX3QgKnB1bFBhcmFtICk7CisKKy8qCisgKiBDYWxsZWQgZnJvbSB0aGUgU1ZDIGhhbmRsZXIgdXNlZCB0byBzdGFydCB0aGUgc2NoZWR1bGVyLgorICovCitQUklWSUxFR0VEX0ZVTkNUSU9OIGV4dGVybiB2b2lkIHZQb3J0UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzayggdm9pZCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKK3ZhcmlhYmxlLiAqLworc3RhdGljIFVCYXNlVHlwZV90IHV4Q3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYTsKKworLyoKKyAqIFVzZWQgYnkgdGhlIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSBtYWNybyB0byBlbnN1cmUKKyAqIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgYXJlIG5vdCBjYWxsZWQgZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkCisgKiBhIHByaW9yaXR5IGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKyAqLworI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwkgc3RhdGljIHVpbnQ4X3QgdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSAwOworCSBzdGF0aWMgdWludDMyX3QgdWxNYXhQUklHUk9VUFZhbHVlID0gMDsKKwkgc3RhdGljIGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzID0gKCBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgKSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2OworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMsIEJhc2VUeXBlX3QgeFJ1blByaXZpbGVnZWQgKQoreworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwlpbnRlcnJ1cHQuICovCisKKwkvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQKKwlvZiBpbnRlcnJ1cHRzLCBhbmQgdG8gZW5zdXJlIGFsaWdubWVudC4gKi8KKwlweFRvcE9mU3RhY2stLTsKKworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkvKiB4UFNSICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggKCBTdGFja1R5cGVfdCApIHB4Q29kZSApICYgcG9ydFNUQVJUX0FERFJFU1NfTUFTSzsJLyogUEMgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDA7CS8qIExSICovCisKKwkvKiBTYXZlIGNvZGUgc3BhY2UgYnkgc2tpcHBpbmcgcmVnaXN0ZXIgaW5pdGlhbGlzYXRpb24uICovCisJcHhUb3BPZlN0YWNrIC09IDU7CS8qIFIxMiwgUjMsIFIyIGFuZCBSMS4gKi8KKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJLyogUjAgKi8KKworCS8qIEEgc2F2ZSBtZXRob2QgaXMgYmVpbmcgdXNlZCB0aGF0IHJlcXVpcmVzIGVhY2ggdGFzayB0byBtYWludGFpbiBpdHMKKwlvd24gZXhlYyByZXR1cm4gdmFsdWUuICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0VYQ19SRVRVUk47CisKKwlweFRvcE9mU3RhY2sgLT0gOTsJLyogUjExLCBSMTAsIFI5LCBSOCwgUjcsIFI2LCBSNSBhbmQgUjQuICovCisKKwlpZiggeFJ1blByaXZpbGVnZWQgPT0gcGRUUlVFICkKKwl7CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1BSSVZJTEVHRUQ7CisJfQorCWVsc2UKKwl7CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRDsKKwl9CisKKwlyZXR1cm4gcHhUb3BPZlN0YWNrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRTVkNIYW5kbGVyX0MoIHVpbnQzMl90ICpwdWxQYXJhbSApCit7Cit1aW50OF90IHVjU1ZDTnVtYmVyOworCisJLyogVGhlIHN0YWNrIGNvbnRhaW5zOiByMCwgcjEsIHIyLCByMywgcjEyLCByMTQsIHRoZSByZXR1cm4gYWRkcmVzcyBhbmQKKwl4UFNSLiAgVGhlIGZpcnN0IGFyZ3VtZW50IChyMCkgaXMgcHVsUGFyYW1bIDAgXS4gKi8KKwl1Y1NWQ051bWJlciA9ICggKCB1aW50OF90ICogKSBwdWxQYXJhbVsgcG9ydE9GRlNFVF9UT19QQyBdIClbIC0yIF07CisJc3dpdGNoKCB1Y1NWQ051bWJlciApCisJeworCQljYXNlIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSCToJcG9ydE5WSUNfU1lTUFJJMV9SRUcgfD0gcG9ydE5WSUNfU1ZDX1BSSTsKKwkJCQkJCQkJCQkJdlBvcnRSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCk7CisJCQkJCQkJCQkJCWJyZWFrOworCisJCWNhc2UgcG9ydFNWQ19ZSUVMRAkJCQk6CXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCQkJCQkJCQkJCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQKKwkJCQkJCQkJCQkJYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CisJCQkJCQkJCQkJCXdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlCisJCQkJCQkJCQkJCWFyY2hpdGVjdHVyZS4gKi8KKwkJCQkJCQkJCQkJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCQkJCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKKworCQkJCQkJCQkJCQlicmVhazsKKworCQljYXNlIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCToJX19hc20gdm9sYXRpbGUKKwkJCQkJCQkJCQkJKAorCQkJCQkJCQkJCQkJIgltcnMgcjEsIGNvbnRyb2wJCVxuIiAvKiBPYnRhaW4gY3VycmVudCBjb250cm9sIHZhbHVlLiAqLworCQkJCQkJCQkJCQkJIgliaWMgcjEsIHIxLCAjMQkJXG4iIC8qIFNldCBwcml2aWxlZ2UgYml0LiAqLworCQkJCQkJCQkJCQkJIgltc3IgY29udHJvbCwgcjEJCVxuIiAvKiBXcml0ZSBiYWNrIG5ldyBjb250cm9sIHZhbHVlLiAqLworCQkJCQkJCQkJCQkJOjo6ICJyMSIsICJtZW1vcnkiCisJCQkJCQkJCQkJCSk7CisJCQkJCQkJCQkJCWJyZWFrOworCisJCWRlZmF1bHQJCQkJCQkJOgkvKiBVbmtub3duIFNWQyBjYWxsLiAqLworCQkJCQkJCQkJCQlicmVhazsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApCit7CisJLyogY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLgorCVNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCisJY29uZmlnQVNTRVJUKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKTsKKworCS8qIFRoaXMgcG9ydCBjYW4gYmUgdXNlZCBvbiBhbGwgcmV2aXNpb25zIG9mIHRoZSBDb3J0ZXgtTTcgY29yZSBvdGhlciB0aGFuCisJdGhlIHIwcDEgcGFydHMuICByMHAxIHBhcnRzIHNob3VsZCB1c2UgdGhlIHBvcnQgZnJvbSB0aGUKKwkvc291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003L3IwcDEgZGlyZWN0b3J5LiAqLworCWNvbmZpZ0FTU0VSVCggcG9ydENQVUlEICE9IHBvcnRDT1JURVhfTTdfcjBwMV9JRCApOworCWNvbmZpZ0FTU0VSVCggcG9ydENQVUlEICE9IHBvcnRDT1JURVhfTTdfcjBwMF9JRCApOworCisJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwl7CisJCXZvbGF0aWxlIHVpbnQzMl90IHVsT3JpZ2luYWxQcmlvcml0eTsKKwkJdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSAoIHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCApICggcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiArIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKTsKKwkJdm9sYXRpbGUgdWludDhfdCB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHByaW9yaXR5IGZyb20gd2hpY2ggSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCWZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiAgSVNSIHNhZmUgZnVuY3Rpb25zIGFyZSB0aG9zZSB0aGF0IGVuZCBpbgorCQkiRnJvbUlTUiIuICBGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0bworCQllbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQlTYXZlIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkgdmFsdWUgdGhhdCBpcyBhYm91dCB0byBiZSBjbG9iYmVyZWQuICovCisJCXVsT3JpZ2luYWxQcmlvcml0eSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYXZhaWxhYmxlLiAgRmlyc3Qgd3JpdGUgdG8gYWxsCisJCXBvc3NpYmxlIGJpdHMuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gcG9ydE1BWF84X0JJVF9WQUxVRTsKKworCQkvKiBSZWFkIHRoZSB2YWx1ZSBiYWNrIHRvIHNlZSBob3cgbWFueSBiaXRzIHN0dWNrLiAqLworCQl1Y01heFByaW9yaXR5VmFsdWUgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCSNpZmRlZiBfX05WSUNfUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBDTVNJUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IF9fTlZJQ19QUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkjaWZkZWYgY29uZmlnUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBGcmVlUlRPUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IGNvbmZpZ1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIENvbmZpZ3VyZSB0aGUgcmVnaW9ucyBpbiB0aGUgTVBVIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgdGFza3MuICovCisJcHJ2U2V0dXBNUFUoKTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIEVuc3VyZSB0aGUgVkZQIGlzIGVuYWJsZWQgLSBpdCBzaG91bGQgYmUgYW55d2F5LiAqLworCXZQb3J0RW5hYmxlVkZQKCk7CisKKwkvKiBMYXp5IHNhdmUgYWx3YXlzLiAqLworCSooIHBvcnRGUENDUiApIHw9IHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUzsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCXZQb3J0U3RhcnRGaXJzdFRhc2soKTsKKworCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUhICovCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApCit7CisJLyogTm90IGltcGxlbWVudGVkIGluIHBvcnRzIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLgorCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxMDAwVUwgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApCit7CisgQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJdXhDcml0aWNhbE5lc3RpbmcrKzsKKworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisJLyogVGhpcyBpcyBub3QgdGhlIGludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIGVudGVyIGNyaXRpY2FsIGZ1bmN0aW9uIHNvCisJYXNzZXJ0KCkgaWYgaXQgaXMgYmVpbmcgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQuICBPbmx5IEFQSQorCWZ1bmN0aW9ucyB0aGF0IGVuZCBpbiAiRnJvbUlTUiIgY2FuIGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0LiAgT25seSBhc3NlcnQgaWYKKwl0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCBpcyAxIHRvIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpdmUgY2FsbHMgaWYgdGhlCisJYXNzZXJ0IGZ1bmN0aW9uIGFsc28gdXNlcyBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEgKQorCXsKKwkJY29uZmlnQVNTRVJUKCAoIHBvcnROVklDX0lOVF9DVFJMX1JFRyAmIHBvcnRWRUNUQUNUSVZFX01BU0sgKSA9PSAwICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKQoreworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nICk7CisKKwl1eENyaXRpY2FsTmVzdGluZy0tOworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KKworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApCit7CisJLyogVGhlIFN5c1RpY2sgcnVucyBhdCB0aGUgbG93ZXN0IGludGVycnVwdCBwcmlvcml0eSwgc28gd2hlbiB0aGlzIGludGVycnVwdAorCWV4ZWN1dGVzIGFsbCBpbnRlcnJ1cHRzIG11c3QgYmUgdW5tYXNrZWQuICBUaGVyZSBpcyB0aGVyZWZvcmUgbm8gbmVlZCB0bworCXNhdmUgYW5kIHRoZW4gcmVzdG9yZSB0aGUgaW50ZXJydXB0IG1hc2sgdmFsdWUgYXMgaXRzIHZhbHVlIGlzIGFscmVhZHkKKwlrbm93bi4gKi8KKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBBIGNvbnRleHQgc3dpdGNoIGlzIHJlcXVpcmVkLiAgQ29udGV4dCBzd2l0Y2hpbmcgaXMgcGVyZm9ybWVkIGluCisJCQl0aGUgUGVuZFNWIGludGVycnVwdC4gIFBlbmQgdGhlIFBlbmRTViBpbnRlcnJ1cHQuICovCisJCQlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQl9CisJfQorCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZXR1cCB0aGUgc3lzdGljayB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzIGF0IHRoZSByZXF1aXJlZAorICogZnJlcXVlbmN5LgorICovCitfX3dlYWsgdm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKQoreworCS8qIFN0b3AgYW5kIGNsZWFyIHRoZSBTeXNUaWNrLiAqLworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAwVUw7CisJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCS8qIENvbmZpZ3VyZSBTeXNUaWNrIHRvIGludGVycnVwdCBhdCB0aGUgcmVxdWVzdGVkIHJhdGUuICovCisJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC0gMVVMOworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkKK3sKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fOworZXh0ZXJuIHVpbnQzMl90IF9fRkxBU0hfc2VnbWVudF9zdGFydF9fOworZXh0ZXJuIHVpbnQzMl90IF9fRkxBU0hfc2VnbWVudF9lbmRfXzsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fOworCisJCS8qIEZpcnN0IHNldHVwIHRoZSBlbnRpcmUgZmxhc2ggZm9yIHVucHJpdmlsZWdlZCByZWFkIG9ubHkgYWNjZXNzLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCQkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfZW5kX18gLSAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIFNldHVwIHRoZSBmaXJzdCAxNksgZm9yIHByaXZpbGVnZWQgb25seSBhY2Nlc3MgKGV2ZW4gdGhvdWdoIGxlc3MKKwkJdGhhbiAxMEsgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCkuICBUaGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgY29kZSBpcworCQlwbGFjZWQuICovCisJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJCQkJCQkoIHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9PTkxZICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCQkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX18gLSAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIFNldHVwIHRoZSBwcml2aWxlZ2VkIGRhdGEgUkFNIHJlZ2lvbi4gIFRoaXMgaXMgd2hlcmUgdGhlIGtlcm5lbCBkYXRhCisJCWlzIHBsYWNlZC4gKi8KKwkJcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRyA9CSggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OICk7CisKKwkJcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRyA9CSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCQkJCQkJcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXyAtICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogQnkgZGVmYXVsdCBhbGxvdyBldmVyeXRoaW5nIHRvIGFjY2VzcyB0aGUgZ2VuZXJhbCBwZXJpcGhlcmFscy4gIFRoZQorCQlzeXN0ZW0gcGVyaXBoZXJhbHMgYW5kIHJlZ2lzdGVycyBhcmUgcHJvdGVjdGVkLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCBwb3J0UEVSSVBIRVJBTFNfU1RBUlRfQUREUkVTUyApIHwKKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0R0VORVJBTF9QRVJJUEhFUkFMU19SRUdJT04gKTsKKworCQlwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHID0JKCBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFIHwgcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApIHwKKwkJCQkJCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCBwb3J0UEVSSVBIRVJBTFNfRU5EX0FERFJFU1MgLSBwb3J0UEVSSVBIRVJBTFNfU1RBUlRfQUREUkVTUyApICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogRW5hYmxlIHRoZSBtZW1vcnkgZmF1bHQgZXhjZXB0aW9uLiAqLworCQlwb3J0TlZJQ19TWVNfQ1RSTF9TVEFURV9SRUcgfD0gcG9ydE5WSUNfTUVNX0ZBVUxUX0VOQUJMRTsKKworCQkvKiBFbmFibGUgdGhlIE1QVSB3aXRoIHRoZSBiYWNrZ3JvdW5kIHJlZ2lvbiBjb25maWd1cmVkLiAqLworCQlwb3J0TVBVX0NUUkxfUkVHIHw9ICggcG9ydE1QVV9FTkFCTEUgfCBwb3J0TVBVX0JBQ0tHUk9VTkRfRU5BQkxFICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVpbnQzMl90IHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1aW50MzJfdCB1bEFjdHVhbFNpemVJbkJ5dGVzICkKK3sKK3VpbnQzMl90IHVsUmVnaW9uU2l6ZSwgdWxSZXR1cm5WYWx1ZSA9IDQ7CisKKwkvKiAzMiBpcyB0aGUgc21hbGxlc3QgcmVnaW9uIHNpemUsIDMxIGlzIHRoZSBsYXJnZXN0IHZhbGlkIHZhbHVlIGZvcgorCXVsUmV0dXJuVmFsdWUuICovCisJZm9yKCB1bFJlZ2lvblNpemUgPSAzMlVMOyB1bFJldHVyblZhbHVlIDwgMzFVTDsgKCB1bFJlZ2lvblNpemUgPDw9IDFVTCApICkKKwl7CisJCWlmKCB1bEFjdHVhbFNpemVJbkJ5dGVzIDw9IHVsUmVnaW9uU2l6ZSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJeworCQkJdWxSZXR1cm5WYWx1ZSsrOworCQl9CisJfQorCisJLyogU2hpZnQgdGhlIGNvZGUgYnkgb25lIGJlZm9yZSByZXR1cm5pbmcgc28gaXQgY2FuIGJlIHdyaXR0ZW4gZGlyZWN0bHkKKwlpbnRvIHRoZSB0aGUgY29ycmVjdCBiaXQgcG9zaXRpb24gb2YgdGhlIGF0dHJpYnV0ZSByZWdpc3Rlci4gKi8KKwlyZXR1cm4gKCB1bFJldHVyblZhbHVlIDw8IDFVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKQoreworCWlmKCB4UnVubmluZ1ByaXZpbGVnZWQgIT0gcGRUUlVFICkKKwl7CisJCV9fYXNtIHZvbGF0aWxlICggIiBtcnMgcjAsIGNvbnRyb2wgCVxuIiBcCisJCQkJCQkgIiBvcnIgcjAsIHIwLCAjMQlcbiIgXAorCQkJCQkJICIgbXNyIGNvbnRyb2wsIHIwCVxuIglcCisJCQkJCQkgOjo6InIwIiwgIm1lbW9yeSIgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFN0b3JlVGFza01QVVNldHRpbmdzKCB4TVBVX1NFVFRJTkdTICp4TVBVU2V0dGluZ3MsIGNvbnN0IHN0cnVjdCB4TUVNT1JZX1JFR0lPTiAqIGNvbnN0IHhSZWdpb25zLCBTdGFja1R5cGVfdCAqcHhCb3R0b21PZlN0YWNrLCB1aW50MzJfdCB1bFN0YWNrRGVwdGggKQoreworZXh0ZXJuIHVpbnQzMl90IF9fU1JBTV9zZWdtZW50X3N0YXJ0X187CitleHRlcm4gdWludDMyX3QgX19TUkFNX3NlZ21lbnRfZW5kX187CitleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXzsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXzsKK2ludDMyX3QgbEluZGV4OwordWludDMyX3QgdWw7CisKKwlpZiggeFJlZ2lvbnMgPT0gTlVMTCApCisJeworCQkvKiBObyBNUFUgcmVnaW9ucyBhcmUgc3BlY2lmaWVkIHNvIGFsbG93IGFjY2VzcyB0byBhbGwgUkFNLiAqLworCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDAgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0KKwkJCQkoICggdWludDMyX3QgKSBfX1NSQU1fc2VnbWVudF9zdGFydF9fICkgfCAvKiBCYXNlIGFkZHJlc3MuICovCisJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkoIHBvcnRTVEFDS19SRUdJT04gKTsKKworCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDAgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFICkgfAorCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fU1JBTV9zZWdtZW50X2VuZF9fIC0gKCB1aW50MzJfdCApIF9fU1JBTV9zZWdtZW50X3N0YXJ0X18gKSApIHwKKwkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIFJlLWluc3RhdGUgdGhlIHByaXZpbGVnZWQgb25seSBSQU0gcmVnaW9uIGFzIHhSZWdpb25bIDAgXSB3aWxsIGhhdmUKKwkJanVzdCByZW1vdmVkIHRoZSBwcml2aWxlZ2VkIG9ubHkgcGFyYW1ldGVycy4gKi8KKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAxIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJKCBwb3J0U1RBQ0tfUkVHSU9OICsgMSApOworCisJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMSBdLnVsUmVnaW9uQXR0cmlidXRlID0KKwkJCQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURSApIHwKKwkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCXBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2RhdGFfZW5kX18gLSAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXyApIHwKKwkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIEludmFsaWRhdGUgYWxsIG90aGVyIHJlZ2lvbnMuICovCisJCWZvciggdWwgPSAyOyB1bCA8PSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TOyB1bCsrICkKKwkJeworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPSAoIHBvcnRTVEFDS19SRUdJT04gKyB1bCApIHwgcG9ydE1QVV9SRUdJT05fVkFMSUQ7CisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25BdHRyaWJ1dGUgPSAwVUw7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB0YXNrIGlzIGNyZWF0ZWQgLSBpbgorCQl3aGljaCBjYXNlIHRoZSBzdGFjayByZWdpb24gcGFyYW1ldGVycyB3aWxsIGJlIHZhbGlkLiAgQXQgYWxsIG90aGVyCisJCXRpbWVzIHRoZSBzdGFjayBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIHZhbGlkIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlCisJCXN0YWNrIHJlZ2lvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQuICovCisJCWlmKCB1bFN0YWNrRGVwdGggPiAwICkKKwkJeworCQkJLyogRGVmaW5lIHRoZSByZWdpb24gdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzdGFjay4gKi8KKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMCBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPQorCQkJCQkoICggdWludDMyX3QgKSBweEJvdHRvbU9mU3RhY2sgKSB8CisJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCSggcG9ydFNUQUNLX1JFR0lPTiApOyAvKiBSZWdpb24gbnVtYmVyLiAqLworCisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDAgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9CisJCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApIHwgLyogUmVhZCBhbmQgd3JpdGUuICovCisJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVsU3RhY2tEZXB0aCAqICggdWludDMyX3QgKSBzaXplb2YoIFN0YWNrVHlwZV90ICkgKSApIHwKKwkJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKwkJfQorCisJCWxJbmRleCA9IDA7CisKKwkJZm9yKCB1bCA9IDE7IHVsIDw9IHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlM7IHVsKysgKQorCQl7CisJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0gKS51bExlbmd0aEluQnl0ZXMgPiAwVUwgKQorCQkJeworCQkJCS8qIFRyYW5zbGF0ZSB0aGUgZ2VuZXJpYyByZWdpb24gZGVmaW5pdGlvbiBjb250YWluZWQgaW4KKwkJCQl4UmVnaW9ucyBpbnRvIHRoZSBDTTMgc3BlY2lmaWMgTVBVIHNldHRpbmdzIHRoYXQgYXJlIHRoZW4KKwkJCQlzdG9yZWQgaW4geE1QVVNldHRpbmdzLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0KKwkJCQkJCSggKCB1aW50MzJfdCApIHhSZWdpb25zWyBsSW5kZXggXS5wdkJhc2VBZGRyZXNzICkgfAorCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCSggcG9ydFNUQUNLX1JFR0lPTiArIHVsICk7IC8qIFJlZ2lvbiBudW1iZXIuICovCisKKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggeFJlZ2lvbnNbIGxJbmRleCBdLnVsTGVuZ3RoSW5CeXRlcyApICkgfAorCQkJCQkJKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICkgfAorCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBJbnZhbGlkYXRlIHRoZSByZWdpb24uICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPSAoIHBvcnRTVEFDS19SRUdJT04gKyB1bCApIHwgcG9ydE1QVV9SRUdJT05fVkFMSUQ7CisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQXR0cmlidXRlID0gMFVMOworCQkJfQorCisJCQlsSW5kZXgrKzsKKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKQorCXsKKwl1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CisJdWludDhfdCB1Y0N1cnJlbnRQcmlvcml0eTsKKworCQkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApIDo6ICJtZW1vcnkiICk7CisKKwkJLyogSXMgdGhlIGludGVycnVwdCBudW1iZXIgYSB1c2VyIGRlZmluZWQgaW50ZXJydXB0PyAqLworCQlpZiggdWxDdXJyZW50SW50ZXJydXB0ID49IHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKQorCQl7CisJCQkvKiBMb29rIHVwIHRoZSBpbnRlcnJ1cHQncyBwcmlvcml0eS4gKi8KKwkJCXVjQ3VycmVudFByaW9yaXR5ID0gcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVyc1sgdWxDdXJyZW50SW50ZXJydXB0IF07CisKKwkJCS8qIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZiBhIHNlcnZpY2Ugcm91dGluZSAoSVNSKSBmb3IKKwkJCWFuIGludGVycnVwdCB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYWJvdmUKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBjYWxscyBhbiBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJCWZ1bmN0aW9uLiAgSVNSIHNhZmUgRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBtdXN0ICpvbmx5KiBiZSBjYWxsZWQKKwkJCWZyb20gaW50ZXJydXB0cyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGF0IG9yIGJlbG93CisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCU51bWVyaWNhbGx5IGxvdyBpbnRlcnJ1cHQgcHJpb3JpdHkgbnVtYmVycyByZXByZXNlbnQgbG9naWNhbGx5IGhpZ2gKKwkJCWludGVycnVwdCBwcmlvcml0aWVzLCB0aGVyZWZvcmUgdGhlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQgbXVzdAorCQkJYmUgc2V0IHRvIGEgdmFsdWUgZXF1YWwgdG8gb3IgbnVtZXJpY2FsbHkgKmhpZ2hlciogdGhhbgorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlJbnRlcnJ1cHRzIHRoYXQJdXNlIHRoZSBGcmVlUlRPUyBBUEkgbXVzdCBub3QgYmUgbGVmdCBhdCB0aGVpcgorCQkJZGVmYXVsdCBwcmlvcml0eSBvZgl6ZXJvIGFzIHRoYXQgaXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgcHJpb3JpdHksCisJCQl3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSwKKwkJCWFuZAl0aGVyZWZvcmUgYWxzbyBndWFyYW50ZWVkIHRvIGJlIGludmFsaWQuCisKKwkJCUZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvIGVuc3VyZQorCQkJaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQkJVGhlIGZvbGxvd2luZyBsaW5rcyBwcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uOgorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbAorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvRkFRSGVscC5odG1sICovCisJCQljb25maWdBU1NFUlQoIHVjQ3VycmVudFByaW9yaXR5ID49IHVjTWF4U3lzQ2FsbFByaW9yaXR5ICk7CisJCX0KKworCQkvKiBQcmlvcml0eSBncm91cGluZzogIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykgYWxsb3dzIHRoZSBiaXRzCisJCXRoYXQgZGVmaW5lIGVhY2ggaW50ZXJydXB0J3MgcHJpb3JpdHkgdG8gYmUgc3BsaXQgYmV0d2VlbiBiaXRzIHRoYXQKKwkJZGVmaW5lIHRoZSBpbnRlcnJ1cHQncyBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzIGFuZCBiaXRzIHRoYXQgZGVmaW5lCisJCXRoZSBpbnRlcnJ1cHQncyBzdWItcHJpb3JpdHkuICBGb3Igc2ltcGxpY2l0eSBhbGwgYml0cyBtdXN0IGJlIGRlZmluZWQKKwkJdG8gYmUgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cy4gIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZgorCQl0aGlzIGlzIG5vdCB0aGUgY2FzZSAoaWYgc29tZSBiaXRzIHJlcHJlc2VudCBhIHN1Yi1wcmlvcml0eSkuCisKKwkJSWYgdGhlIGFwcGxpY2F0aW9uIG9ubHkgdXNlcyBDTVNJUyBsaWJyYXJpZXMgZm9yIGludGVycnVwdAorCQljb25maWd1cmF0aW9uIHRoZW4gdGhlIGNvcnJlY3Qgc2V0dGluZyBjYW4gYmUgYWNoaWV2ZWQgb24gYWxsIENvcnRleC1NCisJCWRldmljZXMgYnkgY2FsbGluZyBOVklDX1NldFByaW9yaXR5R3JvdXBpbmcoIDAgKTsgYmVmb3JlIHN0YXJ0aW5nIHRoZQorCQlzY2hlZHVsZXIuICBOb3RlIGhvd2V2ZXIgdGhhdCBzb21lIHZlbmRvciBzcGVjaWZpYyBwZXJpcGhlcmFsIGxpYnJhcmllcworCQlhc3N1bWUgYSBub24temVybyBwcmlvcml0eSBncm91cCBzZXR0aW5nLCBpbiB3aGljaCBjYXNlcyB1c2luZyBhIHZhbHVlCisJCW9mIHplcm8gd2lsbCByZXN1bHQgaW4gdW5wcmVkaWN0YWJsZSBiZWhhdmlvdXIuICovCisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0QUlSQ1JfUkVHICYgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sgKSA8PSB1bE1heFBSSUdST1VQVmFsdWUgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000X01QVS9wb3J0YXNtLnMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRfTVBVL3BvcnRhc20ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQxMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000X01QVS9wb3J0YXNtLnMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMAorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiBJZiB5b3Ugd2lzaCB0byB1c2Ugb3VyIEFtYXpvbgorICogRnJlZVJUT1MgbmFtZSwgcGxlYXNlIGRvIHNvIGluIGEgZmFpciB1c2Ugd2F5IHRoYXQgZG9lcyBub3QgY2F1c2UgY29uZnVzaW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaW5jbHVkZSA8RnJlZVJUT1NDb25maWcuaD4KKworCVJTRUcgICAgQ09ERTpDT0RFKDIpCisJdGh1bWIKKworCUVYVEVSTiBweEN1cnJlbnRUQ0IKKwlFWFRFUk4gdlRhc2tTd2l0Y2hDb250ZXh0CisJRVhURVJOIHZQb3J0U1ZDSGFuZGxlcl9DCisKKwlQVUJMSUMgeFBvcnRQZW5kU1ZIYW5kbGVyCisJUFVCTElDIHZQb3J0U1ZDSGFuZGxlcgorCVBVQkxJQyB2UG9ydFN0YXJ0Rmlyc3RUYXNrCisJUFVCTElDIHZQb3J0RW5hYmxlVkZQCisJUFVCTElDIHZQb3J0UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzaworCVBVQkxJQyB4UG9ydFJhaXNlUHJpdmlsZWdlCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit4UG9ydFBlbmRTVkhhbmRsZXI6CisJbXJzIHIwLCBwc3AKKwlpc2IKKwkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IKKwlsZHIJcjIsIFtyM10KKworCS8qIElzIHRoZSB0YXNrIHVzaW5nIHRoZSBGUFUgY29udGV4dD8gIElmIHNvLCBwdXNoIGhpZ2ggdmZwIHJlZ2lzdGVycy4gKi8KKwl0c3QgcjE0LCAjMHgxMAorCWl0IGVxCisJdnN0bWRiZXEgcjAhLCB7czE2LXMzMX0KKworCS8qIFNhdmUgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLworCW1ycyByMSwgY29udHJvbAorCXN0bWRiIHIwISwge3IxLCByNC1yMTEsIHIxNH0KKworCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW50byB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBUQ0IuICovCisJc3RyIHIwLCBbcjJdCisKKwlzdG1kYiBzcCEsIHtyMCwgcjN9CisJbW92IHIwLCAjY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZCisJbXNyIGJhc2VwcmksIHIwCisJZHNiCisJaXNiCisJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CisJbW92IHIwLCAjMAorCW1zciBiYXNlcHJpLCByMAorCWxkbWlhIHNwISwge3IwLCByM30KKworCS8qIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJbGRyIHIxLCBbcjNdCisJbGRyIHIwLCBbcjFdCisJLyogTW92ZSBvbnRvIHRoZSBzZWNvbmQgaXRlbSBpbiB0aGUgVENCLi4uICovCisJYWRkIHIxLCByMSwgIzQKKwkvKiBSZWdpb24gQmFzZSBBZGRyZXNzIHJlZ2lzdGVyLiAqLworCWxkciByMiwgPTB4ZTAwMGVkOWMKKwkvKiBSZWFkIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIxISwge3I0LXIxMX0KKwkvKiBXcml0ZSA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwlzdG1pYSByMiEsIHtyNC1yMTF9CisJLyogUG9wIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgc2F2ZWQgb24gZXhjZXB0aW9uIGVudHJ5LiAqLworCWxkbWlhIHIwISwge3IzLXIxMSwgcjE0fQorCW1zciBjb250cm9sLCByMworCisJLyogSXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHBvcCB0aGUgaGlnaCB2ZnAgcmVnaXN0ZXJzCisJdG9vLiAqLworCXRzdCByMTQsICMweDEwCisJaXQgZXEKKwl2bGRtaWFlcSByMCEsIHtzMTYtczMxfQorCisJbXNyIHBzcCwgcjAKKwlpc2IKKworCWJ4IHIxNAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2UG9ydFNWQ0hhbmRsZXI6CisJI2lmbmRlZiBVU0VfUFJPQ0VTU19TVEFDSwkvKiBDb2RlIHNob3VsZCBub3QgYmUgcmVxdWlyZWQgaWYgYSBtYWluKCkgaXMgdXNpbmcgdGhlIHByb2Nlc3Mgc3RhY2suICovCisJCXRzdCBsciwgIzQKKwkJaXRlIGVxCisJCW1yc2VxIHIwLCBtc3AKKwkJbXJzbmUgcjAsIHBzcAorCSNlbHNlCisJCW1ycyByMCwgcHNwCisJI2VuZGlmCisJCWIgdlBvcnRTVkNIYW5kbGVyX0MKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0U3RhcnRGaXJzdFRhc2sKKwkvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJbGRyIHIwLCA9MHhFMDAwRUQwOAorCWxkciByMCwgW3IwXQorCWxkciByMCwgW3IwXQorCS8qIFNldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwltc3IgbXNwLCByMAorCS8qIENsZWFyIHRoZSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhlIEZQVSBpcyBpbiB1c2UgaW4gY2FzZSB0aGUgRlBVIHdhcyB1c2VkCisJYmVmb3JlIHRoZSBzY2hlZHVsZXIgd2FzIHN0YXJ0ZWQgLSB3aGljaCB3b3VsZCBvdGhlcndpc2UgcmVzdWx0IGluIHRoZQorCXVubmVjZXNzYXJ5IGxlYXZpbmcgb2Ygc3BhY2UgaW4gdGhlIFNWQyBzdGFjayBmb3IgbGF6eSBzYXZpbmcgb2YgRlBVCisJcmVnaXN0ZXJzLiAqLworCW1vdiByMCwgIzAKKwltc3IgY29udHJvbCwgcjAKKwkvKiBDYWxsIFNWQyB0byBzdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwljcHNpZSBpCisJY3BzaWUgZgorCWRzYgorCWlzYgorCXN2YyAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2UG9ydFJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2sKKwkvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJbGRyIHIwLCA9MHhFMDAwRUQwOAorCWxkciByMCwgW3IwXQorCWxkciByMCwgW3IwXQorCS8qIFNldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwltc3IgbXNwLCByMAorCS8qIFJlc3RvcmUgdGhlIGNvbnRleHQuICovCisJbGRyCXIzLCA9cHhDdXJyZW50VENCCisJbGRyIHIxLCBbcjNdCisJLyogVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJbGRyIHIwLCBbcjFdCisJLyogTW92ZSBvbnRvIHRoZSBzZWNvbmQgaXRlbSBpbiB0aGUgVENCLi4uICovCisJYWRkIHIxLCByMSwgIzQKKwkvKiBSZWdpb24gQmFzZSBBZGRyZXNzIHJlZ2lzdGVyLiAqLworCWxkciByMiwgPTB4ZTAwMGVkOWMKKwkvKiBSZWFkIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIxISwge3I0LXIxMX0KKwkvKiBXcml0ZSA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwlzdG1pYSByMiEsIHtyNC1yMTF9CisJLyogUG9wIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgc2F2ZWQgb24gZXhjZXB0aW9uIGVudHJ5LiAqLworCWxkbWlhIHIwISwge3IzLXIxMSwgcjE0fQorCW1zciBjb250cm9sLCByMworCS8qIFJlc3RvcmUgdGhlIHRhc2sgc3RhY2sgcG9pbnRlci4gKi8KKwltc3IgcHNwLCByMAorCW1vdiByMCwgIzAKKwltc3IJYmFzZXByaSwgcjAKKwlieCByMTQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0RW5hYmxlVkZQCisJLyogVGhlIEZQVSBlbmFibGUgYml0cyBhcmUgaW4gdGhlIENQQUNSLiAqLworCWxkci53IHIwLCA9MHhFMDAwRUQ4OAorCWxkcglyMSwgW3IwXQorCisJLyogRW5hYmxlIENQMTAgYW5kIENQMTEgY29wcm9jZXNzb3JzLCB0aGVuIHNhdmUgYmFjay4gKi8KKwlvcnIJcjEsIHIxLCAjKCAweGYgPDwgMjAgKQorCXN0ciByMSwgW3IwXQorCWJ4CXIxNAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworeFBvcnRSYWlzZVByaXZpbGVnZQorCW1ycyByMCwgY29udHJvbAorCS8qIElzIHRoZSB0YXNrIHJ1bm5pbmcgcHJpdmlsZWdlZD8gKi8KKwl0c3QgcjAsICMxCisJaXR0ZSBuZQorCS8qIENPTlRST0xbMF0hPTAsIHJldHVybiBmYWxzZS4gKi8KKwltb3ZuZSByMCwgIzAKKwkvKiBTd2l0Y2ggdG8gcHJpdmlsZWdlZC4gKi8KKwlzdmNuZSAyCS8qIDIgPT0gcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UgKi8KKwkvKiBDT05UUk9MWzBdPT0wLCByZXR1cm4gdHJ1ZS4gKi8KKwltb3ZlcSByMCwgIzEKKwlieCBscgorCisKKwlFTkQKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000X01QVS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWM4YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMAorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiBJZiB5b3Ugd2lzaCB0byB1c2Ugb3VyIEFtYXpvbgorICogRnJlZVJUT1MgbmFtZSwgcGxlYXNlIGRvIHNvIGluIGEgZmFpciB1c2Ugd2F5IHRoYXQgZG9lcyBub3QgY2F1c2UgY29uZnVzaW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBJQVIgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8aW50cmluc2ljcy5oPgorCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1QVSBzcGVjaWZpYyBjb25zdGFudHMuICovCisjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMJCTEKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkoIDB4ODAwMDAwMDBVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURQkJCQkoIDB4MDNVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkJCSggMHgwNVVMIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkJCQkJKCAweDA2VUwgPDwgMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURQkoIDB4MDFVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUJCSggMHgwN1VMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSCQkJKCAweDAxVUwgPDwgMjhVTCApCisKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkoIDBVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJCQkoIDFVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT04JCQkJKCAyVUwgKQorI2RlZmluZSBwb3J0R0VORVJBTF9QRVJJUEhFUkFMU19SRUdJT04JCQkoIDNVTCApCisjZGVmaW5lIHBvcnRTVEFDS19SRUdJT04JCQkJCQkoIDRVTCApCisjZGVmaW5lIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJKCA1VUwgKQorI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJKCA3VUwgKQorI2RlZmluZSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TCQkJKCAoIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04gLSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTiApICsgMSApCisjZGVmaW5lIHBvcnRUT1RBTF9OVU1fUkVHSU9OUwkJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCisKKyNkZWZpbmUgcG9ydFNXSVRDSF9UT19VU0VSX01PREUoKSBfX2FzbSB2b2xhdGlsZSAoICIgbXJzIHIwLCBjb250cm9sIFxuIG9yciByMCwgcjAsICMxIFxuIG1zciBjb250cm9sLCByMCAiIDo6OiAicjAiLCAibWVtb3J5IiApCisKK3R5cGVkZWYgc3RydWN0IE1QVV9SRUdJT05fUkVHSVNURVJTCit7CisJdWludDMyX3QgdWxSZWdpb25CYXNlQWRkcmVzczsKKwl1aW50MzJfdCB1bFJlZ2lvbkF0dHJpYnV0ZTsKK30geE1QVV9SRUdJT05fUkVHSVNURVJTOworCisvKiBQbHVzIDEgdG8gY3JlYXRlIHNwYWNlIGZvciB0aGUgc3RhY2sgcmVnaW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgTVBVX1NFVFRJTkdTCit7CisJeE1QVV9SRUdJT05fUkVHSVNURVJTIHhSZWdpb25bIHBvcnRUT1RBTF9OVU1fUkVHSU9OUyBdOworfSB4TVBVX1NFVFRJTkdTOworCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNWQyBudW1iZXJzIGZvciB2YXJpb3VzIHNlcnZpY2VzLiAqLworI2RlZmluZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgkJCQkwCisjZGVmaW5lIHBvcnRTVkNfWUlFTEQJCQkJCQkxCisjZGVmaW5lIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCQkJCTIKKworLyogU2NoZWR1bGVyIHV0aWxpdGllcy4gKi8KKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJX19hc20gdm9sYXRpbGUgKCAiCVNWQwklMAlcbiIgOjogImkiIChwb3J0U1ZDX1lJRUxEKSA6ICJtZW1vcnkiICkKKyNkZWZpbmUgcG9ydFlJRUxEX1dJVEhJTl9BUEkoKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCVwKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLwkJCVwKKwlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOwkJCVwKKwlfX0RTQigpOwkJCQkJCQkJCQkJCVwKKwlfX0lTQigpOwkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVF9CSVQJCSggMVVMIDw8IDI4VUwgKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApIGlmKCB4U3dpdGNoUmVxdWlyZWQgIT0gcGRGQUxTRSApIHBvcnRZSUVMRF9XSVRISU5fQVBJKCkKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBvcHRpbWlzYXRpb25zLiAqLworI2lmbmRlZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04KKwkjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAxCisjZW5kaWYKKworI2lmKCBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gPT0gMSApCisKKwkvKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KKwkjaWYoIGNvbmZpZ01BWF9QUklPUklUSUVTID4gMzIgKQorCQkjZXJyb3IgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIGNhbiBvbmx5IGJlIHNldCB0byAxIHdoZW4gY29uZmlnTUFYX1BSSU9SSVRJRVMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLiAgSXQgaXMgdmVyeSByYXJlIHRoYXQgYSBzeXN0ZW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEwIHRvIDE1IGRpZmZlcmVuY2UgcHJpb3JpdGllcyBhcyB0YXNrcyB0aGF0IHNoYXJlIGEgcHJpb3JpdHkgd2lsbCB0aW1lIHNsaWNlLgorCSNlbmRpZgorCisJLyogU3RvcmUvY2xlYXIgdGhlIHJlYWR5IHByaW9yaXRpZXMgaW4gYSBiaXQgbWFwLiAqLworCSNkZWZpbmUgcG9ydFJFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgfD0gKCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCSNkZWZpbmUgcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSAmPSB+KCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkjZGVmaW5lIHBvcnRHRVRfSElHSEVTVF9QUklPUklUWSggdXhUb3BQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSB1eFRvcFByaW9yaXR5ID0gKCAzMVVMIC0gKCAoIHVpbnQzMl90ICkgX19DTFooICggdXhSZWFkeVByaW9yaXRpZXMgKSApICkgKQorCisjZW5kaWYgLyogY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LiAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApOworCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJXAorCV9fc2V0X0JBU0VQUkkoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOwlcCisJX19EU0IoKTsJCQkJCQkJCQkJCQlcCisJX19JU0IoKTsJCQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCkJCQkJCV9fc2V0X0JBU0VQUkkoIDAgKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpCQlfX2dldF9CQVNFUFJJKCk7IHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJX19zZXRfQkFTRVBSSSggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGFzayBmdW5jdGlvbiBtYWNyb3MgYXMgZGVzY3JpYmVkIG9uIHRoZSBGcmVlUlRPUy5vcmcgV0VCIHNpdGUuICBUaGVzZSBhcmUKK25vdCBuZWNlc3NhcnkgZm9yIHRvIHVzZSB0aGlzIHBvcnQuICBUaGV5IGFyZSBkZWZpbmVkIHNvIHRoZSBjb21tb24gZGVtbyBmaWxlcworKHdoaWNoIGJ1aWxkIHdpdGggYWxsIHRoZSBwb3J0cykgd2lsbCBidWlsZC4gKi8KKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBjb25maWdBU1NFUlQKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApOworCSNkZWZpbmUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIAl2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoKQorI2VuZGlmCisKKy8qIHBvcnROT1AoKSBpcyBub3QgcmVxdWlyZWQgYnkgdGhpcyBwb3J0LiAqLworI2RlZmluZSBwb3J0Tk9QKCkKKworCisvKiBTZXQgdGhlIHByaXZpbGVnZSBsZXZlbCB0byB1c2VyIG1vZGUgaWYgeFJ1bm5pbmdQcml2aWxlZ2VkIGlzIGZhbHNlLiAqLwordm9pZCB2UG9ydFJlc2V0UHJpdmlsZWdlKCBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3VwcHJlc3Mgd2FybmluZ3MgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBJQVIgdG9vbHMsIGJ1dCBjYW5ub3QgYmUgZml4ZWQgaW4KK3RoZSBzb3VyY2UgY29kZSBiZWNhdXNlIHRvIGRvIHNvIHdvdWxkIGNhdXNlIG90aGVyIGNvbXBpbGVycyB0byBnZW5lcmF0ZQord2FybmluZ3MuICovCisjcHJhZ21hIGRpYWdfc3VwcHJlc3M9UGUxOTEKKyNwcmFnbWEgZGlhZ19zdXBwcmVzcz1QYTA4MgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogUE9SVE1BQ1JPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003L1JlYWRNZS50eHQgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTcvUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWNiZTgxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003L1JlYWRNZS50eHQKQEAgLTAsMCArMSwxOCBAQAorVGhlcmUgYXJlIHR3byBvcHRpb25zIGZvciBydW5uaW5nIEZyZWVSVE9TIG9uIEFSTSBDb3J0ZXgtTTcgbWljcm9jb250cm9sbGVycy4KK1RoZSBiZXN0IG9wdGlvbiBkZXBlbmRzIG9uIHRoZSByZXZpc2lvbiBvZiB0aGUgQVJNIENvcnRleC1NNyBjb3JlIGluIHVzZS4gIFRoZQorcmV2aXNpb24gaXMgc3BlY2lmaWVkIGJ5IGFuICdyJyBudW1iZXIsIGFuZCBhICdwJyBudW1iZXIsIHNvIHdpbGwgbG9vayBzb21ldGhpbmcKK2xpa2UgJ3IwcDEnLiAgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBtaWNyb2NvbnRyb2xsZXIgaW4gdXNlIHRvIGZpbmQgdGhlIAorcmV2aXNpb24gb2YgdGhlIENvcnRleC1NNyBjb3JlIHVzZWQgaW4gdGhhdCBtaWNyb2NvbnRyb2xsZXIuICBJZiBpbiBkb3VidCwgdXNlIAordGhlIEZyZWVSVE9TIHBvcnQgcHJvdmlkZWQgc3BlY2lmaWNhbGx5IGZvciByMHAxIHJldmlzaW9ucywgYXMgdGhhdCBjYW4gYmUgdXNlZAord2l0aCBhbGwgY29yZSByZXZpc2lvbnMuCisKK1RoZSBmaXJzdCBvcHRpb24gaXMgdG8gdXNlIHRoZSBBUk0gQ29ydGV4LU00RiBwb3J0LCBhbmQgdGhlIHNlY29uZCBvcHRpb24gaXMgdG8KK3VzZSB0aGUgQ29ydGV4LU03IHIwcDEgcG9ydCAtIHRoZSBsYXR0ZXIgY29udGFpbmluZyBhIG1pbm9yIGVycmF0YSB3b3JrYXJvdW5kLgorCitJZiB0aGUgcmV2aXNpb24gb2YgdGhlIEFSTSBDb3J0ZXgtTTcgY29yZSBpcyBub3QgcjBwMSB0aGVuIGVpdGhlciBvcHRpb24gY2FuIGJlCit1c2VkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBGcmVlUlRPUyBBUk0gQ29ydGV4LU00RiBwb3J0IGxvY2F0ZWQgaW4gCit0aGUgL0ZyZWVSVE9TL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNEYgZGlyZWN0b3J5LgorCitJZiB0aGUgcmV2aXNpb24gb2YgdGhlIEFSTSBDb3J0ZXgtTTcgY29yZSBpcyByMHAxIHRoZW4gdXNlIHRoZSBGcmVlUlRPUyBBUk0KK0NvcnRleC1NNyByMHAxIHBvcnQgbG9jYXRlZCBpbiB0aGUgL0ZyZWVSVE9TL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNy9yMHAxCitkaXJlY3RvcnkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003L3IwcDEvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003L3IwcDEvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlODQ2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTcvcjBwMS9wb3J0LmMKQEAgLTAsMCArMSw2NDQgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiBwb3J0YWJsZS5oIGZvciB0aGUgQVJNIENNNEYgcG9ydC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIElBUiBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlIDxpbnRyaW5zaWNzLmg+CisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworI2lmbmRlZiBfX0FSTVZGUF9fCisJI2Vycm9yIFRoaXMgcG9ydCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIHByb2plY3Qgb3B0aW9ucyBhcmUgY29uZmlndXJlZCB0byBlbmFibGUgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydC4KKyNlbmRpZgorCisjaWYoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSA9PSAwICkKKwkjZXJyb3IgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLiAgU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFoKKwkjZGVmaW5lIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogY29uZmlnQ1BVX0NMT0NLX0haCisJLyogRW5zdXJlIHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgYXQgdGhlIHNhbWUgZnJlcXVlbmN5IGFzIHRoZSBjb3JlLiAqLworCSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEtfQklUCSggMVVMIDw8IDJVTCApCisjZWxzZQorCS8qIFRoZSB3YXkgdGhlIFN5c1RpY2sgaXMgY2xvY2tlZCBpcyBub3QgbW9kaWZpZWQgaW4gY2FzZSBpdCBpcyBub3QgdGhlIHNhbWUKKwlhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDAgKQorI2VuZGlmCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBjb3JlLiAgUmVnaXN0ZXJzIGZpcnN0Li4uICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRwkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkgKQorLyogLi4udGhlbiBiaXRzIGluIHRoZSByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVAkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVAkJCSggMVVMIDw8IDBVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQJCSggMVVMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZDTEVBUl9CSVQgCQkJKCAxVUwgPDwgMjdVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRfU1lTVElDS19DTEVBUl9CSVQJCSggMVVMIDw8IDI1VUwgKQorCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVl9QUkkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAyNFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBhbiBpbnRlcnJ1cHQgcHJpb3JpdHkuICovCisjZGVmaW5lIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIJCSggMTYgKQorI2RlZmluZSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2IAkoIDB4RTAwMEUzRjAgKQorI2RlZmluZSBwb3J0QUlSQ1JfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhFMDAwRUQwQyApICkKKyNkZWZpbmUgcG9ydE1BWF84X0JJVF9WQUxVRQkJCQkJKCAoIHVpbnQ4X3QgKSAweGZmICkKKyNkZWZpbmUgcG9ydFRPUF9CSVRfT0ZfQllURQkJCQkJKCAoIHVpbnQ4X3QgKSAweDgwICkKKyNkZWZpbmUgcG9ydE1BWF9QUklHUk9VUF9CSVRTCQkJCSggKCB1aW50OF90ICkgNyApCisjZGVmaW5lIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLCQkJCSggMHgwN1VMIDw8IDhVTCApCisjZGVmaW5lIHBvcnRQUklHUk9VUF9TSElGVAkJCQkJKCA4VUwgKQorCisvKiBNYXNrcyBvZmYgYWxsIGJpdHMgYnV0IHRoZSBWRUNUQUNUSVZFIGJpdHMgaW4gdGhlIElDU1IgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRWRUNUQUNUSVZFX01BU0sJCQkJCSggMHhGRlVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIFZGUC4gKi8KKyNkZWZpbmUgcG9ydEZQQ0NSCQkJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWYzNCApIC8qIEZsb2F0aW5nIHBvaW50IGNvbnRleHQgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydEFTUEVOX0FORF9MU1BFTl9CSVRTCQkJKCAweDNVTCA8PCAzMFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBzdGFjay4gKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJKCAweDAxMDAwMDAwICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCQkoIDB4ZmZmZmZmZmQgKQorCisvKiBUaGUgc3lzdGljayBpcyBhIDI0LWJpdCBjb3VudGVyLiAqLworI2RlZmluZSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIJCQkJKCAweGZmZmZmZlVMICkKKworLyogQSBmaWRkbGUgZmFjdG9yIHRvIGVzdGltYXRlIHRoZSBudW1iZXIgb2YgU3lzVGljayBjb3VudHMgdGhhdCB3b3VsZCBoYXZlCitvY2N1cnJlZCB3aGlsZSB0aGUgU3lzVGljayBjb3VudGVyIGlzIHN0b3BwZWQgZHVyaW5nIHRpY2tsZXNzIGlkbGUKK2NhbGN1bGF0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SCQkJKCA0NVVMICkKKworLyogRm9yIHN0cmljdCBjb21wbGlhbmNlIHdpdGggdGhlIENvcnRleC1NIHNwZWMgdGhlIHRhc2sgc3RhcnQgYWRkcmVzcyBzaG91bGQKK2hhdmUgYml0LTAgY2xlYXIsIGFzIGl0IGlzIGxvYWRlZCBpbnRvIHRoZSBQQyBvbiBleGl0IGZyb20gYW4gSVNSLiAqLworI2RlZmluZSBwb3J0U1RBUlRfQUREUkVTU19NQVNLCQkJCSggKCBTdGFja1R5cGVfdCApIDB4ZmZmZmZmZmVVTCApCisKKy8qCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzCisgKiBmaWxlIGlzIHdlYWsgdG8gYWxsb3cgYXBwbGljYXRpb24gd3JpdGVycyB0byBjaGFuZ2UgdGhlIHRpbWVyIHVzZWQgdG8KKyAqIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdC4KKyAqLwordm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKTsKKworLyoKKyAqIEV4Y2VwdGlvbiBoYW5kbGVycy4KKyAqLwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICk7CisKKy8qCisgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0U3RhcnRGaXJzdFRhc2soIHZvaWQgKTsKKworLyoKKyAqIFR1cm4gdGhlIFZGUCBvbi4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbmFibGVWRlAoIHZvaWQgKTsKKworLyoKKyAqIFVzZWQgdG8gY2F0Y2ggdGFza3MgdGhhdCBhdHRlbXB0IHRvIHJldHVybiBmcm9tIHRoZWlyIGltcGxlbWVudGluZyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKK3ZhcmlhYmxlLiAqLworc3RhdGljIFVCYXNlVHlwZV90IHV4Q3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYTsKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgU3lzVGljayBpbmNyZW1lbnRzIHRoYXQgbWFrZSB1cCBvbmUgdGljayBwZXJpb2QuCisgKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJc3RhdGljIHVpbnQzMl90IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpY2sgcGVyaW9kcyB0aGF0IGNhbiBiZSBzdXBwcmVzc2VkIGlzIGxpbWl0ZWQgYnkgdGhlCisgKiAyNCBiaXQgcmVzb2x1dGlvbiBvZiB0aGUgU3lzVGljayB0aW1lci4KKyAqLworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwlzdGF0aWMgdWludDMyX3QgeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIENvbXBlbnNhdGUgZm9yIHRoZSBDUFUgY3ljbGVzIHRoYXQgcGFzcyB3aGlsZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIChsb3cKKyAqIHBvd2VyIGZ1bmN0aW9uYWxpdHkgb25seS4KKyAqLworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwlzdGF0aWMgdWludDMyX3QgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBVc2VkIGJ5IHRoZSBwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCkgbWFjcm8gdG8gZW5zdXJlCisgKiBGcmVlUlRPUyBBUEkgZnVuY3Rpb25zIGFyZSBub3QgY2FsbGVkIGZyb20gaW50ZXJydXB0cyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZAorICogYSBwcmlvcml0eSBhYm92ZSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisgKi8KKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJIHN0YXRpYyB1aW50OF90IHVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gMDsKKwkgc3RhdGljIHVpbnQzMl90IHVsTWF4UFJJR1JPVVBWYWx1ZSA9IDA7CisJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggY29uc3Qgdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0ICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK1N0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkKK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJaW50ZXJydXB0LiAqLworCisJLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0CisJb2YgaW50ZXJydXB0cywgYW5kIHRvIGVuc3VyZSBhbGlnbm1lbnQuICovCisJcHhUb3BPZlN0YWNrLS07CisKKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJLyogeFBTUiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoICggU3RhY2tUeXBlX3QgKSBweENvZGUgKSAmIHBvcnRTVEFSVF9BRERSRVNTX01BU0s7CS8qIFBDICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwcnZUYXNrRXhpdEVycm9yOwkvKiBMUiAqLworCisJLyogU2F2ZSBjb2RlIHNwYWNlIGJ5IHNraXBwaW5nIHJlZ2lzdGVyIGluaXRpYWxpc2F0aW9uLiAqLworCXB4VG9wT2ZTdGFjayAtPSA1OwkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CS8qIFIwICovCisKKwkvKiBBIHNhdmUgbWV0aG9kIGlzIGJlaW5nIHVzZWQgdGhhdCByZXF1aXJlcyBlYWNoIHRhc2sgdG8gbWFpbnRhaW4gaXRzCisJb3duIGV4ZWMgcmV0dXJuIHZhbHVlLiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCisJcHhUb3BPZlN0YWNrIC09IDg7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCWl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uICBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCXNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4KKworCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQoKSB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMKKwlkZWZpbmVkLCB0aGVuIHN0b3AgaGVyZSBzbyBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCWZvciggOzsgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgbXVzdCBub3QgYmUgc2V0IHRvIDAuCisJU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwljb25maWdBU1NFUlQoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOworCisJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwl7CisJCXZvbGF0aWxlIHVpbnQzMl90IHVsT3JpZ2luYWxQcmlvcml0eTsKKwkJdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSAoIHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCApICggcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiArIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKTsKKwkJdm9sYXRpbGUgdWludDhfdCB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHByaW9yaXR5IGZyb20gd2hpY2ggSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCWZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiAgSVNSIHNhZmUgZnVuY3Rpb25zIGFyZSB0aG9zZSB0aGF0IGVuZCBpbgorCQkiRnJvbUlTUiIuICBGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0bworCQllbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQlTYXZlIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkgdmFsdWUgdGhhdCBpcyBhYm91dCB0byBiZSBjbG9iYmVyZWQuICovCisJCXVsT3JpZ2luYWxQcmlvcml0eSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYXZhaWxhYmxlLiAgRmlyc3Qgd3JpdGUgdG8gYWxsCisJCXBvc3NpYmxlIGJpdHMuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gcG9ydE1BWF84X0JJVF9WQUxVRTsKKworCQkvKiBSZWFkIHRoZSB2YWx1ZSBiYWNrIHRvIHNlZSBob3cgbWFueSBiaXRzIHN0dWNrLiAqLworCQl1Y01heFByaW9yaXR5VmFsdWUgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCSNpZmRlZiBfX05WSUNfUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBDTVNJUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IF9fTlZJQ19QUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkjaWZkZWYgY29uZmlnUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBGcmVlUlRPUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IGNvbmZpZ1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIEVuc3VyZSB0aGUgVkZQIGlzIGVuYWJsZWQgLSBpdCBzaG91bGQgYmUgYW55d2F5LiAqLworCXZQb3J0RW5hYmxlVkZQKCk7CisKKwkvKiBMYXp5IHNhdmUgYWx3YXlzLiAqLworCSooIHBvcnRGUENDUiApIHw9IHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUzsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCXZQb3J0U3RhcnRGaXJzdFRhc2soKTsKKworCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUhICovCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApCit7CisJLyogTm90IGltcGxlbWVudGVkIGluIHBvcnRzIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLgorCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxMDAwVUwgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApCit7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXV4Q3JpdGljYWxOZXN0aW5nKys7CisKKwkvKiBUaGlzIGlzIG5vdCB0aGUgaW50ZXJydXB0IHNhZmUgdmVyc2lvbiBvZiB0aGUgZW50ZXIgY3JpdGljYWwgZnVuY3Rpb24gc28KKwlhc3NlcnQoKSBpZiBpdCBpcyBiZWluZyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dC4gIE9ubHkgQVBJCisJZnVuY3Rpb25zIHRoYXQgZW5kIGluICJGcm9tSVNSIiBjYW4gYmUgdXNlZCBpbiBhbiBpbnRlcnJ1cHQuICBPbmx5IGFzc2VydCBpZgorCXRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IGlzIDEgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlY3Vyc2l2ZSBjYWxscyBpZiB0aGUKKwlhc3NlcnQgZnVuY3Rpb24gYWxzbyB1c2VzIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwlpZiggdXhDcml0aWNhbE5lc3RpbmcgPT0gMSApCisJeworCQljb25maWdBU1NFUlQoICggcG9ydE5WSUNfSU5UX0NUUkxfUkVHICYgcG9ydFZFQ1RBQ1RJVkVfTUFTSyApID09IDAgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApCit7CisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyApOworCXV4Q3JpdGljYWxOZXN0aW5nLS07CisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDAgKQorCXsKKwkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApCit7CisJLyogVGhlIFN5c1RpY2sgcnVucyBhdCB0aGUgbG93ZXN0IGludGVycnVwdCBwcmlvcml0eSwgc28gd2hlbiB0aGlzIGludGVycnVwdAorCWV4ZWN1dGVzIGFsbCBpbnRlcnJ1cHRzIG11c3QgYmUgdW5tYXNrZWQuICBUaGVyZSBpcyB0aGVyZWZvcmUgbm8gbmVlZCB0bworCXNhdmUgYW5kIHRoZW4gcmVzdG9yZSB0aGUgaW50ZXJydXB0IG1hc2sgdmFsdWUgYXMgaXRzIHZhbHVlIGlzIGFscmVhZHkKKwlrbm93bi4gKi8KKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBBIGNvbnRleHQgc3dpdGNoIGlzIHJlcXVpcmVkLiAgQ29udGV4dCBzd2l0Y2hpbmcgaXMgcGVyZm9ybWVkIGluCisJCQl0aGUgUGVuZFNWIGludGVycnVwdC4gIFBlbmQgdGhlIFBlbmRTViBpbnRlcnJ1cHQuICovCisJCQlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQl9CisJfQorCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisKKwlfX3dlYWsgdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApCisJeworCXVpbnQzMl90IHVsUmVsb2FkVmFsdWUsIHVsQ29tcGxldGVUaWNrUGVyaW9kcywgdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50czsKKwlUaWNrVHlwZV90IHhNb2RpZmlhYmxlSWRsZVRpbWU7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBTeXNUaWNrIHJlbG9hZCB2YWx1ZSBkb2VzIG5vdCBvdmVyZmxvdyB0aGUgY291bnRlci4gKi8KKwkJaWYoIHhFeHBlY3RlZElkbGVUaW1lID4geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyApCisJCXsKKwkJCXhFeHBlY3RlZElkbGVUaW1lID0geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrczsKKwkJfQorCisJCS8qIFN0b3AgdGhlIFN5c1RpY2sgbW9tZW50YXJpbHkuICBUaGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvcgorCQlpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIGJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbAorCQlpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkgZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUKKwkJa2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhciB0aW1lLiAqLworCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHICY9IH5wb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSByZWxvYWQgdmFsdWUgcmVxdWlyZWQgdG8gd2FpdCB4RXhwZWN0ZWRJZGxlVGltZQorCQl0aWNrIHBlcmlvZHMuICAtMSBpcyB1c2VkIGJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgZXhlY3V0ZSBwYXJ0IHdheQorCQl0aHJvdWdoIG9uZSBvZiB0aGUgdGljayBwZXJpb2RzLiAqLworCQl1bFJlbG9hZFZhbHVlID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyArICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKiAoIHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMICkgKTsKKwkJaWYoIHVsUmVsb2FkVmFsdWUgPiB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApCisJCXsKKwkJCXVsUmVsb2FkVmFsdWUgLT0gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb247CisJCX0KKworCQkvKiBFbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYnV0IGRvbid0IHVzZSB0aGUgdGFza0VOVEVSX0NSSVRJQ0FMKCkKKwkJbWV0aG9kIGFzIHRoYXQgd2lsbCBtYXNrIGludGVycnVwdHMgdGhhdCBzaG91bGQgZXhpdCBzbGVlcCBtb2RlLiAqLworCQlfX2Rpc2FibGVfaW50ZXJydXB0KCk7CisJCV9fRFNCKCk7CisJCV9fSVNCKCk7CisKKwkJLyogSWYgYSBjb250ZXh0IHN3aXRjaCBpcyBwZW5kaW5nIG9yIGEgdGFzayBpcyB3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGVyCisJCXRvIGJlIHVuc3VzcGVuZGVkIHRoZW4gYWJhbmRvbiB0aGUgbG93IHBvd2VyIGVudHJ5LiAqLworCQlpZiggZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgPT0gZUFib3J0U2xlZXAgKQorCQl7CisJCQkvKiBSZXN0YXJ0IGZyb20gd2hhdGV2ZXIgaXMgbGVmdCBpbiB0aGUgY291bnQgcmVnaXN0ZXIgdG8gY29tcGxldGUKKwkJCXRoaXMgdGljayBwZXJpb2QuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFJlc2V0IHRoZSByZWxvYWQgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciBub3JtYWwgdGljaworCQkJcGVyaW9kcy4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgLSBzZWUgY29tbWVudHMgYWJvdmUgX19kaXNhYmxlX2ludGVycnVwdCgpCisJCQljYWxsIGFib3ZlLiAqLworCQkJX19lbmFibGVfaW50ZXJydXB0KCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTZXQgdGhlIG5ldyByZWxvYWQgdmFsdWUuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxSZWxvYWRWYWx1ZTsKKworCQkJLyogQ2xlYXIgdGhlIFN5c1RpY2sgY291bnQgZmxhZyBhbmQgc2V0IHRoZSBjb3VudCB2YWx1ZSBiYWNrIHRvCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFNsZWVwIHVudGlsIHNvbWV0aGluZyBoYXBwZW5zLiAgY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoKSBjYW4KKwkJCXNldCBpdHMgcGFyYW1ldGVyIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCBpdHMgaW1wbGVtZW50YXRpb24gY29udGFpbnMKKwkJCWl0cyBvd24gd2FpdCBmb3IgaW50ZXJydXB0IG9yIHdhaXQgZm9yIGV2ZW50IGluc3RydWN0aW9uLCBhbmQgc28gd2ZpCisJCQlzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGFnYWluLiAgSG93ZXZlciwgdGhlIG9yaWdpbmFsIGV4cGVjdGVkIGlkbGUKKwkJCXRpbWUgdmFyaWFibGUgbXVzdCByZW1haW4gdW5tb2RpZmllZCwgc28gYSBjb3B5IGlzIHRha2VuLiAqLworCQkJeE1vZGlmaWFibGVJZGxlVGltZSA9IHhFeHBlY3RlZElkbGVUaW1lOworCQkJY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoICZ4TW9kaWZpYWJsZUlkbGVUaW1lICk7CisJCQlpZiggeE1vZGlmaWFibGVJZGxlVGltZSA+IDAgKQorCQkJeworCQkJCV9fRFNCKCk7CisJCQkJX19XRkkoKTsKKwkJCQlfX0lTQigpOworCQkJfQorCQkJY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HKCAmeEV4cGVjdGVkSWRsZVRpbWUgKTsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgdG8gYWxsb3cgdGhlIGludGVycnVwdCB0aGF0IGJyb3VnaHQgdGhlIE1DVQorCQkJb3V0IG9mIHNsZWVwIG1vZGUgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseS4gIHNlZSBjb21tZW50cyBhYm92ZQorCQkJX19kaXNhYmxlX2ludGVycnVwdCgpIGNhbGwgYWJvdmUuICovCisJCQlfX2VuYWJsZV9pbnRlcnJ1cHQoKTsKKwkJCV9fRFNCKCk7CisJCQlfX0lTQigpOworCisJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgYWdhaW4gYmVjYXVzZSB0aGUgY2xvY2sgaXMgYWJvdXQgdG8gYmUgc3RvcHBlZAorCQkJYW5kIGludGVycnVwdHMgdGhhdCBleGVjdXRlIHdoaWxlIHRoZSBjbG9jayBpcyBzdG9wcGVkIHdpbGwgaW5jcmVhc2UKKwkJCWFueSBzbGlwcGFnZSBiZXR3ZWVuIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlIFJUT1MgYW5kIGNhbGVuZGFyCisJCQl0aW1lLiAqLworCQkJX19kaXNhYmxlX2ludGVycnVwdCgpOworCQkJX19EU0IoKTsKKwkJCV9fSVNCKCk7CisJCQkKKwkJCS8qIERpc2FibGUgdGhlIFN5c1RpY2sgY2xvY2sgd2l0aG91dCByZWFkaW5nIHRoZSAKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgcmVnaXN0ZXIgdG8gZW5zdXJlIHRoZQorCQkJcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVCBpcyBub3QgY2xlYXJlZCBpZiBpdCBpcyBzZXQuICBBZ2FpbiwgCisJCQl0aGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvciBpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIAorCQkJYmUsIGJ1dCB1c2luZyB0aGUgdGlja2xlc3MgbW9kZSB3aWxsIGluZXZpdGFibHkgcmVzdWx0IGluIHNvbWUgdGlueSAKKwkJCWRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlIGtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgCisJCQl0aW1lKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCApOworCisJCQkvKiBEZXRlcm1pbmUgaWYgdGhlIFN5c1RpY2sgY2xvY2sgaGFzIGFscmVhZHkgY291bnRlZCB0byB6ZXJvIGFuZAorCQkJYmVlbiBzZXQgYmFjayB0byB0aGUgY3VycmVudCByZWxvYWQgdmFsdWUgKHRoZSByZWxvYWQgYmFjayBiZWluZworCQkJY29ycmVjdCBmb3IgdGhlIGVudGlyZSBleHBlY3RlZCBpZGxlIHRpbWUpIG9yIGlmIHRoZSBTeXNUaWNrIGlzIHlldAorCQkJdG8gY291bnQgdG8gemVybyAoaW4gd2hpY2ggY2FzZSBhbiBpbnRlcnJ1cHQgb3RoZXIgdGhhbiB0aGUgU3lzVGljaworCQkJbXVzdCBoYXZlIGJyb3VnaHQgdGhlIHN5c3RlbSBvdXQgb2Ygc2xlZXAgbW9kZSkuICovCisJCQlpZiggKCBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHICYgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVCApICE9IDAgKQorCQkJeworCQkJCXVpbnQzMl90IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBpcyBhbHJlYWR5IHBlbmRpbmcsIGFuZCB0aGUgU3lzVGljayBjb3VudAorCQkJCXJlbG9hZGVkIHdpdGggdWxSZWxvYWRWYWx1ZS4gIFJlc2V0IHRoZQorCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgd2l0aCB3aGF0ZXZlciByZW1haW5zIG9mIHRoaXMgdGljaworCQkJCXBlcmlvZC4gKi8KKwkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICkgLSAoIHVsUmVsb2FkVmFsdWUgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHICk7CisKKwkJCQkvKiBEb24ndCBhbGxvdyBhIHRpbnkgdmFsdWUsIG9yIHZhbHVlcyB0aGF0IGhhdmUgc29tZWhvdworCQkJCXVuZGVyZmxvd2VkIGJlY2F1c2UgdGhlIHBvc3Qgc2xlZXAgaG9vayBkaWQgc29tZXRoaW5nCisJCQkJdGhhdCB0b29rIHRvbyBsb25nLiAqLworCQkJCWlmKCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA8IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uICkgfHwgKCB1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApICkKKwkJCQl7CisJCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKTsKKwkJCQl9CisKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogQXMgdGhlIHBlbmRpbmcgdGljayB3aWxsIGJlIHByb2Nlc3NlZCBhcyBzb29uIGFzIHRoaXMKKwkJCQlmdW5jdGlvbiBleGl0cywgdGhlIHRpY2sgdmFsdWUgbWFpbnRhaW5lZCBieSB0aGUgdGljayBpcyBzdGVwcGVkCisJCQkJZm9yd2FyZCBieSBvbmUgbGVzcyB0aGFuIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcuICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0geEV4cGVjdGVkSWRsZVRpbWUgLSAxVUw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogU29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHRpY2sgaW50ZXJydXB0IGVuZGVkIHRoZSBzbGVlcC4KKwkJCQlXb3JrIG91dCBob3cgbG9uZyB0aGUgc2xlZXAgbGFzdGVkIHJvdW5kZWQgdG8gY29tcGxldGUgdGljaworCQkJCXBlcmlvZHMgKG5vdCB0aGUgdWxSZWxvYWQgdmFsdWUgd2hpY2ggYWNjb3VudGVkIGZvciBwYXJ0CisJCQkJdGlja3MpLiAqLworCQkJCXVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgPSAoIHhFeHBlY3RlZElkbGVUaW1lICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUc7CisKKwkJCQkvKiBIb3cgbWFueSBjb21wbGV0ZSB0aWNrIHBlcmlvZHMgcGFzc2VkIHdoaWxlIHRoZSBwcm9jZXNzb3IKKwkJCQl3YXMgd2FpdGluZz8gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzIC8gdWxUaW1lckNvdW50c0Zvck9uZVRpY2s7CisKKwkJCQkvKiBUaGUgcmVsb2FkIHZhbHVlIGlzIHNldCB0byB3aGF0ZXZlciBmcmFjdGlvbiBvZiBhIHNpbmdsZSB0aWNrCisJCQkJcGVyaW9kIHJlbWFpbnMuICovCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKyAxVUwgKSAqIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgLSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzOworCQkJfQorCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2sgc28gaXQgcnVucyBmcm9tIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcKKwkJCWFnYWluLCB0aGVuIHNldCBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHIGJhY2sgdG8gaXRzIHN0YW5kYXJkCisJCQl2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKwkJCXZUYXNrU3RlcFRpY2soIHVsQ29tcGxldGVUaWNrUGVyaW9kcyApOworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBFeGl0IHdpdGggaW50ZXJycHRzIGVuYWJsZWQuICovCisJCQlfX2VuYWJsZV9pbnRlcnJ1cHQoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNldHVwIHRoZSBzeXN0aWNrIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMgYXQgdGhlIHJlcXVpcmVkCisgKiBmcmVxdWVuY3kuCisgKi8KK19fd2VhayB2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCit7CisJLyogQ2FsY3VsYXRlIHRoZSBjb25zdGFudHMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSB0aWNrIGludGVycnVwdC4gKi8KKwkjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXsKKwkJdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKTsKKwkJeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IHBvcnRNQVhfMjRfQklUX05VTUJFUiAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCQl1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUiAvICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnU1lTVElDS19DTE9DS19IWiApOworCX0KKwkjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworCS8qIFN0b3AgYW5kIGNsZWFyIHRoZSBTeXNUaWNrLiAqLworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAwVUw7CisJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCS8qIENvbmZpZ3VyZSBTeXNUaWNrIHRvIGludGVycnVwdCBhdCB0aGUgcmVxdWVzdGVkIHJhdGUuICovCisJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC0gMVVMOworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApCisJeworCXVpbnQzMl90IHVsQ3VycmVudEludGVycnVwdDsKKwl1aW50OF90IHVjQ3VycmVudFByaW9yaXR5OworCisJCS8qIE9idGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGludGVycnVwdC4gKi8KKwkJX19hc20gdm9sYXRpbGUoICJtcnMgJTAsIGlwc3IiIDogIj1yIiggdWxDdXJyZW50SW50ZXJydXB0ICkgOjogIm1lbW9yeSIgKTsKKworCQkvKiBJcyB0aGUgaW50ZXJydXB0IG51bWJlciBhIHVzZXIgZGVmaW5lZCBpbnRlcnJ1cHQ/ICovCisJCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPj0gcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApCisJCXsKKwkJCS8qIExvb2sgdXAgdGhlIGludGVycnVwdCdzIHByaW9yaXR5LiAqLworCQkJdWNDdXJyZW50UHJpb3JpdHkgPSBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzWyB1bEN1cnJlbnRJbnRlcnJ1cHQgXTsKKworCQkJLyogVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmIGEgc2VydmljZSByb3V0aW5lIChJU1IpIGZvcgorCQkJYW4gaW50ZXJydXB0IHRoYXQgaGFzIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhYm92ZQorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIGNhbGxzIGFuIElTUiBzYWZlIEZyZWVSVE9TIEFQSQorCQkJZnVuY3Rpb24uICBJU1Igc2FmZSBGcmVlUlRPUyBBUEkgZnVuY3Rpb25zIG11c3QgKm9ubHkqIGJlIGNhbGxlZAorCQkJZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgYmVsb3cKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJTnVtZXJpY2FsbHkgbG93IGludGVycnVwdCBwcmlvcml0eSBudW1iZXJzIHJlcHJlc2VudCBsb2dpY2FsbHkgaGlnaAorCQkJaW50ZXJydXB0IHByaW9yaXRpZXMsIHRoZXJlZm9yZSB0aGUgcHJpb3JpdHkgb2YgdGhlIGludGVycnVwdCBtdXN0CisJCQliZSBzZXQgdG8gYSB2YWx1ZSBlcXVhbCB0byBvciBudW1lcmljYWxseSAqaGlnaGVyKiB0aGFuCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCUludGVycnVwdHMgdGhhdAl1c2UgdGhlIEZyZWVSVE9TIEFQSSBtdXN0IG5vdCBiZSBsZWZ0IGF0IHRoZWlyCisJCQlkZWZhdWx0IHByaW9yaXR5IG9mCXplcm8gYXMgdGhhdCBpcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBwcmlvcml0eSwKKwkJCXdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLAorCQkJYW5kCXRoZXJlZm9yZSBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgaW52YWxpZC4KKworCQkJRnJlZVJUT1MgbWFpbnRhaW5zIHNlcGFyYXRlIHRocmVhZCBhbmQgSVNSIEFQSSBmdW5jdGlvbnMgdG8gZW5zdXJlCisJCQlpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCQlUaGUgZm9sbG93aW5nIGxpbmtzIHByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb246CisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9GQVFIZWxwLmh0bWwgKi8KKwkJCWNvbmZpZ0FTU0VSVCggdWNDdXJyZW50UHJpb3JpdHkgPj0gdWNNYXhTeXNDYWxsUHJpb3JpdHkgKTsKKwkJfQorCisJCS8qIFByaW9yaXR5IGdyb3VwaW5nOiAgVGhlIGludGVycnVwdCBjb250cm9sbGVyIChOVklDKSBhbGxvd3MgdGhlIGJpdHMKKwkJdGhhdCBkZWZpbmUgZWFjaCBpbnRlcnJ1cHQncyBwcmlvcml0eSB0byBiZSBzcGxpdCBiZXR3ZWVuIGJpdHMgdGhhdAorCQlkZWZpbmUgdGhlIGludGVycnVwdCdzIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMgYW5kIGJpdHMgdGhhdCBkZWZpbmUKKwkJdGhlIGludGVycnVwdCdzIHN1Yi1wcmlvcml0eS4gIEZvciBzaW1wbGljaXR5IGFsbCBiaXRzIG11c3QgYmUgZGVmaW5lZAorCQl0byBiZSBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzLiAgVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmCisJCXRoaXMgaXMgbm90IHRoZSBjYXNlIChpZiBzb21lIGJpdHMgcmVwcmVzZW50IGEgc3ViLXByaW9yaXR5KS4KKworCQlJZiB0aGUgYXBwbGljYXRpb24gb25seSB1c2VzIENNU0lTIGxpYnJhcmllcyBmb3IgaW50ZXJydXB0CisJCWNvbmZpZ3VyYXRpb24gdGhlbiB0aGUgY29ycmVjdCBzZXR0aW5nIGNhbiBiZSBhY2hpZXZlZCBvbiBhbGwgQ29ydGV4LU0KKwkJZGV2aWNlcyBieSBjYWxsaW5nIE5WSUNfU2V0UHJpb3JpdHlHcm91cGluZyggMCApOyBiZWZvcmUgc3RhcnRpbmcgdGhlCisJCXNjaGVkdWxlci4gIE5vdGUgaG93ZXZlciB0aGF0IHNvbWUgdmVuZG9yIHNwZWNpZmljIHBlcmlwaGVyYWwgbGlicmFyaWVzCisJCWFzc3VtZSBhIG5vbi16ZXJvIHByaW9yaXR5IGdyb3VwIHNldHRpbmcsIGluIHdoaWNoIGNhc2VzIHVzaW5nIGEgdmFsdWUKKwkJb2YgemVybyB3aWxsIHJlc3VsdCBpbiB1bnByZWRpY3RhYmxlIGJlaGF2aW91ci4gKi8KKwkJY29uZmlnQVNTRVJUKCAoIHBvcnRBSVJDUl9SRUcgJiBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSyApIDw9IHVsTWF4UFJJR1JPVVBWYWx1ZSApOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTcvcjBwMS9wb3J0YXNtLnMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTcvcjBwMS9wb3J0YXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0OTJmMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNy9yMHAxL3BvcnRhc20ucwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpbmNsdWRlIDxGcmVlUlRPU0NvbmZpZy5oPgorCisJUlNFRyAgICBDT0RFOkNPREUoMikKKwl0aHVtYgorCisJRVhURVJOIHB4Q3VycmVudFRDQgorCUVYVEVSTiB2VGFza1N3aXRjaENvbnRleHQKKworCVBVQkxJQyB4UG9ydFBlbmRTVkhhbmRsZXIKKwlQVUJMSUMgdlBvcnRTVkNIYW5kbGVyCisJUFVCTElDIHZQb3J0U3RhcnRGaXJzdFRhc2sKKwlQVUJMSUMgdlBvcnRFbmFibGVWRlAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworeFBvcnRQZW5kU1ZIYW5kbGVyOgorCW1ycyByMCwgcHNwCisJaXNiCisJLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJbGRyCXIzLCA9cHhDdXJyZW50VENCCisJbGRyCXIyLCBbcjNdCisKKwkvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcHVzaCBoaWdoIHZmcCByZWdpc3RlcnMuICovCisJdHN0IHIxNCwgIzB4MTAKKwlpdCBlcQorCXZzdG1kYmVxIHIwISwge3MxNi1zMzF9CisKKwkvKiBTYXZlIHRoZSBjb3JlIHJlZ2lzdGVycy4gKi8KKwlzdG1kYiByMCEsIHtyNC1yMTEsIHIxNH0KKworCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW50byB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBUQ0IuICovCisJc3RyIHIwLCBbcjJdCisKKwlzdG1kYiBzcCEsIHtyMCwgcjN9CisJbW92IHIwLCAjY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZCisJY3BzaWQgaQorCW1zciBiYXNlcHJpLCByMAorCWRzYgorCWlzYgorCWNwc2llIGkKKwlibCB2VGFza1N3aXRjaENvbnRleHQKKwltb3YgcjAsICMwCisJbXNyIGJhc2VwcmksIHIwCisJbGRtaWEgc3AhLCB7cjAsIHIzfQorCisJLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0KKworCS8qIFBvcCB0aGUgY29yZSByZWdpc3RlcnMuICovCisJbGRtaWEgcjAhLCB7cjQtcjExLCByMTR9CisKKwkvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcG9wIHRoZSBoaWdoIHZmcCByZWdpc3RlcnMKKwl0b28uICovCisJdHN0IHIxNCwgIzB4MTAKKwlpdCBlcQorCXZsZG1pYWVxIHIwISwge3MxNi1zMzF9CisKKwltc3IgcHNwLCByMAorCWlzYgorCSNpZmRlZiBXT1JLQVJPVU5EX1BNVV9DTTAwMSAvKiBYTUM0MDAwIHNwZWNpZmljIGVycmF0YSAqLworCQkjaWYgV09SS0FST1VORF9QTVVfQ00wMDEgPT0gMQorCQkJcHVzaCB7IHIxNCB9CisJCQlwb3AgeyBwYyB9CisJCSNlbmRpZgorCSNlbmRpZgorCisJYnggcjE0CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0U1ZDSGFuZGxlcjoKKwkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IKKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0KKwkvKiBQb3AgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIwISwge3I0LXIxMSwgcjE0fQorCW1zciBwc3AsIHIwCisJaXNiCisJbW92IHIwLCAjMAorCW1zcgliYXNlcHJpLCByMAorCWJ4IHIxNAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlBvcnRTdGFydEZpcnN0VGFzaworCS8qIFVzZSB0aGUgTlZJQyBvZmZzZXQgcmVnaXN0ZXIgdG8gbG9jYXRlIHRoZSBzdGFjay4gKi8KKwlsZHIgcjAsID0weEUwMDBFRDA4CisJbGRyIHIwLCBbcjBdCisJbGRyIHIwLCBbcjBdCisJLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCW1zciBtc3AsIHIwCisJLyogQ2xlYXIgdGhlIGJpdCB0aGF0IGluZGljYXRlcyB0aGUgRlBVIGlzIGluIHVzZSBpbiBjYXNlIHRoZSBGUFUgd2FzIHVzZWQKKwliZWZvcmUgdGhlIHNjaGVkdWxlciB3YXMgc3RhcnRlZCAtIHdoaWNoIHdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdGhlCisJdW5uZWNlc3NhcnkgbGVhdmluZyBvZiBzcGFjZSBpbiB0aGUgU1ZDIHN0YWNrIGZvciBsYXp5IHNhdmluZyBvZiBGUFUKKwlyZWdpc3RlcnMuICovCisJbW92IHIwLCAjMAorCW1zciBjb250cm9sLCByMAorCS8qIENhbGwgU1ZDIHRvIHN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCWNwc2llIGkKKwljcHNpZSBmCisJZHNiCisJaXNiCisJc3ZjIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0RW5hYmxlVkZQOgorCS8qIFRoZSBGUFUgZW5hYmxlIGJpdHMgYXJlIGluIHRoZSBDUEFDUi4gKi8KKwlsZHIudyByMCwgPTB4RTAwMEVEODgKKwlsZHIJcjEsIFtyMF0KKworCS8qIEVuYWJsZSBDUDEwIGFuZCBDUDExIGNvcHJvY2Vzc29ycywgdGhlbiBzYXZlIGJhY2suICovCisJb3JyCXIxLCByMSwgIyggMHhmIDw8IDIwICkKKwlzdHIgcjEsIFtyMF0KKwlieAlyMTQKKworCisKKwlFTkQKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003L3IwcDEvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTcvcjBwMS9wb3J0bWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTE0NmY0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003L3IwcDEvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBJQVIgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8aW50cmluc2ljcy5oPgorCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNjaGVkdWxlciB1dGlsaXRpZXMuICovCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJXAorCS8qIFNldCBhIFBlbmRTViB0byByZXF1ZXN0IGEgY29udGV4dCBzd2l0Y2guICovCQkJXAorCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CQkJXAorCV9fRFNCKCk7CQkJCQkJCQkJCQkJXAorCV9fSVNCKCk7CQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUX0JJVAkJKCAxVUwgPDwgMjhVTCApCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkgaWYoIHhTd2l0Y2hSZXF1aXJlZCAhPSBwZEZBTFNFICkgcG9ydFlJRUxEKCkKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBvcHRpbWlzYXRpb25zLiAqLworI2lmbmRlZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04KKwkjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAxCisjZW5kaWYKKworI2lmKCBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gPT0gMSApCisKKwkvKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KKwkjaWYoIGNvbmZpZ01BWF9QUklPUklUSUVTID4gMzIgKQorCQkjZXJyb3IgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIGNhbiBvbmx5IGJlIHNldCB0byAxIHdoZW4gY29uZmlnTUFYX1BSSU9SSVRJRVMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLiAgSXQgaXMgdmVyeSByYXJlIHRoYXQgYSBzeXN0ZW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEwIHRvIDE1IGRpZmZlcmVuY2UgcHJpb3JpdGllcyBhcyB0YXNrcyB0aGF0IHNoYXJlIGEgcHJpb3JpdHkgd2lsbCB0aW1lIHNsaWNlLgorCSNlbmRpZgorCisJLyogU3RvcmUvY2xlYXIgdGhlIHJlYWR5IHByaW9yaXRpZXMgaW4gYSBiaXQgbWFwLiAqLworCSNkZWZpbmUgcG9ydFJFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgfD0gKCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCSNkZWZpbmUgcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSAmPSB+KCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkjZGVmaW5lIHBvcnRHRVRfSElHSEVTVF9QUklPUklUWSggdXhUb3BQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSB1eFRvcFByaW9yaXR5ID0gKCAzMVVMIC0gKCAoIHVpbnQzMl90ICkgX19DTFooICggdXhSZWFkeVByaW9yaXRpZXMgKSApICkgKQorCisjZW5kaWYgLyogY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LiAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApOworCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJXAorCSAvKiBFcnJhdGEgd29yayBhcm91bmQuICovCQkJCQkJCQlcCisJX19kaXNhYmxlX2ludGVycnVwdCgpOwkJCQkJCQkJCVwKKwlfX3NldF9CQVNFUFJJKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKTsJXAorCV9fRFNCKCk7CQkJCQkJCQkJCQkJXAorCV9fSVNCKCk7CQkJCQkJCQkJCQkJXAorCV9fZW5hYmxlX2ludGVycnVwdCgpOwkJCQkJCQkJCVwKK30KKworI2RlZmluZSBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQkJCQkJX19zZXRfQkFTRVBSSSggMCApCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQkJCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCV9fZ2V0X0JBU0VQUkkoKTsgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCisjZGVmaW5lIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUih4KQlfX3NldF9CQVNFUFJJKCB4ICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaWNrbGVzcyBpZGxlL2xvdyBwb3dlciBmdW5jdGlvbmFsaXR5LiAqLworI2lmbmRlZiBwb3J0U1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQCisJZXh0ZXJuIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKTsKKwkjZGVmaW5lIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAoIHhFeHBlY3RlZElkbGVUaW1lICkgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIHhFeHBlY3RlZElkbGVUaW1lICkKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGFzayBmdW5jdGlvbiBtYWNyb3MgYXMgZGVzY3JpYmVkIG9uIHRoZSBGcmVlUlRPUy5vcmcgV0VCIHNpdGUuICBUaGVzZSBhcmUKK25vdCBuZWNlc3NhcnkgZm9yIHRvIHVzZSB0aGlzIHBvcnQuICBUaGV5IGFyZSBkZWZpbmVkIHNvIHRoZSBjb21tb24gZGVtbyBmaWxlcworKHdoaWNoIGJ1aWxkIHdpdGggYWxsIHRoZSBwb3J0cykgd2lsbCBidWlsZC4gKi8KKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBjb25maWdBU1NFUlQKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApOworCSNkZWZpbmUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIAl2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoKQorI2VuZGlmCisKKy8qIHBvcnROT1AoKSBpcyBub3QgcmVxdWlyZWQgYnkgdGhpcyBwb3J0LiAqLworI2RlZmluZSBwb3J0Tk9QKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN1cHByZXNzIHdhcm5pbmdzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSB0aGUgSUFSIHRvb2xzLCBidXQgY2Fubm90IGJlIGZpeGVkIGluCit0aGUgc291cmNlIGNvZGUgYmVjYXVzZSB0byBkbyBzbyB3b3VsZCBjYXVzZSBvdGhlciBjb21waWxlcnMgdG8gZ2VuZXJhdGUKK3dhcm5pbmdzLiAqLworI3ByYWdtYSBkaWFnX3N1cHByZXNzPVBlMTkxCisjcHJhZ21hIGRpYWdfc3VwcHJlc3M9UGEwODIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNN19NUFUvUmVhZE1lLnR4dCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNN19NUFUvUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWRkMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003X01QVS9SZWFkTWUudHh0CkBAIC0wLDAgKzEsMTggQEAKK1RoZXJlIGFyZSB0d28gb3B0aW9ucyBmb3IgcnVubmluZyBGcmVlUlRPUyBvbiBBUk0gQ29ydGV4LU03IG1pY3JvY29udHJvbGxlcnMuCitUaGUgYmVzdCBvcHRpb24gZGVwZW5kcyBvbiB0aGUgcmV2aXNpb24gb2YgdGhlIEFSTSBDb3J0ZXgtTTcgY29yZSBpbiB1c2UuICBUaGUKK3JldmlzaW9uIGlzIHNwZWNpZmllZCBieSBhbiAncicgbnVtYmVyLCBhbmQgYSAncCcgbnVtYmVyLCBzbyB3aWxsIGxvb2sgc29tZXRoaW5nCitsaWtlICdyMHAxJy4gIENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbWljcm9jb250cm9sbGVyIGluIHVzZSB0byBmaW5kIHRoZSAKK3JldmlzaW9uIG9mIHRoZSBDb3J0ZXgtTTcgY29yZSB1c2VkIGluIHRoYXQgbWljcm9jb250cm9sbGVyLiAgSWYgaW4gZG91YnQsIHVzZSAKK3RoZSBGcmVlUlRPUyBwb3J0IHByb3ZpZGVkIHNwZWNpZmljYWxseSBmb3IgcjBwMSByZXZpc2lvbnMsIGFzIHRoYXQgY2FuIGJlIHVzZWQKK3dpdGggYWxsIGNvcmUgcmV2aXNpb25zLgorCitUaGUgZmlyc3Qgb3B0aW9uIGlzIHRvIHVzZSB0aGUgQVJNIENvcnRleC1NNEYgcG9ydCwgYW5kIHRoZSBzZWNvbmQgb3B0aW9uIGlzIHRvCit1c2UgdGhlIENvcnRleC1NNyByMHAxIHBvcnQgLSB0aGUgbGF0dGVyIGNvbnRhaW5pbmcgYSBtaW5vciBlcnJhdGEgd29ya2Fyb3VuZC4KKworSWYgdGhlIHJldmlzaW9uIG9mIHRoZSBBUk0gQ29ydGV4LU03IGNvcmUgaXMgbm90IHIwcDEgdGhlbiBlaXRoZXIgb3B0aW9uIGNhbiBiZQordXNlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgRnJlZVJUT1MgQVJNIENvcnRleC1NNEYgcG9ydCBsb2NhdGVkIGluIAordGhlIC9GcmVlUlRPUy9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRGIGRpcmVjdG9yeS4KKworSWYgdGhlIHJldmlzaW9uIG9mIHRoZSBBUk0gQ29ydGV4LU03IGNvcmUgaXMgcjBwMSB0aGVuIHVzZSB0aGUgRnJlZVJUT1MgQVJNCitDb3J0ZXgtTTcgcjBwMSBwb3J0IGxvY2F0ZWQgaW4gdGhlIC9GcmVlUlRPUy9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEKK2RpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzEyNzgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCkBAIC0wLDAgKzEsODgwIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gcG9ydGFibGUuaCBmb3IgdGhlIEFSTSBDTTRGIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDb21waWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlIDxpbnRyaW5zaWNzLmg+CisKKy8qIERlZmluaW5nIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHByZXZlbnRzIHRhc2suaCBmcm9tIHJlZGVmaW5pbmcKK2FsbCB0aGUgQVBJIGZ1bmN0aW9ucyB0byB1c2UgdGhlIE1QVSB3cmFwcGVycy4gIFRoYXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuCit0YXNrLmggaXMgaW5jbHVkZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorI2lmbmRlZiBfX0FSTVZGUF9fCisJI2Vycm9yIFRoaXMgcG9ydCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIHByb2plY3Qgb3B0aW9ucyBhcmUgY29uZmlndXJlZCB0byBlbmFibGUgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydC4KKyNlbmRpZgorCisjaWYgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZID09IDAKKwkjZXJyb3IgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLiAgU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwKKyNlbmRpZgorCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworI2lmbmRlZiBjb25maWdTWVNUSUNLX0NMT0NLX0haCisJI2RlZmluZSBjb25maWdTWVNUSUNLX0NMT0NLX0haIGNvbmZpZ0NQVV9DTE9DS19IWgorCS8qIEVuc3VyZSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGF0IHRoZSBzYW1lIGZyZXF1ZW5jeSBhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDFVTCA8PCAyVUwgKQorI2Vsc2UKKwkvKiBUaGUgd2F5IHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgaXMgbm90IG1vZGlmaWVkIGluIGNhc2UgaXQgaXMgbm90IHRoZSBzYW1lCisJYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQJKCAwICkKKyNlbmRpZgorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29yZS4gIFJlZ2lzdGVycyBmaXJzdC4uLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTQgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMl9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMWMgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU19DVFJMX1NUQVRFX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDI0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19NRU1fRkFVTFRfRU5BQkxFCQkJCSggMVVMIDw8IDE2VUwgKQorLyogLi4udGhlbiBiaXRzIGluIHRoZSByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVAkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVAkJCSggMVVMIDw8IDBVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQJCSggMVVMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZDTEVBUl9CSVQgCQkJKCAxVUwgPDwgMjdVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRfU1lTVElDS19DTEVBUl9CSVQJCSggMVVMIDw8IDI1VUwgKQorCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVl9QUkkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1ZDX1BSSQkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIC0gMVVMICkgPDwgMjRVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgYW4gaW50ZXJydXB0IHByaW9yaXR5LiAqLworI2RlZmluZSBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSCQkoIDE2ICkKKyNkZWZpbmUgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiAJKCAweEUwMDBFM0YwICkKKyNkZWZpbmUgcG9ydEFJUkNSX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4RTAwMEVEMEMgKSApCisjZGVmaW5lIHBvcnRNQVhfOF9CSVRfVkFMVUUJCQkJCSggKCB1aW50OF90ICkgMHhmZiApCisjZGVmaW5lIHBvcnRUT1BfQklUX09GX0JZVEUJCQkJCSggKCB1aW50OF90ICkgMHg4MCApCisjZGVmaW5lIHBvcnRNQVhfUFJJR1JPVVBfQklUUwkJCQkoICggdWludDhfdCApIDcgKQorI2RlZmluZSBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSwkJCQkoIDB4MDdVTCA8PCA4VUwgKQorI2RlZmluZSBwb3J0UFJJR1JPVVBfU0hJRlQJCQkJCSggOFVMICkKKworLyogTWFza3Mgb2ZmIGFsbCBiaXRzIGJ1dCB0aGUgVkVDVEFDVElWRSBiaXRzIGluIHRoZSBJQ1NSIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0VkVDVEFDVElWRV9NQVNLCQkJCQkoIDB4RkZVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgdGhlIE1QVS4gKi8KKyNkZWZpbmUgcG9ydE1QVV9UWVBFX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTAgKSApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDlDICkgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRBMCApICkKKyNkZWZpbmUgcG9ydE1QVV9DVFJMX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTQgKSApCisjZGVmaW5lIHBvcnRFWFBFQ1RFRF9NUFVfVFlQRV9WQUxVRQkJCQkoIDhVTCA8PCA4VUwgKSAvKiA4IHJlZ2lvbnMsIHVuaWZpZWQuICovCisjZGVmaW5lIHBvcnRNUFVfRU5BQkxFCQkJCQkJCSggMHgwMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9CQUNLR1JPVU5EX0VOQUJMRQkJCQkoIDFVTCA8PCAyVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9FWEVDVVRJT05fU1RBUlRfQUREUkVTUwkoIDBVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1ZBTElECQkJCQkoIDB4MTBVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0VOQUJMRQkJCQkJKCAweDAxVUwgKQorI2RlZmluZSBwb3J0UEVSSVBIRVJBTFNfU1RBUlRfQUREUkVTUwkJCTB4NDAwMDAwMDBVTAorI2RlZmluZSBwb3J0UEVSSVBIRVJBTFNfRU5EX0FERFJFU1MJCQkJMHg1RkZGRkZGRlVMCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBWRlAuICovCisjZGVmaW5lIHBvcnRGUENDUgkJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVmMzQgKSAvKiBGbG9hdGluZyBwb2ludCBjb250ZXh0IGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUwkJCSggMHgzVUwgPDwgMzBVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suICovCisjZGVmaW5lIHBvcnRJTklUSUFMX1hQU1IJCQkJCQkoIDB4MDEwMDAwMDBVTCApCisjZGVmaW5lIHBvcnRJTklUSUFMX0VYRUNfUkVUVVJOCQkJCQkoIDB4ZmZmZmZmZmRVTCApCisjZGVmaW5lIHBvcnRJTklUSUFMX0NPTlRST0xfSUZfVU5QUklWSUxFR0VECQkoIDB4MDMgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1BSSVZJTEVHRUQJCSggMHgwMiApCisKKy8qIE9mZnNldHMgaW4gdGhlIHN0YWNrIHRvIHRoZSBwYXJhbWV0ZXJzIHdoZW4gaW5zaWRlIHRoZSBTVkMgaGFuZGxlci4gKi8KKyNkZWZpbmUgcG9ydE9GRlNFVF9UT19QQwkJCQkJCSggNiApCisKKy8qIFRoZSBzeXN0aWNrIGlzIGEgMjQtYml0IGNvdW50ZXIuICovCisjZGVmaW5lIHBvcnRNQVhfMjRfQklUX05VTUJFUgkJCQkoIDB4ZmZmZmZmVUwgKQorCisvKiBBIGZpZGRsZSBmYWN0b3IgdG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBTeXNUaWNrIGNvdW50cyB0aGF0IHdvdWxkIGhhdmUKK29jY3VycmVkIHdoaWxlIHRoZSBTeXNUaWNrIGNvdW50ZXIgaXMgc3RvcHBlZCBkdXJpbmcgdGlja2xlc3MgaWRsZQorY2FsY3VsYXRpb25zLiAqLworI2RlZmluZSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IJCQkoIDQ1VUwgKQorCisvKiBGb3Igc3RyaWN0IGNvbXBsaWFuY2Ugd2l0aCB0aGUgQ29ydGV4LU0gc3BlYyB0aGUgdGFzayBzdGFydCBhZGRyZXNzIHNob3VsZAoraGF2ZSBiaXQtMCBjbGVhciwgYXMgaXQgaXMgbG9hZGVkIGludG8gdGhlIFBDIG9uIGV4aXQgZnJvbSBhbiBJU1IuICovCisjZGVmaW5lIHBvcnRTVEFSVF9BRERSRVNTX01BU0sJCQkJKCAoIFN0YWNrVHlwZV90ICkgMHhmZmZmZmZmZVVMICkKKworLyogRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKK3ZhcmlhYmxlLiAqLworc3RhdGljIFVCYXNlVHlwZV90IHV4Q3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYTsKKworLyoKKyAqIFNldHVwIHRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzLiAgVGhlIGltcGxlbWVudGF0aW9uIGluIHRoaXMKKyAqIGZpbGUgaXMgd2VhayB0byBhbGxvdyBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvIGNoYW5nZSB0aGUgdGltZXIgdXNlZCB0bworICogZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0LgorICovCit2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApOworCisvKgorICogQ29uZmlndXJlIGEgbnVtYmVyIG9mIHN0YW5kYXJkIE1QVSByZWdpb25zIHRoYXQgYXJlIHVzZWQgYnkgYWxsIHRhc2tzLgorICovCitQUklWSUxFR0VEX0ZVTkNUSU9OIHN0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICk7CisKKy8qCisgKiBSZXR1cm4gdGhlIHNtYWxsZXN0IE1QVSByZWdpb24gc2l6ZSB0aGF0IGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIHdpbGwgZml0CisgKiBpbnRvLiAgVGhlIHJlZ2lvbiBzaXplIGlzIHJldHVybmVkIGFzIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBwcm9ncmFtbWVkCisgKiBpbnRvIHRoZSByZWdpb24gYXR0cmlidXRlIHJlZ2lzdGVyIGZvciB0aGF0IHJlZ2lvbi4KKyAqLworUFJJVklMRUdFRF9GVU5DVElPTiBzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKTsKKworLyoKKyAqIEV4Y2VwdGlvbiBoYW5kbGVycy4KKyAqLwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICk7CisKKy8qCisgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0U3RhcnRGaXJzdFRhc2soIHZvaWQgKTsKKworZXh0ZXJuIHZvaWQgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soIHZvaWQgKTsKKworLyoKKyAqIFR1cm4gdGhlIFZGUCBvbi4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbmFibGVWRlAoIHZvaWQgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIFN5c1RpY2sgaW5jcmVtZW50cyB0aGF0IG1ha2UgdXAgb25lIHRpY2sgcGVyaW9kLgorICovCisjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCXN0YXRpYyB1aW50MzJfdCB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrIHBlcmlvZHMgdGhhdCBjYW4gYmUgc3VwcHJlc3NlZCBpcyBsaW1pdGVkIGJ5IHRoZQorICogMjQgYml0IHJlc29sdXRpb24gb2YgdGhlIFN5c1RpY2sgdGltZXIuCisgKi8KKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisJc3RhdGljIHVpbnQzMl90IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBDb21wZW5zYXRlIGZvciB0aGUgQ1BVIGN5Y2xlcyB0aGF0IHBhc3Mgd2hpbGUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCAobG93CisgKiBwb3dlciBmdW5jdGlvbmFsaXR5IG9ubHkuCisgKi8KKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisJc3RhdGljIHVpbnQzMl90IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogVXNlZCBieSB0aGUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIG1hY3JvIHRvIGVuc3VyZQorICogRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBhcmUgbm90IGNhbGxlZCBmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQKKyAqIGEgcHJpb3JpdHkgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorICovCisjaWYgKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwkgc3RhdGljIHVpbnQ4X3QgdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSAwOworCSBzdGF0aWMgdWludDMyX3QgdWxNYXhQUklHUk9VUFZhbHVlID0gMDsKKwkgc3RhdGljIGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzID0gKCBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgKSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2OworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMsIEJhc2VUeXBlX3QgeFJ1blByaXZpbGVnZWQgKQoreworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwlpbnRlcnJ1cHQuICovCisKKwkvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQKKwlvZiBpbnRlcnJ1cHRzLCBhbmQgdG8gZW5zdXJlIGFsaWdubWVudC4gKi8KKwlweFRvcE9mU3RhY2stLTsKKworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkvKiB4UFNSICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggKCBTdGFja1R5cGVfdCApIHB4Q29kZSApICYgcG9ydFNUQVJUX0FERFJFU1NfTUFTSzsJLyogUEMgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDA7CS8qIExSICovCisKKwkvKiBTYXZlIGNvZGUgc3BhY2UgYnkgc2tpcHBpbmcgcmVnaXN0ZXIgaW5pdGlhbGlzYXRpb24uICovCisJcHhUb3BPZlN0YWNrIC09IDU7CS8qIFIxMiwgUjMsIFIyIGFuZCBSMS4gKi8KKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJLyogUjAgKi8KKworCS8qIEEgc2F2ZSBtZXRob2QgaXMgYmVpbmcgdXNlZCB0aGF0IHJlcXVpcmVzIGVhY2ggdGFzayB0byBtYWludGFpbiBpdHMKKwlvd24gZXhlYyByZXR1cm4gdmFsdWUuICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0VYRUNfUkVUVVJOOworICAgICAgICAKKwlweFRvcE9mU3RhY2sgLT0gOTsJLyogUjExLCBSMTAsIFI5LCBSOCwgUjcsIFI2LCBSNSBhbmQgUjQuICovCisgICAgICAgIAorICAgICAgICBpZiggeFJ1blByaXZpbGVnZWQgPT0gcGRUUlVFICkKKwl7CisgICAgICAgICAgKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfSUZfUFJJVklMRUdFRDsKKwl9CisJZWxzZQorCXsKKyAgICAgICAgICAqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9VTlBSSVZJTEVHRUQ7CisJfQorICAgICAgICAKKwlyZXR1cm4gcHhUb3BPZlN0YWNrOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgdlNWQ0hhbmRsZXIoIHVpbnQzMl90ICpwdWxQYXJhbSApCit7Cit1aW50OF90IHVjU1ZDTnVtYmVyOwordWludDMyX3QgdWxSZWc7CisKKwkvKiBUaGUgc3RhY2sgY29udGFpbnM6IHIwLCByMSwgcjIsIHIzLCByMTIsIHIxNCwgdGhlIHJldHVybiBhZGRyZXNzIGFuZAorCXhQU1IuICBUaGUgZmlyc3QgYXJndW1lbnQgKHIwKSBpcyBwdWxQYXJhbVsgMCBdLiAqLworCXVjU1ZDTnVtYmVyID0gKCAoIHVpbnQ4X3QgKiApIHB1bFBhcmFtWyBwb3J0T0ZGU0VUX1RPX1BDIF0gKVsgLTIgXTsKKwlzd2l0Y2goIHVjU1ZDTnVtYmVyICkKKwl7CisJCWNhc2UgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIgOgkKKyAgICAgICAgICAgICAgICAgIHBvcnROVklDX1NZU1BSSTFfUkVHIHw9IHBvcnROVklDX1NWQ19QUkk7CisJCSAgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soKTsKKwkJIGJyZWFrOworCisJCWNhc2UgcG9ydFNWQ19ZSUVMRCA6CisgICAgICAgICAgICAgICAgICBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQkgIC8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQKKwkJICAgICBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzIGNvbXBsZXRlbHkKKwkJICAgICB3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZQorCQkgICAgIGFyY2hpdGVjdHVyZS4gKi8KKwkJICBfX0RTQigpOworCQkgIF9fSVNCKCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworCQljYXNlIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFIDoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsUmVnID0gX19nZXRfQ09OVFJPTCgpOworICAgICAgICAgIHVsUmVnICY9IDB4RkZGRkZGRkU7CisgICAgICAgICAgX19zZXRfQ09OVFJPTCh1bFJlZyk7CisgICAgICAgICAgICAgICAgICAKKwkJYnJlYWs7CisKKwkJZGVmYXVsdAk6CS8qIFVua25vd24gU1ZDIGNhbGwuICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApCit7CisJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwl7CisJCXZvbGF0aWxlIHVpbnQzMl90IHVsT3JpZ2luYWxQcmlvcml0eTsKKwkJdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSAoIHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCApICggcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiArIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKTsKKwkJdm9sYXRpbGUgdWludDhfdCB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHByaW9yaXR5IGZyb20gd2hpY2ggSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCWZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiAgSVNSIHNhZmUgZnVuY3Rpb25zIGFyZSB0aG9zZSB0aGF0IGVuZCBpbgorCQkiRnJvbUlTUiIuICBGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0bworCQllbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQlTYXZlIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkgdmFsdWUgdGhhdCBpcyBhYm91dCB0byBiZSBjbG9iYmVyZWQuICovCisJCXVsT3JpZ2luYWxQcmlvcml0eSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYXZhaWxhYmxlLiAgRmlyc3Qgd3JpdGUgdG8gYWxsCisJCXBvc3NpYmxlIGJpdHMuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gcG9ydE1BWF84X0JJVF9WQUxVRTsKKworCQkvKiBSZWFkIHRoZSB2YWx1ZSBiYWNrIHRvIHNlZSBob3cgbWFueSBiaXRzIHN0dWNrLiAqLworCQl1Y01heFByaW9yaXR5VmFsdWUgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKyAgICAgICAgCisJLyogQ29uZmlndXJlIHRoZSByZWdpb25zIGluIHRoZSBNUFUgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCB0YXNrcy4gKi8KKwlwcnZTZXR1cE1QVSgpOworCisJLyogU3RhcnQgdGhlIHRpbWVyIHRoYXQgZ2VuZXJhdGVzIHRoZSB0aWNrIElTUi4gIEludGVycnVwdHMgYXJlIGRpc2FibGVkCisJaGVyZSBhbHJlYWR5LiAqLworCXZQb3J0U2V0dXBUaW1lckludGVycnVwdCgpOworCisJLyogSW5pdGlhbGlzZSB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCByZWFkeSBmb3IgdGhlIGZpcnN0IHRhc2suICovCisJdXhDcml0aWNhbE5lc3RpbmcgPSAwOworCisJLyogRW5zdXJlIHRoZSBWRlAgaXMgZW5hYmxlZCAtIGl0IHNob3VsZCBiZSBhbnl3YXkuICovCisJdlBvcnRFbmFibGVWRlAoKTsKKworCS8qIExhenkgc2F2ZSBhbHdheXMuICovCisJKiggcG9ydEZQQ0NSICkgfD0gcG9ydEFTUEVOX0FORF9MU1BFTl9CSVRTOworCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJdlBvcnRTdGFydEZpcnN0VGFzaygpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSEgKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkKK3sKKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJdXhDcml0aWNhbE5lc3RpbmcrKzsKKworCS8qIFRoaXMgaXMgbm90IHRoZSBpbnRlcnJ1cHQgc2FmZSB2ZXJzaW9uIG9mIHRoZSBlbnRlciBjcml0aWNhbCBmdW5jdGlvbiBzbworCWFzc2VydCgpIGlmIGl0IGlzIGJlaW5nIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LiAgT25seSBBUEkKKwlmdW5jdGlvbnMgdGhhdCBlbmQgaW4gIkZyb21JU1IiIGNhbiBiZSB1c2VkIGluIGFuIGludGVycnVwdC4gIE9ubHkgYXNzZXJ0IGlmCisJdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgaXMgMSB0byBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaXZlIGNhbGxzIGlmIHRoZQorCWFzc2VydCBmdW5jdGlvbiBhbHNvIHVzZXMgYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxICkKKwl7CisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgJiBwb3J0VkVDVEFDVElWRV9NQVNLICkgPT0gMCApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkKK3sKKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nICk7CisJdXhDcml0aWNhbE5lc3RpbmctLTsKKwlpZiggdXhDcml0aWNhbE5lc3RpbmcgPT0gMCApCisJeworCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBUaGUgU3lzVGljayBydW5zIGF0IHRoZSBsb3dlc3QgaW50ZXJydXB0IHByaW9yaXR5LCBzbyB3aGVuIHRoaXMgaW50ZXJydXB0CisJZXhlY3V0ZXMgYWxsIGludGVycnVwdHMgbXVzdCBiZSB1bm1hc2tlZC4gIFRoZXJlIGlzIHRoZXJlZm9yZSBubyBuZWVkIHRvCisJc2F2ZSBhbmQgdGhlbiByZXN0b3JlIHRoZSBpbnRlcnJ1cHQgbWFzayB2YWx1ZSBhcyBpdHMgdmFsdWUgaXMgYWxyZWFkeQorCWtub3duLiAqLworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl7CisJCS8qIEluY3JlbWVudCB0aGUgUlRPUyB0aWNrLiAqLworCQlpZiggeFRhc2tJbmNyZW1lbnRUaWNrKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIEEgY29udGV4dCBzd2l0Y2ggaXMgcmVxdWlyZWQuICBDb250ZXh0IHN3aXRjaGluZyBpcyBwZXJmb3JtZWQgaW4KKwkJCXRoZSBQZW5kU1YgaW50ZXJydXB0LiAgUGVuZCB0aGUgUGVuZFNWIGludGVycnVwdC4gKi8KKwkJCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCX0KKwl9CisJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICkKK3sKK3VpbnQzMl90IHVsUmVnOworCQorCWlmKCB4UnVubmluZ1ByaXZpbGVnZWQgIT0gcGRUUlVFICkgCisJeworICAgICAgICAgIHVsUmVnID0gX19nZXRfQ09OVFJPTCgpOworICAgICAgICAgIHVsUmVnIHw9IDB4MTsKKyAgICAgICAgICBfX3NldF9DT05UUk9MKHVsUmVnKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCisJX193ZWFrIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKQorCXsKKwl1aW50MzJfdCB1bFJlbG9hZFZhbHVlLCB1bENvbXBsZXRlVGlja1BlcmlvZHMsIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMsIHVsU3lzVGlja0NUUkw7CisJVGlja1R5cGVfdCB4TW9kaWZpYWJsZUlkbGVUaW1lOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgU3lzVGljayByZWxvYWQgdmFsdWUgZG9lcyBub3Qgb3ZlcmZsb3cgdGhlIGNvdW50ZXIuICovCisJCWlmKCB4RXhwZWN0ZWRJZGxlVGltZSA+IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgKQorCQl7CisJCQl4RXhwZWN0ZWRJZGxlVGltZSA9IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3M7CisJCX0KKworCQkvKiBTdG9wIHRoZSBTeXNUaWNrIG1vbWVudGFyaWx5LiAgVGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IKKwkJaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiBiZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwKKwkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCisJCWtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgdGltZS4gKi8KKwkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyAmPSB+cG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOworCisJCS8qIENhbGN1bGF0ZSB0aGUgcmVsb2FkIHZhbHVlIHJlcXVpcmVkIHRvIHdhaXQgeEV4cGVjdGVkSWRsZVRpbWUKKwkJdGljayBwZXJpb2RzLiAgLTEgaXMgdXNlZCBiZWNhdXNlIHRoaXMgY29kZSB3aWxsIGV4ZWN1dGUgcGFydCB3YXkKKwkJdGhyb3VnaCBvbmUgb2YgdGhlIHRpY2sgcGVyaW9kcy4gKi8KKwkJdWxSZWxvYWRWYWx1ZSA9IHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgKyAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICogKCB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTCApICk7CisJCWlmKCB1bFJlbG9hZFZhbHVlID4gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKQorCQl7CisJCQl1bFJlbG9hZFZhbHVlIC09IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uOworCQl9CisKKwkJLyogRW50ZXIgYSBjcml0aWNhbCBzZWN0aW9uIGJ1dCBkb24ndCB1c2UgdGhlIHRhc2tFTlRFUl9DUklUSUNBTCgpCisJCW1ldGhvZCBhcyB0aGF0IHdpbGwgbWFzayBpbnRlcnJ1cHRzIHRoYXQgc2hvdWxkIGV4aXQgc2xlZXAgbW9kZS4gKi8KKwkJX19kaXNhYmxlX2ludGVycnVwdCgpOworCQlfX0RTQigpOworCQlfX0lTQigpOworCisKKwkJLyogSWYgYSBjb250ZXh0IHN3aXRjaCBpcyBwZW5kaW5nIG9yIGEgdGFzayBpcyB3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGVyCisJCXRvIGJlIHVuc3VzcGVuZGVkIHRoZW4gYWJhbmRvbiB0aGUgbG93IHBvd2VyIGVudHJ5LiAqLworCQlpZiggZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgPT0gZUFib3J0U2xlZXAgKQorCQl7CisJCQkvKiBSZXN0YXJ0IGZyb20gd2hhdGV2ZXIgaXMgbGVmdCBpbiB0aGUgY291bnQgcmVnaXN0ZXIgdG8gY29tcGxldGUKKwkJCXRoaXMgdGljayBwZXJpb2QuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFJlc2V0IHRoZSByZWxvYWQgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciBub3JtYWwgdGljaworCQkJcGVyaW9kcy4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgLSBzZWUgY29tbWVudHMgYWJvdmUgX19kaXNhYmxlX2ludGVycnVwdCgpCisJCQljYWxsIGFib3ZlLiAqLworCQkJX19lbmFibGVfaW50ZXJydXB0KCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTZXQgdGhlIG5ldyByZWxvYWQgdmFsdWUuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxSZWxvYWRWYWx1ZTsKKworCQkJLyogQ2xlYXIgdGhlIFN5c1RpY2sgY291bnQgZmxhZyBhbmQgc2V0IHRoZSBjb3VudCB2YWx1ZSBiYWNrIHRvCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFNsZWVwIHVudGlsIHNvbWV0aGluZyBoYXBwZW5zLiAgY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoKSBjYW4KKwkJCXNldCBpdHMgcGFyYW1ldGVyIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCBpdHMgaW1wbGVtZW50YXRpb24gY29udGFpbnMKKwkJCWl0cyBvd24gd2FpdCBmb3IgaW50ZXJydXB0IG9yIHdhaXQgZm9yIGV2ZW50IGluc3RydWN0aW9uLCBhbmQgc28gd2ZpCisJCQlzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGFnYWluLiAgSG93ZXZlciwgdGhlIG9yaWdpbmFsIGV4cGVjdGVkIGlkbGUKKwkJCXRpbWUgdmFyaWFibGUgbXVzdCByZW1haW4gdW5tb2RpZmllZCwgc28gYSBjb3B5IGlzIHRha2VuLiAqLworCQkJeE1vZGlmaWFibGVJZGxlVGltZSA9IHhFeHBlY3RlZElkbGVUaW1lOworCQkJY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoICZ4TW9kaWZpYWJsZUlkbGVUaW1lICk7CisJCQlpZiggeE1vZGlmaWFibGVJZGxlVGltZSA+IDAgKQorCQkJeworCQkJCV9fRFNCKCk7CisJCQkJX19XRkkoKTsKKwkJCQlfX0lTQigpOworCQkJfQorCQkJY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HKCAmeEV4cGVjdGVkSWRsZVRpbWUgKTsKKworCQkJLyogU3RvcCBTeXNUaWNrLiAgQWdhaW4sIHRoZSB0aW1lIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgZm9yIGlzCisJCQlhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIGJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbAorCQkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCisJCQlrZXJuZWwgd2l0aCByZXNwZWN0IHRvIGNhbGVuZGFyIHRpbWUuICovCisJCQl1bFN5c1RpY2tDVFJMID0gcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRzsKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHVsU3lzVGlja0NUUkwgJiB+cG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUICk7CisKKwkJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIC0gc2VlIGNvbW1lbnRzIGFib3ZlIF9fZGlzYWJsZV9pbnRlcnJ1cHQoKQorCQkJY2FsbCBhYm92ZS4gKi8KKwkJCV9fZW5hYmxlX2ludGVycnVwdCgpOworCisJCQlpZiggKCB1bFN5c1RpY2tDVFJMICYgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVCApICE9IDAgKQorCQkJeworCQkJCXVpbnQzMl90IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBoYXMgYWxyZWFkeSBleGVjdXRlZCwgYW5kIHRoZSBTeXNUaWNrCisJCQkJY291bnQgcmVsb2FkZWQgd2l0aCB1bFJlbG9hZFZhbHVlLiAgUmVzZXQgdGhlCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyB3aXRoIHdoYXRldmVyIHJlbWFpbnMgb2YgdGhpcyB0aWNrCisJCQkJcGVyaW9kLiAqLworCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKSAtICggdWxSZWxvYWRWYWx1ZSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgKTsKKworCQkJCS8qIERvbid0IGFsbG93IGEgdGlueSB2YWx1ZSwgb3IgdmFsdWVzIHRoYXQgaGF2ZSBzb21laG93CisJCQkJdW5kZXJmbG93ZWQgYmVjYXVzZSB0aGUgcG9zdCBzbGVlcCBob29rIGRpZCBzb21ldGhpbmcKKwkJCQl0aGF0IHRvb2sgdG9vIGxvbmcuICovCisJCQkJaWYoICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlIDwgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKSB8fCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA+IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgKQorCQkJCXsKKwkJCQkJdWxDYWxjdWxhdGVkTG9hZFZhbHVlID0gKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTCApOworCQkJCX0KKworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bENhbGN1bGF0ZWRMb2FkVmFsdWU7CisKKwkJCQkvKiBUaGUgdGljayBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIGFscmVhZHkgaGF2ZSBwZW5kZWQgdGhlIHRpY2sKKwkJCQlwcm9jZXNzaW5nIGluIHRoZSBrZXJuZWwuICBBcyB0aGUgcGVuZGluZyB0aWNrIHdpbGwgYmUKKwkJCQlwcm9jZXNzZWQgYXMgc29vbiBhcyB0aGlzIGZ1bmN0aW9uIGV4aXRzLCB0aGUgdGljayB2YWx1ZQorCQkJCW1haW50YWluZWQgYnkgdGhlIHRpY2sgaXMgc3RlcHBlZCBmb3J3YXJkIGJ5IG9uZSBsZXNzIHRoYW4gdGhlCisJCQkJdGltZSBzcGVudCB3YWl0aW5nLiAqLworCQkJCXVsQ29tcGxldGVUaWNrUGVyaW9kcyA9IHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIFNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSB0aWNrIGludGVycnVwdCBlbmRlZCB0aGUgc2xlZXAuCisJCQkJV29yayBvdXQgaG93IGxvbmcgdGhlIHNsZWVwIGxhc3RlZCByb3VuZGVkIHRvIGNvbXBsZXRlIHRpY2sKKwkJCQlwZXJpb2RzIChub3QgdGhlIHVsUmVsb2FkIHZhbHVlIHdoaWNoIGFjY291bnRlZCBmb3IgcGFydAorCQkJCXRpY2tzKS4gKi8KKwkJCQl1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzID0gKCB4RXhwZWN0ZWRJZGxlVGltZSAqIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHOworCisJCQkJLyogSG93IG1hbnkgY29tcGxldGUgdGljayBwZXJpb2RzIHBhc3NlZCB3aGlsZSB0aGUgcHJvY2Vzc29yCisJCQkJd2FzIHdhaXRpbmc/ICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0gdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cyAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCisJCQkJLyogVGhlIHJlbG9hZCB2YWx1ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgZnJhY3Rpb24gb2YgYSBzaW5nbGUgdGljaworCQkJCXBlcmlvZCByZW1haW5zLiAqLworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSAoICggdWxDb21wbGV0ZVRpY2tQZXJpb2RzICsgMVVMICkgKiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApIC0gdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50czsKKwkJCX0KKworCQkJLyogUmVzdGFydCBTeXNUaWNrIHNvIGl0IHJ1bnMgZnJvbSBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHCisJCQlhZ2FpbiwgdGhlbiBzZXQgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyBiYWNrIHRvIGl0cyBzdGFuZGFyZAorCQkJdmFsdWUuICBUaGUgY3JpdGljYWwgc2VjdGlvbiBpcyB1c2VkIHRvIGVuc3VyZSB0aGUgdGljayBpbnRlcnJ1cHQKKwkJCWNhbiBvbmx5IGV4ZWN1dGUgb25jZSBpbiB0aGUgY2FzZSB0aGF0IHRoZSByZWxvYWQgcmVnaXN0ZXIgaXMgbmVhcgorCQkJemVyby4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisJCQlwb3J0RU5URVJfQ1JJVElDQUwoKTsKKwkJCXsKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKwkJCQl2VGFza1N0ZXBUaWNrKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKTsKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUw7CisJCQl9CisJCQlwb3J0RVhJVF9DUklUSUNBTCgpOworCQl9CisJfQorCisjZW5kaWYgLyogI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNldHVwIHRoZSBzeXN0aWNrIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMgYXQgdGhlIHJlcXVpcmVkCisgKiBmcmVxdWVuY3kuCisgKi8KK19fd2VhayB2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCit7CisJLyogQ2FsY3VsYXRlIHRoZSBjb25zdGFudHMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSB0aWNrIGludGVycnVwdC4gKi8KKwkjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXsKKwkJdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKTsKKwkJeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IHBvcnRNQVhfMjRfQklUX05VTUJFUiAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCQl1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUiAvICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnU1lTVElDS19DTE9DS19IWiApOworCX0KKwkjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworCS8qIENvbmZpZ3VyZSBTeXNUaWNrIHRvIGludGVycnVwdCBhdCB0aGUgcmVxdWVzdGVkIHJhdGUuICovCisJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC0gMVVMOworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkKK3sKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fOworZXh0ZXJuIHVpbnQzMl90IF9fRkxBU0hfc2VnbWVudF9zdGFydF9fOworZXh0ZXJuIHVpbnQzMl90IF9fRkxBU0hfc2VnbWVudF9lbmRfXzsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fOworCisJCS8qIEZpcnN0IHNldHVwIHRoZSBlbnRpcmUgZmxhc2ggZm9yIHVucHJpdmlsZWdlZCByZWFkIG9ubHkgYWNjZXNzLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCQkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfZW5kX18gLSAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIFNldHVwIHRoZSBmaXJzdCAxNksgZm9yIHByaXZpbGVnZWQgb25seSBhY2Nlc3MgKGV2ZW4gdGhvdWdoIGxlc3MKKwkJdGhhbiAxMEsgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCkuICBUaGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgY29kZSBpcworCQlwbGFjZWQuICovCisJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJCQkJCQkoIHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9PTkxZICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCQkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX18gLSAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIFNldHVwIHRoZSBwcml2aWxlZ2VkIGRhdGEgUkFNIHJlZ2lvbi4gIFRoaXMgaXMgd2hlcmUgdGhlIGtlcm5lbCBkYXRhCisJCWlzIHBsYWNlZC4gKi8KKwkJcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRyA9CSggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OICk7CisKKwkJcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRyA9CSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCQkJCQkJcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXyAtICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogQnkgZGVmYXVsdCBhbGxvdyBldmVyeXRoaW5nIHRvIGFjY2VzcyB0aGUgZ2VuZXJhbCBwZXJpcGhlcmFscy4gIFRoZQorCQlzeXN0ZW0gcGVyaXBoZXJhbHMgYW5kIHJlZ2lzdGVycyBhcmUgcHJvdGVjdGVkLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCBwb3J0UEVSSVBIRVJBTFNfU1RBUlRfQUREUkVTUyApIHwKKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0R0VORVJBTF9QRVJJUEhFUkFMU19SRUdJT04gKTsKKworCQlwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHID0JKCBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFIHwgcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApIHwKKwkJCQkJCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCBwb3J0UEVSSVBIRVJBTFNfRU5EX0FERFJFU1MgLSBwb3J0UEVSSVBIRVJBTFNfU1RBUlRfQUREUkVTUyApICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogRW5hYmxlIHRoZSBtZW1vcnkgZmF1bHQgZXhjZXB0aW9uLiAqLworCQlwb3J0TlZJQ19TWVNfQ1RSTF9TVEFURV9SRUcgfD0gcG9ydE5WSUNfTUVNX0ZBVUxUX0VOQUJMRTsKKworCQkvKiBFbmFibGUgdGhlIE1QVSB3aXRoIHRoZSBiYWNrZ3JvdW5kIHJlZ2lvbiBjb25maWd1cmVkLiAqLworCQlwb3J0TVBVX0NUUkxfUkVHIHw9ICggcG9ydE1QVV9FTkFCTEUgfCBwb3J0TVBVX0JBQ0tHUk9VTkRfRU5BQkxFICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVpbnQzMl90IHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1aW50MzJfdCB1bEFjdHVhbFNpemVJbkJ5dGVzICkKK3sKK3VpbnQzMl90IHVsUmVnaW9uU2l6ZSwgdWxSZXR1cm5WYWx1ZSA9IDQ7CisKKwkvKiAzMiBpcyB0aGUgc21hbGxlc3QgcmVnaW9uIHNpemUsIDMxIGlzIHRoZSBsYXJnZXN0IHZhbGlkIHZhbHVlIGZvcgorCXVsUmV0dXJuVmFsdWUuICovCisJZm9yKCB1bFJlZ2lvblNpemUgPSAzMlVMOyB1bFJldHVyblZhbHVlIDwgMzFVTDsgKCB1bFJlZ2lvblNpemUgPDw9IDFVTCApICkKKwl7CisJCWlmKCB1bEFjdHVhbFNpemVJbkJ5dGVzIDw9IHVsUmVnaW9uU2l6ZSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJeworCQkJdWxSZXR1cm5WYWx1ZSsrOworCQl9CisJfQorCisJLyogU2hpZnQgdGhlIGNvZGUgYnkgb25lIGJlZm9yZSByZXR1cm5pbmcgc28gaXQgY2FuIGJlIHdyaXR0ZW4gZGlyZWN0bHkKKwlpbnRvIHRoZSB0aGUgY29ycmVjdCBiaXQgcG9zaXRpb24gb2YgdGhlIGF0dHJpYnV0ZSByZWdpc3Rlci4gKi8KKwlyZXR1cm4gKCB1bFJldHVyblZhbHVlIDw8IDFVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHZQb3J0U3RvcmVUYXNrTVBVU2V0dGluZ3MoIHhNUFVfU0VUVElOR1MgKnhNUFVTZXR0aW5ncywgY29uc3Qgc3RydWN0IHhNRU1PUllfUkVHSU9OICogY29uc3QgeFJlZ2lvbnMsIFN0YWNrVHlwZV90ICpweEJvdHRvbU9mU3RhY2ssIHVpbnQzMl90IHVsU3RhY2tEZXB0aCApCit7CitleHRlcm4gdWludDMyX3QgX19TUkFNX3NlZ21lbnRfc3RhcnRfXzsKK2V4dGVybiB1aW50MzJfdCBfX1NSQU1fc2VnbWVudF9lbmRfXzsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fOworCisJCitpbnQzMl90IGxJbmRleDsKK3VpbnQzMl90IHVsOworCisJaWYoIHhSZWdpb25zID09IE5VTEwgKQorCXsKKwkJLyogTm8gTVBVIHJlZ2lvbnMgYXJlIHNwZWNpZmllZCBzbyBhbGxvdyBhY2Nlc3MgdG8gYWxsIFJBTS4gKi8KKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJKCAoIHVpbnQzMl90ICkgX19TUkFNX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJKCBwb3J0U1RBQ0tfUkVHSU9OICk7CisKKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApIHwKKwkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX1NSQU1fc2VnbWVudF9lbmRfXyAtICggdWludDMyX3QgKSBfX1NSQU1fc2VnbWVudF9zdGFydF9fICkgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBSZS1pbnN0YXRlIHRoZSBwcml2aWxlZ2VkIG9ubHkgUkFNIHJlZ2lvbiBhcyB4UmVnaW9uWyAwIF0gd2lsbCBoYXZlCisJCWp1c3QgcmVtb3ZlZCB0aGUgcHJpdmlsZWdlZCBvbmx5IHBhcmFtZXRlcnMuICovCisJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMSBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPQorCQkJCSggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCSggcG9ydFNUQUNLX1JFR0lPTiArIDEgKTsKKworCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDEgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQlwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fIC0gKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBJbnZhbGlkYXRlIGFsbCBvdGhlciByZWdpb25zLiAqLworCQlmb3IoIHVsID0gMjsgdWwgPD0gcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUzsgdWwrKyApCisJCXsKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0gKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKSB8IHBvcnRNUFVfUkVHSU9OX1ZBTElEOworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQXR0cmlidXRlID0gMFVMOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdGFzayBpcyBjcmVhdGVkIC0gaW4KKwkJd2hpY2ggY2FzZSB0aGUgc3RhY2sgcmVnaW9uIHBhcmFtZXRlcnMgd2lsbCBiZSB2YWxpZC4gIEF0IGFsbCBvdGhlcgorCQl0aW1lcyB0aGUgc3RhY2sgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSB2YWxpZCBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZQorCQlzdGFjayByZWdpb24gaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLiAqLworCQlpZiggdWxTdGFja0RlcHRoID4gMCApCisJCXsKKwkJCS8qIERlZmluZSB0aGUgcmVnaW9uIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgc3RhY2suICovCisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDAgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0KKwkJCQkJKCAoIHVpbnQzMl90ICkgcHhCb3R0b21PZlN0YWNrICkgfAorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkoIHBvcnRTVEFDS19SRUdJT04gKTsgLyogUmVnaW9uIG51bWJlci4gKi8KKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8IC8qIFJlYWQgYW5kIHdyaXRlLiAqLworCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1bFN0YWNrRGVwdGggKiAoIHVpbnQzMl90ICkgc2l6ZW9mKCBTdGFja1R5cGVfdCApICkgKSB8CisJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisJCX0KKworCQlsSW5kZXggPSAwOworCisJCWZvciggdWwgPSAxOyB1bCA8PSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TOyB1bCsrICkKKwkJeworCQkJaWYoICggeFJlZ2lvbnNbIGxJbmRleCBdICkudWxMZW5ndGhJbkJ5dGVzID4gMFVMICkKKwkJCXsKKwkJCQkvKiBUcmFuc2xhdGUgdGhlIGdlbmVyaWMgcmVnaW9uIGRlZmluaXRpb24gY29udGFpbmVkIGluCisJCQkJeFJlZ2lvbnMgaW50byB0aGUgQ00zIHNwZWNpZmljIE1QVSBzZXR0aW5ncyB0aGF0IGFyZSB0aGVuCisJCQkJc3RvcmVkIGluIHhNUFVTZXR0aW5ncy4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJCQkoICggdWludDMyX3QgKSB4UmVnaW9uc1sgbEluZGV4IF0ucHZCYXNlQWRkcmVzcyApIHwKKwkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkoIHBvcnRTVEFDS19SRUdJT04gKyB1bCApOyAvKiBSZWdpb24gbnVtYmVyLiAqLworCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQXR0cmlidXRlID0KKwkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgKSApIHwKKwkJCQkJCSggeFJlZ2lvbnNbIGxJbmRleCBdLnVsUGFyYW1ldGVycyApIHwKKwkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogSW52YWxpZGF0ZSB0aGUgcmVnaW9uLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0gKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKSB8IHBvcnRNUFVfUkVHSU9OX1ZBTElEOworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9IDBVTDsKKwkJCX0KKworCQkJbEluZGV4Kys7CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKQorCXsKKwl1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CisJdWludDhfdCB1Y0N1cnJlbnRQcmlvcml0eTsKKworCQkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApICk7CisKKwkJLyogSXMgdGhlIGludGVycnVwdCBudW1iZXIgYSB1c2VyIGRlZmluZWQgaW50ZXJydXB0PyAqLworCQlpZiggdWxDdXJyZW50SW50ZXJydXB0ID49IHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKQorCQl7CisJCQkvKiBMb29rIHVwIHRoZSBpbnRlcnJ1cHQncyBwcmlvcml0eS4gKi8KKwkJCXVjQ3VycmVudFByaW9yaXR5ID0gcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVyc1sgdWxDdXJyZW50SW50ZXJydXB0IF07CisKKwkJCS8qIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZiBhIHNlcnZpY2Ugcm91dGluZSAoSVNSKSBmb3IKKwkJCWFuIGludGVycnVwdCB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYWJvdmUKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBjYWxscyBhbiBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJCWZ1bmN0aW9uLiAgSVNSIHNhZmUgRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBtdXN0ICpvbmx5KiBiZSBjYWxsZWQKKwkJCWZyb20gaW50ZXJydXB0cyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGF0IG9yIGJlbG93CisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCU51bWVyaWNhbGx5IGxvdyBpbnRlcnJ1cHQgcHJpb3JpdHkgbnVtYmVycyByZXByZXNlbnQgbG9naWNhbGx5IGhpZ2gKKwkJCWludGVycnVwdCBwcmlvcml0aWVzLCB0aGVyZWZvcmUgdGhlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQgbXVzdAorCQkJYmUgc2V0IHRvIGEgdmFsdWUgZXF1YWwgdG8gb3IgbnVtZXJpY2FsbHkgKmhpZ2hlciogdGhhbgorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlJbnRlcnJ1cHRzIHRoYXQJdXNlIHRoZSBGcmVlUlRPUyBBUEkgbXVzdCBub3QgYmUgbGVmdCBhdCB0aGVpcgorCQkJZGVmYXVsdCBwcmlvcml0eSBvZgl6ZXJvIGFzIHRoYXQgaXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgcHJpb3JpdHksCisJCQl3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSwKKwkJCWFuZAl0aGVyZWZvcmUgYWxzbyBndWFyYW50ZWVkIHRvIGJlIGludmFsaWQuCisKKwkJCUZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvIGVuc3VyZQorCQkJaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQkJVGhlIGZvbGxvd2luZyBsaW5rcyBwcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uOgorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbAorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvRkFRSGVscC5odG1sICovCisJCQljb25maWdBU1NFUlQoIHVjQ3VycmVudFByaW9yaXR5ID49IHVjTWF4U3lzQ2FsbFByaW9yaXR5ICk7CisJCX0KKworCQkvKiBQcmlvcml0eSBncm91cGluZzogIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykgYWxsb3dzIHRoZSBiaXRzCisJCXRoYXQgZGVmaW5lIGVhY2ggaW50ZXJydXB0J3MgcHJpb3JpdHkgdG8gYmUgc3BsaXQgYmV0d2VlbiBiaXRzIHRoYXQKKwkJZGVmaW5lIHRoZSBpbnRlcnJ1cHQncyBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzIGFuZCBiaXRzIHRoYXQgZGVmaW5lCisJCXRoZSBpbnRlcnJ1cHQncyBzdWItcHJpb3JpdHkuICBGb3Igc2ltcGxpY2l0eSBhbGwgYml0cyBtdXN0IGJlIGRlZmluZWQKKwkJdG8gYmUgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cy4gIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZgorCQl0aGlzIGlzIG5vdCB0aGUgY2FzZSAoaWYgc29tZSBiaXRzIHJlcHJlc2VudCBhIHN1Yi1wcmlvcml0eSkuCisKKwkJSWYgdGhlIGFwcGxpY2F0aW9uIG9ubHkgdXNlcyBDTVNJUyBsaWJyYXJpZXMgZm9yIGludGVycnVwdAorCQljb25maWd1cmF0aW9uIHRoZW4gdGhlIGNvcnJlY3Qgc2V0dGluZyBjYW4gYmUgYWNoaWV2ZWQgb24gYWxsIENvcnRleC1NCisJCWRldmljZXMgYnkgY2FsbGluZyBOVklDX1NldFByaW9yaXR5R3JvdXBpbmcoIDAgKTsgYmVmb3JlIHN0YXJ0aW5nIHRoZQorCQlzY2hlZHVsZXIuICBOb3RlIGhvd2V2ZXIgdGhhdCBzb21lIHZlbmRvciBzcGVjaWZpYyBwZXJpcGhlcmFsIGxpYnJhcmllcworCQlhc3N1bWUgYSBub24temVybyBwcmlvcml0eSBncm91cCBzZXR0aW5nLCBpbiB3aGljaCBjYXNlcyB1c2luZyBhIHZhbHVlCisJCW9mIHplcm8gd2lsbCByZXN1bHQgaW4gdW5wcmVkaWNhYmxlIGJlaGF2aW91ci4gKi8KKwkJY29uZmlnQVNTRVJUKCAoIHBvcnRBSVJDUl9SRUcgJiBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSyApIDw9IHVsTWF4UFJJR1JPVVBWYWx1ZSApOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydGFzbS5zIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRhc20ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2U4ZjMxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRhc20ucwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpbmNsdWRlIDxGcmVlUlRPU0NvbmZpZy5oPgorCisJUlNFRyAgICBDT0RFOkNPREUoMikKKwl0aHVtYgorCisJRVhURVJOIHB4Q3VycmVudFRDQgorCUVYVEVSTiB2VGFza1N3aXRjaENvbnRleHQKKyAgICAgICAgRVhURVJOIHZTVkNIYW5kbGVyCisKKwlQVUJMSUMgeFBvcnRQZW5kU1ZIYW5kbGVyCisJUFVCTElDIHZQb3J0U1ZDSGFuZGxlcgorCVBVQkxJQyB2UG9ydFN0YXJ0Rmlyc3RUYXNrCisgICAgICAgIFBVQkxJQyB2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzaworCVBVQkxJQyB2UG9ydEVuYWJsZVZGUAorICAgICAgICBQVUJMSUMgeFBvcnRSYWlzZVByaXZpbGVnZQorICAgICAgICBQVUJMSUMgdlBvcnRTd2l0Y2hUb1VzZXJNb2RlCisgICAgICAgIAorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit4UG9ydFBlbmRTVkhhbmRsZXI6CisJbXJzIHIwLCBwc3AKKwlpc2IKKwkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IKKwlsZHIJcjIsIFtyM10KKworCS8qIElzIHRoZSB0YXNrIHVzaW5nIHRoZSBGUFUgY29udGV4dD8gIElmIHNvLCBwdXNoIGhpZ2ggdmZwIHJlZ2lzdGVycy4gKi8KKwl0c3QgcjE0LCAjMHgxMAorCWl0IGVxCisJdnN0bWRiZXEgcjAhLCB7czE2LXMzMX0KKworCW1ycyByMSwgY29udHJvbAorICAgICAgICAvKiBTYXZlIHRoZSBjb3JlIHJlZ2lzdGVycy4gKi8KKwlzdG1kYiByMCEsIHtyMSwgcjQtcjExLCByMTR9CisKKwkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGludG8gdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgVENCLiAqLworCXN0ciByMCwgW3IyXQorCisJc3RtZGIgc3AhLCB7cjN9CisJbW92IHIwLCAjY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZCisgIGNwc2lkIGkKKwltc3IgYmFzZXByaSwgcjAKKwlkc2IKKwlpc2IKKyAgY3BzaWUgaQorCWJsIHZUYXNrU3dpdGNoQ29udGV4dAorCW1vdiByMCwgIzAKKwltc3IgYmFzZXByaSwgcjAKKwlsZG1pYSBzcCEsIHtyM30KKworCS8qIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJbGRyIHIxLCBbcjNdCisJbGRyIHIwLCBbcjFdCisgICAgICAgIAorIAlhZGQgcjEsIHIxLCAjNAkJCQkJLyogTW92ZSBvbnRvIHRoZSBzZWNvbmQgaXRlbSBpbiB0aGUgVENCLi4uICovCisJbGRyIHIyLCA9MHhlMDAwZWQ5YwkJCQkvKiBSZWdpb24gQmFzZSBBZGRyZXNzIHJlZ2lzdGVyLiAqLworCWxkbWlhIHIxISwge3I0LXIxMX0JCQkJLyogUmVhZCA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwlzdG1pYSByMiEsIHtyNC1yMTF9CQkJCS8qIFdyaXRlIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCisJLyogUG9wIHRoZSBjb3JlIHJlZ2lzdGVycy4gKi8KKwlsZG1pYSByMCEsIHtyMy1yMTEsIHIxNH0KKyAgICAgICAgbXNyIGNvbnRyb2wsIHIzCisKKwkvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcG9wIHRoZSBoaWdoIHZmcCByZWdpc3RlcnMKKwl0b28uICovCisJdHN0IHIxNCwgIzB4MTAKKwlpdCBlcQorCXZsZG1pYWVxIHIwISwge3MxNi1zMzF9CisKKwltc3IgcHNwLCByMAorCWlzYgorCSNpZmRlZiBXT1JLQVJPVU5EX1BNVV9DTTAwMSAvKiBYTUM0MDAwIHNwZWNpZmljIGVycmF0YSAqLworCQkjaWYgV09SS0FST1VORF9QTVVfQ00wMDEgPT0gMQorCQkJcHVzaCB7IHIxNCB9CisJCQlwb3AgeyBwYyB9CisJCSNlbmRpZgorCSNlbmRpZgorCisJYnggcjE0CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0U1ZDSGFuZGxlcjoKKwkvKiBBc3N1bWVzIHBzcCB3YXMgaW4gdXNlLiAqLworCSNpZm5kZWYgVVNFX1BST0NFU1NfU1RBQ0sJLyogQ29kZSBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGlmIGEgbWFpbigpIGlzIHVzaW5nIHRoZSBwcm9jZXNzIHN0YWNrLiAqLworCQl0c3QgbHIsICM0CisJCWl0ZSBlcQorCQltcnNlcSByMCwgbXNwCisJCW1yc25lIHIwLCBwc3AKKwkjZWxzZQorCQltcnMgcjAsIHBzcAorCSNlbmRpZgorCQliIHZTVkNIYW5kbGVyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2UG9ydFN0YXJ0Rmlyc3RUYXNrOgorCS8qIFVzZSB0aGUgTlZJQyBvZmZzZXQgcmVnaXN0ZXIgdG8gbG9jYXRlIHRoZSBzdGFjay4gKi8KKwlsZHIgcjAsID0weEUwMDBFRDA4CisJbGRyIHIwLCBbcjBdCisJbGRyIHIwLCBbcjBdCisJLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCW1zciBtc3AsIHIwCisJLyogQ2FsbCBTVkMgdG8gc3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJY3BzaWUgaQorCWNwc2llIGYKKwlkc2IKKwlpc2IKKwlzdmMgMAkvKiBTeXN0ZW0gY2FsbCB0byBzdGFydCBmaXJzdCB0YXNrLiAqLworICAKK3ZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrOgorCisJbGRyIHIwLCA9MHhFMDAwRUQwOAkJCQkvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJbGRyIHIwLCBbcjBdCisJbGRyIHIwLCBbcjBdCisJbXNyIG1zcCwgcjAJCQkJCQkvKiBTZXQgdGhlIG1zcCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJbGRyCXIzLCA9cHhDdXJyZW50VENCCQkJLyogUmVzdG9yZSB0aGUgY29udGV4dC4gKi8KKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0JCQkJCS8qIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCWFkZCByMSwgcjEsICM0CQkJCQkvKiBNb3ZlIG9udG8gdGhlIHNlY29uZCBpdGVtIGluIHRoZSBUQ0IuLi4gKi8KKwlsZHIgcjIsID0weGUwMDBlZDljCQkJCS8qIFJlZ2lvbiBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIuICovCisJbGRtaWEgcjEhLCB7cjQtcjExfQkJCQkvKiBSZWFkIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCXN0bWlhIHIyISwge3I0LXIxMX0JCQkJLyogV3JpdGUgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJbGRtaWEgcjAhLCB7cjMtcjExLCByMTR9CS8qIFBvcCB0aGUgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNhdmVkIG9uIGV4Y2VwdGlvbiBlbnRyeS4gKi8KKwltc3IgY29udHJvbCwgcjMKKwltc3IgcHNwLCByMAkJCQkJCS8qIFJlc3RvcmUgdGhlIHRhc2sgc3RhY2sgcG9pbnRlci4gKi8KKwltb3YgcjAsICMwCisJbXNyCWJhc2VwcmksIHIwCisJYnggcjE0CisgIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0RW5hYmxlVkZQOgorCS8qIFRoZSBGUFUgZW5hYmxlIGJpdHMgYXJlIGluIHRoZSBDUEFDUi4gKi8KKwlsZHIudyByMCwgPTB4RTAwMEVEODgKKwlsZHIJcjEsIFtyMF0KKworCS8qIEVuYWJsZSBDUDEwIGFuZCBDUDExIGNvcHJvY2Vzc29ycywgdGhlbiBzYXZlIGJhY2suICovCisJb3JyCXIxLCByMSwgIyggMHhmIDw8IDIwICkKKwlzdHIgcjEsIFtyMF0KKwlieAlyMTQKKworeFBvcnRSYWlzZVByaXZpbGVnZToKKwltcnMgcjAsIGNvbnRyb2wKKwl0c3QgcjAsICMxCQkJCQkJLyogSXMgdGhlIHRhc2sgcnVubmluZyBwcml2aWxlZ2VkPyAqLworCWl0dGUgbmUKKwltb3ZuZSByMCwgIzAJCQkJCS8qIENPTlRST0xbMF0hPTAsIHJldHVybiBmYWxzZS4gKi8KKwlzdmNuZSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBTd2l0Y2ggdG8gcHJpdmlsZWdlZC4gKi8KKwltb3ZlcSByMCwgIzEJCQkJCS8qIENPTlRST0xbMF09PTAsIHJldHVybiB0cnVlLiAqLworCWJ4IGxyCisgICAgICAgIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCit2UG9ydFN3aXRjaFRvVXNlck1vZGU6CisJCisJbXJzIHIwLCBjb250cm9sCisJb3JyIHIwLCByMCwgIzEKKwltc3IgY29udHJvbCwgcjAKKwlieCByMTQKKworCUVORAorCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkNGU0NQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaApAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgUE9SVE1BQ1JPX0gKKyNkZWZpbmUgUE9SVE1BQ1JPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb3J0IHNwZWNpZmljIGRlZmluaXRpb25zLgorICoKKyAqIFRoZSBzZXR0aW5ncyBpbiB0aGlzIGZpbGUgY29uZmlndXJlIEZyZWVSVE9TIGNvcnJlY3RseSBmb3IgdGhlCisgKiBnaXZlbiBoYXJkd2FyZSBhbmQgY29tcGlsZXIuCisgKgorICogVGhlc2Ugc2V0dGluZ3Mgc2hvdWxkIG5vdCBiZSBhbHRlcmVkLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIFR5cGUgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIHBvcnRDSEFSCQljaGFyCisjZGVmaW5lIHBvcnRGTE9BVAkJZmxvYXQKKyNkZWZpbmUgcG9ydERPVUJMRQkJZG91YmxlCisjZGVmaW5lIHBvcnRMT05HCQlsb25nCisjZGVmaW5lIHBvcnRTSE9SVAkJc2hvcnQKKyNkZWZpbmUgcG9ydFNUQUNLX1RZUEUJdWludDMyX3QKKyNkZWZpbmUgcG9ydEJBU0VfVFlQRQlsb25nCisKK3R5cGVkZWYgcG9ydFNUQUNLX1RZUEUgU3RhY2tUeXBlX3Q7Cit0eXBlZGVmIGxvbmcgQmFzZVR5cGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVQmFzZVR5cGVfdDsKKworI2lmKCBjb25maWdVU0VfMTZfQklUX1RJQ0tTID09IDEgKQorCXR5cGVkZWYgdWludDE2X3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkgMHhmZmZmCisjZWxzZQorCXR5cGVkZWYgdWludDMyX3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkgMHhmZmZmZmZmZlVMCisKKwkvKiAzMi1iaXQgdGljayB0eXBlIG9uIGEgMzItYml0IGFyY2hpdGVjdHVyZSwgc28gcmVhZHMgb2YgdGhlIHRpY2sgY291bnQgZG8KKwlub3QgbmVlZCB0byBiZSBndWFyZGVkIHdpdGggYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCSNkZWZpbmUgcG9ydFRJQ0tfVFlQRV9JU19BVE9NSUMgMQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogTVBVIHNwZWNpZmljIGNvbnN0YW50cy4gKi8KKyNkZWZpbmUgcG9ydFVTSU5HX01QVV9XUkFQUEVSUwkJMQorI2RlZmluZSBwb3J0UFJJVklMRUdFX0JJVAkJCSggMHg4MDAwMDAwMFVMICkKKworI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFCQkJCSggMHgwM1VMIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWQkJKCAweDA1VUwgPDwgMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWQkJCQkoIDB4MDZVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFCSggMHgwMVVMIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRQkJKCAweDA3VUwgPDwgMTZVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIJCQkoIDB4MDFVTCA8PCAyOFVMICkKKworI2RlZmluZSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJKCAwVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkoIDFVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT04JCQkoIDJVTCApCisjZGVmaW5lIHBvcnRHRU5FUkFMX1BFUklQSEVSQUxTX1JFR0lPTgkJKCAzVUwgKQorI2RlZmluZSBwb3J0U1RBQ0tfUkVHSU9OCQkJCQkoIDRVTCApCisjZGVmaW5lIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OCSAgICAoIDVVTCApCisjZGVmaW5lIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04JCSggN1VMICkKKyNkZWZpbmUgcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUwkJKCAoIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04gLSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTiApICsgMSApCisjZGVmaW5lIHBvcnRUT1RBTF9OVU1fUkVHSU9OUwkJCQkoIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMgKyAxICkgLyogUGx1cyBvbmUgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIHN0YWNrIHJlZ2lvbi4gKi8KKwordm9pZCB2UG9ydFN3aXRjaFRvVXNlck1vZGUoIHZvaWQgKTsKKyNkZWZpbmUgcG9ydFNXSVRDSF9UT19VU0VSX01PREUoKQl2UG9ydFN3aXRjaFRvVXNlck1vZGUoKQorCit0eXBlZGVmIHN0cnVjdCBNUFVfUkVHSU9OX1JFR0lTVEVSUworeworCXVpbnQzMl90IHVsUmVnaW9uQmFzZUFkZHJlc3M7CisJdWludDMyX3QgdWxSZWdpb25BdHRyaWJ1dGU7Cit9IHhNUFVfUkVHSU9OX1JFR0lTVEVSUzsKKworLyogUGx1cyAxIHRvIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIHN0YWNrIHJlZ2lvbi4gKi8KK3R5cGVkZWYgc3RydWN0IE1QVV9TRVRUSU5HUworeworCXhNUFVfUkVHSU9OX1JFR0lTVEVSUyB4UmVnaW9uWyBwb3J0VE9UQUxfTlVNX1JFR0lPTlMgXTsKK30geE1QVV9TRVRUSU5HUzsKKworCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorCisvKiBTVkMgbnVtYmVycyBmb3IgdmFyaW91cyBzZXJ2aWNlcy4gKi8KKyNkZWZpbmUgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIJCQkJMAorI2RlZmluZSBwb3J0U1ZDX1lJRUxECQkJCQkJMQorI2RlZmluZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRQkJCQkyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2NoZWR1bGVyIHV0aWxpdGllcy4gKi8KKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQlcCisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8JCQlcCisJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsJCQlcCisJX19EU0IoKTsJCQkJCQkJCQkJCQlcCisJX19JU0IoKTsJCQkJCQkJCQkJCQlcCit9CisKKworCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUX0JJVAkJKCAxVUwgPDwgMjhVTCApCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkgaWYoIHhTd2l0Y2hSZXF1aXJlZCAhPSBwZEZBTFNFICkgcG9ydFlJRUxEKCkKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBvcHRpbWlzYXRpb25zLiAqLworI2lmbmRlZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04KKwkjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAxCisjZW5kaWYKKworI2lmIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiA9PSAxCisKKwkvKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KKwkjaWYoIGNvbmZpZ01BWF9QUklPUklUSUVTID4gMzIgKQorCQkjZXJyb3IgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIGNhbiBvbmx5IGJlIHNldCB0byAxIHdoZW4gY29uZmlnTUFYX1BSSU9SSVRJRVMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLiAgSXQgaXMgdmVyeSByYXJlIHRoYXQgYSBzeXN0ZW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEwIHRvIDE1IGRpZmZlcmVuY2UgcHJpb3JpdGllcyBhcyB0YXNrcyB0aGF0IHNoYXJlIGEgcHJpb3JpdHkgd2lsbCB0aW1lIHNsaWNlLgorCSNlbmRpZgorCisJLyogU3RvcmUvY2xlYXIgdGhlIHJlYWR5IHByaW9yaXRpZXMgaW4gYSBiaXQgbWFwLiAqLworCSNkZWZpbmUgcG9ydFJFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgfD0gKCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCSNkZWZpbmUgcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSAmPSB+KCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkjaW5jbHVkZSA8aW50cmluc2ljcy5oPgorCSNkZWZpbmUgcG9ydEdFVF9ISUdIRVNUX1BSSU9SSVRZKCB1eFRvcFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApIHV4VG9wUHJpb3JpdHkgPSAoIDMxVUwgLSAoICggdWludDMyX3QgKSBfX0NMWiggKCB1eFJlYWR5UHJpb3JpdGllcyApICkgKSApCisKKyNlbmRpZiAvKiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuICovCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICk7CisKKyNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQlcCisJIC8qIEVycmF0YSB3b3JrIGFyb3VuZC4gKi8JCQkJCQkJCVwKKwlfX2Rpc2FibGVfaW50ZXJydXB0KCk7CQkJCQkJCQkJXAorCV9fc2V0X0JBU0VQUkkoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOwlcCisJX19EU0IoKTsJCQkJCQkJCQkJCQlcCisJX19JU0IoKTsJCQkJCQkJCQkJCQlcCisJX19lbmFibGVfaW50ZXJydXB0KCk7CQkJCQkJCQkJXAorfQorCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQlfX3NldF9CQVNFUFJJKCAwICkKKyNkZWZpbmUgcG9ydEVOVEVSX0NSSVRJQ0FMKCkJCQkJCXZQb3J0RW50ZXJDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRFWElUX0NSSVRJQ0FMKCkJCQkJCQl2UG9ydEV4aXRDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQkJX19nZXRfQkFTRVBSSSgpOyBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkKKyNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKHgpCV9fc2V0X0JBU0VQUkkoIHggKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRpY2tsZXNzIGlkbGUvbG93IHBvd2VyIGZ1bmN0aW9uYWxpdHkuICovCisjaWZuZGVmIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAKKwlleHRlcm4gdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApOworCSNkZWZpbmUgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCggeEV4cGVjdGVkSWRsZVRpbWUgKSB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggeEV4cGVjdGVkSWRsZVRpbWUgKQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4gIFRoZXNlIGFyZQorbm90IG5lY2Vzc2FyeSBmb3IgdG8gdXNlIHRoaXMgcG9ydC4gIFRoZXkgYXJlIGRlZmluZWQgc28gdGhlIGNvbW1vbiBkZW1vIGZpbGVzCisod2hpY2ggYnVpbGQgd2l0aCBhbGwgdGhlIHBvcnRzKSB3aWxsIGJ1aWxkLiAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIGNvbmZpZ0FTU0VSVAorCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICk7CisJI2RlZmluZSBwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCkgCXZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSgpCisjZW5kaWYKKwordm9pZCB2U1ZDSGFuZGxlciggdWludDMyX3QgKnB1bFBhcmFtICk7Cit2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTdXBwcmVzcyB3YXJuaW5ncyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIElBUiB0b29scywgYnV0IGNhbm5vdCBiZSBmaXhlZCBpbgordGhlIHNvdXJjZSBjb2RlIGJlY2F1c2UgdG8gZG8gc28gd291bGQgY2F1c2Ugb3RoZXIgY29tcGlsZXJzIHRvIGdlbmVyYXRlCit3YXJuaW5ncy4gKi8KKyNwcmFnbWEgZGlhZ19zdXBwcmVzcz1QZTE5MQorI3ByYWdtYSBkaWFnX3N1cHByZXNzPVBhMDgyCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvS2VpbC9TZWUtYWxzby10aGUtUlZEUy1kaXJlY3RvcnkudHh0IGIvU291cmNlL3BvcnRhYmxlL0tlaWwvU2VlLWFsc28tdGhlLVJWRFMtZGlyZWN0b3J5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDdmYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0tlaWwvU2VlLWFsc28tdGhlLVJWRFMtZGlyZWN0b3J5LnR4dApAQCAtMCwwICsxIEBACitOb3RoaW5nIHRvIHNlZSBoZXJlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL1JlYWRNZS51cmwgYi9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9SZWFkTWUudXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjM3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9SZWFkTWUudXJsCkBAIC0wLDAgKzEsNSBAQAorW3swMDAyMTRBMC0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDZ9XQorUHJvcDM9MTksMgorW0ludGVybmV0U2hvcnRjdXRdCitVUkw9aHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTExLmh0bWwKK0lETGlzdD0KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMS5jIGIvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF8xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmNmRmYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMS5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCisvKgorICogVGhlIHNpbXBsZXN0IHBvc3NpYmxlIGltcGxlbWVudGF0aW9uIG9mIHB2UG9ydE1hbGxvYygpLiAgTm90ZSB0aGF0IHRoaXMKKyAqIGltcGxlbWVudGF0aW9uIGRvZXMgTk9UIGFsbG93IGFsbG9jYXRlZCBtZW1vcnkgdG8gYmUgZnJlZWQgYWdhaW4uCisgKgorICogU2VlIGhlYXBfMi5jLCBoZWFwXzMuYyBhbmQgaGVhcF80LmMgZm9yIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9ucywgYW5kIHRoZQorICogbWVtb3J5IG1hbmFnZW1lbnQgcGFnZXMgb2YgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiAgVGhhdCBzaG91bGQgb25seSBiZSBkb25lIHdoZW4KK3Rhc2suaCBpcyBpbmNsdWRlZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZpbGUuICovCisjZGVmaW5lIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMCApCisJI2Vycm9yIFRoaXMgZmlsZSBtdXN0IG5vdCBiZSB1c2VkIGlmIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OIGlzIDAKKyNlbmRpZgorCisvKiBBIGZldyBieXRlcyBtaWdodCBiZSBsb3N0IHRvIGJ5dGUgYWxpZ25pbmcgdGhlIGhlYXAgc3RhcnQgYWRkcmVzcy4gKi8KKyNkZWZpbmUgY29uZmlnQURKVVNURURfSEVBUF9TSVpFCSggY29uZmlnVE9UQUxfSEVBUF9TSVpFIC0gcG9ydEJZVEVfQUxJR05NRU5UICkKKworLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGhlYXAuICovCisvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgaGVhcC4gKi8KKyNpZiggY29uZmlnQVBQTElDQVRJT05fQUxMT0NBVEVEX0hFQVAgPT0gMSApCisJLyogVGhlIGFwcGxpY2F0aW9uIHdyaXRlciBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBhcnJheSB1c2VkIGZvciB0aGUgUlRPUworCWhlYXAgLSBwcm9iYWJseSBzbyBpdCBjYW4gYmUgcGxhY2VkIGluIGEgc3BlY2lhbCBzZWdtZW50IG9yIGFkZHJlc3MuICovCisJZXh0ZXJuIHVpbnQ4X3QgdWNIZWFwWyBjb25maWdUT1RBTF9IRUFQX1NJWkUgXTsKKyNlbHNlCisJc3RhdGljIHVpbnQ4X3QgdWNIZWFwWyBjb25maWdUT1RBTF9IRUFQX1NJWkUgXTsKKyNlbmRpZiAvKiBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCAqLworCisvKiBJbmRleCBpbnRvIHRoZSB1Y0hlYXAgYXJyYXkuICovCitzdGF0aWMgc2l6ZV90IHhOZXh0RnJlZUJ5dGUgPSAoIHNpemVfdCApIDA7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkICpwdlBvcnRNYWxsb2MoIHNpemVfdCB4V2FudGVkU2l6ZSApCit7Cit2b2lkICpwdlJldHVybiA9IE5VTEw7CitzdGF0aWMgdWludDhfdCAqcHVjQWxpZ25lZEhlYXAgPSBOVUxMOworCisJLyogRW5zdXJlIHRoYXQgYmxvY2tzIGFyZSBhbHdheXMgYWxpZ25lZCB0byB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJ5dGVzLiAqLworCSNpZiggcG9ydEJZVEVfQUxJR05NRU5UICE9IDEgKQorCXsKKwkJaWYoIHhXYW50ZWRTaXplICYgcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKQorCQl7CisJCQkvKiBCeXRlIGFsaWdubWVudCByZXF1aXJlZC4gKi8KKwkJCXhXYW50ZWRTaXplICs9ICggcG9ydEJZVEVfQUxJR05NRU5UIC0gKCB4V2FudGVkU2l6ZSAmIHBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgKTsKKwkJfQorCX0KKwkjZW5kaWYKKworCXZUYXNrU3VzcGVuZEFsbCgpOworCXsKKwkJaWYoIHB1Y0FsaWduZWRIZWFwID09IE5VTEwgKQorCQl7CisJCQkvKiBFbnN1cmUgdGhlIGhlYXAgc3RhcnRzIG9uIGEgY29ycmVjdGx5IGFsaWduZWQgYm91bmRhcnkuICovCisJCQlwdWNBbGlnbmVkSGVhcCA9ICggdWludDhfdCAqICkgKCAoICggcG9ydFBPSU5URVJfU0laRV9UWVBFICkgJnVjSGVhcFsgcG9ydEJZVEVfQUxJR05NRU5UIF0gKSAmICggfiggKCBwb3J0UE9JTlRFUl9TSVpFX1RZUEUgKSBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICkgKTsKKwkJfQorCisJCS8qIENoZWNrIHRoZXJlIGlzIGVub3VnaCByb29tIGxlZnQgZm9yIHRoZSBhbGxvY2F0aW9uLiAqLworCQlpZiggKCAoIHhOZXh0RnJlZUJ5dGUgKyB4V2FudGVkU2l6ZSApIDwgY29uZmlnQURKVVNURURfSEVBUF9TSVpFICkgJiYKKwkJCSggKCB4TmV4dEZyZWVCeXRlICsgeFdhbnRlZFNpemUgKSA+IHhOZXh0RnJlZUJ5dGUgKQkpLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAqLworCQl7CisJCQkvKiBSZXR1cm4gdGhlIG5leHQgZnJlZSBieXRlIHRoZW4gaW5jcmVtZW50IHRoZSBpbmRleCBwYXN0IHRoaXMKKwkJCWJsb2NrLiAqLworCQkJcHZSZXR1cm4gPSBwdWNBbGlnbmVkSGVhcCArIHhOZXh0RnJlZUJ5dGU7CisJCQl4TmV4dEZyZWVCeXRlICs9IHhXYW50ZWRTaXplOworCQl9CisKKwkJdHJhY2VNQUxMT0MoIHB2UmV0dXJuLCB4V2FudGVkU2l6ZSApOworCX0KKwkoIHZvaWQgKSB4VGFza1Jlc3VtZUFsbCgpOworCisJI2lmKCBjb25maWdVU0VfTUFMTE9DX0ZBSUxFRF9IT09LID09IDEgKQorCXsKKwkJaWYoIHB2UmV0dXJuID09IE5VTEwgKQorCQl7CisJCQlleHRlcm4gdm9pZCB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCB2b2lkICk7CisJCQl2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCk7CisJCX0KKwl9CisJI2VuZGlmCisKKwlyZXR1cm4gcHZSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEZyZWUoIHZvaWQgKnB2ICkKK3sKKwkvKiBNZW1vcnkgY2Fubm90IGJlIGZyZWVkIHVzaW5nIHRoaXMgc2NoZW1lLiAgU2VlIGhlYXBfMi5jLCBoZWFwXzMuYyBhbmQKKwloZWFwXzQuYyBmb3IgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zLCBhbmQgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHBhZ2VzIG9mCisJaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uICovCisJKCB2b2lkICkgcHY7CisKKwkvKiBGb3JjZSBhbiBhc3NlcnQgYXMgaXQgaXMgaW52YWxpZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24uICovCisJY29uZmlnQVNTRVJUKCBwdiA9PSBOVUxMICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEluaXRpYWxpc2VCbG9ja3MoIHZvaWQgKQoreworCS8qIE9ubHkgcmVxdWlyZWQgd2hlbiBzdGF0aWMgbWVtb3J5IGlzIG5vdCBjbGVhcmVkLiAqLworCXhOZXh0RnJlZUJ5dGUgPSAoIHNpemVfdCApIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhQb3J0R2V0RnJlZUhlYXBTaXplKCB2b2lkICkKK3sKKwlyZXR1cm4gKCBjb25maWdBREpVU1RFRF9IRUFQX1NJWkUgLSB4TmV4dEZyZWVCeXRlICk7Cit9CisKKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9oZWFwXzIuYyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MWI0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9oZWFwXzIuYwpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qCisgKiBBIHNhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBwdlBvcnRNYWxsb2MoKSBhbmQgdlBvcnRGcmVlKCkgdGhhdCBwZXJtaXRzCisgKiBhbGxvY2F0ZWQgYmxvY2tzIHRvIGJlIGZyZWVkLCBidXQgZG9lcyBub3QgY29tYmluZSBhZGphY2VudCBmcmVlIGJsb2NrcworICogaW50byBhIHNpbmdsZSBsYXJnZXIgYmxvY2sgKGFuZCBzbyB3aWxsIGZyYWdtZW50IG1lbW9yeSkuICBTZWUgaGVhcF80LmMgZm9yCisgKiBhbiBlcXVpdmFsZW50IHRoYXQgZG9lcyBjb21iaW5lIGFkamFjZW50IGJsb2NrcyBpbnRvIHNpbmdsZSBsYXJnZXIgYmxvY2tzLgorICoKKyAqIFNlZSBoZWFwXzEuYywgaGVhcF8zLmMgYW5kIGhlYXBfNC5jIGZvciBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMsIGFuZCB0aGUKKyAqIG1lbW9yeSBtYW5hZ2VtZW50IHBhZ2VzIG9mIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIERlZmluaW5nIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHByZXZlbnRzIHRhc2suaCBmcm9tIHJlZGVmaW5pbmcKK2FsbCB0aGUgQVBJIGZ1bmN0aW9ucyB0byB1c2UgdGhlIE1QVSB3cmFwcGVycy4gIFRoYXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuCit0YXNrLmggaXMgaW5jbHVkZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDAgKQorCSNlcnJvciBUaGlzIGZpbGUgbXVzdCBub3QgYmUgdXNlZCBpZiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiBpcyAwCisjZW5kaWYKKworLyogQSBmZXcgYnl0ZXMgbWlnaHQgYmUgbG9zdCB0byBieXRlIGFsaWduaW5nIHRoZSBoZWFwIHN0YXJ0IGFkZHJlc3MuICovCisjZGVmaW5lIGNvbmZpZ0FESlVTVEVEX0hFQVBfU0laRQkoIGNvbmZpZ1RPVEFMX0hFQVBfU0laRSAtIHBvcnRCWVRFX0FMSUdOTUVOVCApCisKKy8qCisgKiBJbml0aWFsaXNlcyB0aGUgaGVhcCBzdHJ1Y3R1cmVzIGJlZm9yZSB0aGVpciBmaXJzdCB1c2UuCisgKi8KK3N0YXRpYyB2b2lkIHBydkhlYXBJbml0KCB2b2lkICk7CisKKy8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoZSBoZWFwLiAqLworI2lmKCBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCA9PSAxICkKKwkvKiBUaGUgYXBwbGljYXRpb24gd3JpdGVyIGhhcyBhbHJlYWR5IGRlZmluZWQgdGhlIGFycmF5IHVzZWQgZm9yIHRoZSBSVE9TCisJaGVhcCAtIHByb2JhYmx5IHNvIGl0IGNhbiBiZSBwbGFjZWQgaW4gYSBzcGVjaWFsIHNlZ21lbnQgb3IgYWRkcmVzcy4gKi8KKwlleHRlcm4gdWludDhfdCB1Y0hlYXBbIGNvbmZpZ1RPVEFMX0hFQVBfU0laRSBdOworI2Vsc2UKKwlzdGF0aWMgdWludDhfdCB1Y0hlYXBbIGNvbmZpZ1RPVEFMX0hFQVBfU0laRSBdOworI2VuZGlmIC8qIGNvbmZpZ0FQUExJQ0FUSU9OX0FMTE9DQVRFRF9IRUFQICovCisKKworLyogRGVmaW5lIHRoZSBsaW5rZWQgbGlzdCBzdHJ1Y3R1cmUuICBUaGlzIGlzIHVzZWQgdG8gbGluayBmcmVlIGJsb2NrcyBpbiBvcmRlcgorb2YgdGhlaXIgc2l6ZS4gKi8KK3R5cGVkZWYgc3RydWN0IEFfQkxPQ0tfTElOSworeworCXN0cnVjdCBBX0JMT0NLX0xJTksgKnB4TmV4dEZyZWVCbG9jazsJLyo8PCBUaGUgbmV4dCBmcmVlIGJsb2NrIGluIHRoZSBsaXN0LiAqLworCXNpemVfdCB4QmxvY2tTaXplOwkJCQkJCS8qPDwgVGhlIHNpemUgb2YgdGhlIGZyZWUgYmxvY2suICovCit9IEJsb2NrTGlua190OworCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBoZWFwU1RSVUNUX1NJWkUJPSAoICggc2l6ZW9mICggQmxvY2tMaW5rX3QgKSArICggcG9ydEJZVEVfQUxJR05NRU5UIC0gMSApICkgJiB+cG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKTsKKyNkZWZpbmUgaGVhcE1JTklNVU1fQkxPQ0tfU0laRQkoICggc2l6ZV90ICkgKCBoZWFwU1RSVUNUX1NJWkUgKiAyICkgKQorCisvKiBDcmVhdGUgYSBjb3VwbGUgb2YgbGlzdCBsaW5rcyB0byBtYXJrIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBsaXN0LiAqLworc3RhdGljIEJsb2NrTGlua190IHhTdGFydCwgeEVuZDsKKworLyogS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBmcmVlIGJ5dGVzIHJlbWFpbmluZywgYnV0IHNheXMgbm90aGluZyBhYm91dAorZnJhZ21lbnRhdGlvbi4gKi8KK3N0YXRpYyBzaXplX3QgeEZyZWVCeXRlc1JlbWFpbmluZyA9IGNvbmZpZ0FESlVTVEVEX0hFQVBfU0laRTsKKworLyogU1RBVElDIEZVTkNUSU9OUyBBUkUgREVGSU5FRCBBUyBNQUNST1MgVE8gTUlOSU1JWkUgVEhFIEZVTkNUSU9OIENBTEwgREVQVEguICovCisKKy8qCisgKiBJbnNlcnQgYSBibG9jayBpbnRvIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzIC0gd2hpY2ggaXMgb3JkZXJlZCBieSBzaXplIG9mCisgKiB0aGUgYmxvY2suICBTbWFsbCBibG9ja3MgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0IGFuZCBsYXJnZSBibG9ja3MgYXQgdGhlIGVuZAorICogb2YgdGhlIGxpc3QuCisgKi8KKyNkZWZpbmUgcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoIHB4QmxvY2tUb0luc2VydCApCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorQmxvY2tMaW5rX3QgKnB4SXRlcmF0b3I7CQkJCQkJCQkJCQkJCQkJXAorc2l6ZV90IHhCbG9ja1NpemU7CQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJeEJsb2NrU2l6ZSA9IHB4QmxvY2tUb0luc2VydC0+eEJsb2NrU2l6ZTsJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCB1bnRpbCBhIGJsb2NrIGlzIGZvdW5kIHRoYXQgaGFzIGEgbGFyZ2VyIHNpemUgKi8JXAorCS8qIHRoYW4gdGhlIGJsb2NrIHdlIGFyZSBpbnNlcnRpbmcuICovCQkJCQkJCQkJCQlcCisJZm9yKCBweEl0ZXJhdG9yID0gJnhTdGFydDsgcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrLT54QmxvY2tTaXplIDwgeEJsb2NrU2l6ZTsgcHhJdGVyYXRvciA9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayApCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCS8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSAtIGp1c3QgaXRlcmF0ZSB0byB0aGUgY29ycmVjdCBwb3NpdGlvbi4gKi8JXAorCX0JCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBVcGRhdGUgdGhlIGxpc3QgdG8gaW5jbHVkZSB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQgaW4gdGhlIGNvcnJlY3QgKi8JCVwKKwkvKiBwb3NpdGlvbi4gKi8JCQkJCQkJCQkJCQkJCQkJCVwKKwlweEJsb2NrVG9JbnNlcnQtPnB4TmV4dEZyZWVCbG9jayA9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jazsJCQkJCVwKKwlweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgPSBweEJsb2NrVG9JbnNlcnQ7CQkJCQkJCQkJXAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgKnB2UG9ydE1hbGxvYyggc2l6ZV90IHhXYW50ZWRTaXplICkKK3sKK0Jsb2NrTGlua190ICpweEJsb2NrLCAqcHhQcmV2aW91c0Jsb2NrLCAqcHhOZXdCbG9ja0xpbms7CitzdGF0aWMgQmFzZVR5cGVfdCB4SGVhcEhhc0JlZW5Jbml0aWFsaXNlZCA9IHBkRkFMU0U7Cit2b2lkICpwdlJldHVybiA9IE5VTEw7CisKKwl2VGFza1N1c3BlbmRBbGwoKTsKKwl7CisJCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8gbWFsbG9jIHRoZW4gdGhlIGhlYXAgd2lsbCByZXF1aXJlCisJCWluaXRpYWxpc2F0aW9uIHRvIHNldHVwIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzLiAqLworCQlpZiggeEhlYXBIYXNCZWVuSW5pdGlhbGlzZWQgPT0gcGRGQUxTRSApCisJCXsKKwkJCXBydkhlYXBJbml0KCk7CisJCQl4SGVhcEhhc0JlZW5Jbml0aWFsaXNlZCA9IHBkVFJVRTsKKwkJfQorCisJCS8qIFRoZSB3YW50ZWQgc2l6ZSBpcyBpbmNyZWFzZWQgc28gaXQgY2FuIGNvbnRhaW4gYSBCbG9ja0xpbmtfdAorCQlzdHJ1Y3R1cmUgaW4gYWRkaXRpb24gdG8gdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgYnl0ZXMuICovCisJCWlmKCB4V2FudGVkU2l6ZSA+IDAgKQorCQl7CisJCQl4V2FudGVkU2l6ZSArPSBoZWFwU1RSVUNUX1NJWkU7CisKKwkJCS8qIEVuc3VyZSB0aGF0IGJsb2NrcyBhcmUgYWx3YXlzIGFsaWduZWQgdG8gdGhlIHJlcXVpcmVkIG51bWJlciBvZiBieXRlcy4gKi8KKwkJCWlmKCAoIHhXYW50ZWRTaXplICYgcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSAhPSAwICkKKwkJCXsKKwkJCQkvKiBCeXRlIGFsaWdubWVudCByZXF1aXJlZC4gKi8KKwkJCQl4V2FudGVkU2l6ZSArPSAoIHBvcnRCWVRFX0FMSUdOTUVOVCAtICggeFdhbnRlZFNpemUgJiBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICk7CisJCQl9CisJCX0KKworCQlpZiggKCB4V2FudGVkU2l6ZSA+IDAgKSAmJiAoIHhXYW50ZWRTaXplIDwgY29uZmlnQURKVVNURURfSEVBUF9TSVpFICkgKQorCQl7CisJCQkvKiBCbG9ja3MgYXJlIHN0b3JlZCBpbiBieXRlIG9yZGVyIC0gdHJhdmVyc2UgdGhlIGxpc3QgZnJvbSB0aGUgc3RhcnQKKwkJCShzbWFsbGVzdCkgYmxvY2sgdW50aWwgb25lIG9mIGFkZXF1YXRlIHNpemUgaXMgZm91bmQuICovCisJCQlweFByZXZpb3VzQmxvY2sgPSAmeFN0YXJ0OworCQkJcHhCbG9jayA9IHhTdGFydC5weE5leHRGcmVlQmxvY2s7CisJCQl3aGlsZSggKCBweEJsb2NrLT54QmxvY2tTaXplIDwgeFdhbnRlZFNpemUgKSAmJiAoIHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jayAhPSBOVUxMICkgKQorCQkJeworCQkJCXB4UHJldmlvdXNCbG9jayA9IHB4QmxvY2s7CisJCQkJcHhCbG9jayA9IHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jazsKKwkJCX0KKworCQkJLyogSWYgd2UgZm91bmQgdGhlIGVuZCBtYXJrZXIgdGhlbiBhIGJsb2NrIG9mIGFkZXF1YXRlIHNpemUgd2FzIG5vdCBmb3VuZC4gKi8KKwkJCWlmKCBweEJsb2NrICE9ICZ4RW5kICkKKwkJCXsKKwkJCQkvKiBSZXR1cm4gdGhlIG1lbW9yeSBzcGFjZSAtIGp1bXBpbmcgb3ZlciB0aGUgQmxvY2tMaW5rX3Qgc3RydWN0dXJlCisJCQkJYXQgaXRzIHN0YXJ0LiAqLworCQkJCXB2UmV0dXJuID0gKCB2b2lkICogKSAoICggKCB1aW50OF90ICogKSBweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayApICsgaGVhcFNUUlVDVF9TSVpFICk7CisKKwkJCQkvKiBUaGlzIGJsb2NrIGlzIGJlaW5nIHJldHVybmVkIGZvciB1c2Ugc28gbXVzdCBiZSB0YWtlbiBvdXQgb2YgdGhlCisJCQkJbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwkJCQlweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayA9IHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jazsKKworCQkJCS8qIElmIHRoZSBibG9jayBpcyBsYXJnZXIgdGhhbiByZXF1aXJlZCBpdCBjYW4gYmUgc3BsaXQgaW50byB0d28uICovCisJCQkJaWYoICggcHhCbG9jay0+eEJsb2NrU2l6ZSAtIHhXYW50ZWRTaXplICkgPiBoZWFwTUlOSU1VTV9CTE9DS19TSVpFICkKKwkJCQl7CisJCQkJCS8qIFRoaXMgYmxvY2sgaXMgdG8gYmUgc3BsaXQgaW50byB0d28uICBDcmVhdGUgYSBuZXcgYmxvY2sKKwkJCQkJZm9sbG93aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLiBUaGUgdm9pZCBjYXN0IGlzCisJCQkJCXVzZWQgdG8gcHJldmVudCBieXRlIGFsaWdubWVudCB3YXJuaW5ncyBmcm9tIHRoZSBjb21waWxlci4gKi8KKwkJCQkJcHhOZXdCbG9ja0xpbmsgPSAoIHZvaWQgKiApICggKCAoIHVpbnQ4X3QgKiApIHB4QmxvY2sgKSArIHhXYW50ZWRTaXplICk7CisKKwkJCQkJLyogQ2FsY3VsYXRlIHRoZSBzaXplcyBvZiB0d28gYmxvY2tzIHNwbGl0IGZyb20gdGhlIHNpbmdsZQorCQkJCQlibG9jay4gKi8KKwkJCQkJcHhOZXdCbG9ja0xpbmstPnhCbG9ja1NpemUgPSBweEJsb2NrLT54QmxvY2tTaXplIC0geFdhbnRlZFNpemU7CisJCQkJCXB4QmxvY2stPnhCbG9ja1NpemUgPSB4V2FudGVkU2l6ZTsKKworCQkJCQkvKiBJbnNlcnQgdGhlIG5ldyBibG9jayBpbnRvIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzLiAqLworCQkJCQlwcnZJbnNlcnRCbG9ja0ludG9GcmVlTGlzdCggKCBweE5ld0Jsb2NrTGluayApICk7CisJCQkJfQorCisJCQkJeEZyZWVCeXRlc1JlbWFpbmluZyAtPSBweEJsb2NrLT54QmxvY2tTaXplOworCQkJfQorCQl9CisKKwkJdHJhY2VNQUxMT0MoIHB2UmV0dXJuLCB4V2FudGVkU2l6ZSApOworCX0KKwkoIHZvaWQgKSB4VGFza1Jlc3VtZUFsbCgpOworCisJI2lmKCBjb25maWdVU0VfTUFMTE9DX0ZBSUxFRF9IT09LID09IDEgKQorCXsKKwkJaWYoIHB2UmV0dXJuID09IE5VTEwgKQorCQl7CisJCQlleHRlcm4gdm9pZCB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCB2b2lkICk7CisJCQl2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCk7CisJCX0KKwl9CisJI2VuZGlmCisKKwlyZXR1cm4gcHZSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEZyZWUoIHZvaWQgKnB2ICkKK3sKK3VpbnQ4X3QgKnB1YyA9ICggdWludDhfdCAqICkgcHY7CitCbG9ja0xpbmtfdCAqcHhMaW5rOworCisJaWYoIHB2ICE9IE5VTEwgKQorCXsKKwkJLyogVGhlIG1lbW9yeSBiZWluZyBmcmVlZCB3aWxsIGhhdmUgYW4gQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGltbWVkaWF0ZWx5CisJCWJlZm9yZSBpdC4gKi8KKwkJcHVjIC09IGhlYXBTVFJVQ1RfU0laRTsKKworCQkvKiBUaGlzIHVuZXhwZWN0ZWQgY2FzdGluZyBpcyB0byBrZWVwIHNvbWUgY29tcGlsZXJzIGZyb20gaXNzdWluZworCQlieXRlIGFsaWdubWVudCB3YXJuaW5ncy4gKi8KKwkJcHhMaW5rID0gKCB2b2lkICogKSBwdWM7CisKKwkJdlRhc2tTdXNwZW5kQWxsKCk7CisJCXsKKwkJCS8qIEFkZCB0aGlzIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzLiAqLworCQkJcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoICggKCBCbG9ja0xpbmtfdCAqICkgcHhMaW5rICkgKTsKKwkJCXhGcmVlQnl0ZXNSZW1haW5pbmcgKz0gcHhMaW5rLT54QmxvY2tTaXplOworCQkJdHJhY2VGUkVFKCBwdiwgcHhMaW5rLT54QmxvY2tTaXplICk7CisJCX0KKwkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhQb3J0R2V0RnJlZUhlYXBTaXplKCB2b2lkICkKK3sKKwlyZXR1cm4geEZyZWVCeXRlc1JlbWFpbmluZzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0SW5pdGlhbGlzZUJsb2Nrcyggdm9pZCApCit7CisJLyogVGhpcyBqdXN0IGV4aXN0cyB0byBrZWVwIHRoZSBsaW5rZXIgcXVpZXQuICovCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2SGVhcEluaXQoIHZvaWQgKQoreworQmxvY2tMaW5rX3QgKnB4Rmlyc3RGcmVlQmxvY2s7Cit1aW50OF90ICpwdWNBbGlnbmVkSGVhcDsKKworCS8qIEVuc3VyZSB0aGUgaGVhcCBzdGFydHMgb24gYSBjb3JyZWN0bHkgYWxpZ25lZCBib3VuZGFyeS4gKi8KKwlwdWNBbGlnbmVkSGVhcCA9ICggdWludDhfdCAqICkgKCAoICggcG9ydFBPSU5URVJfU0laRV9UWVBFICkgJnVjSGVhcFsgcG9ydEJZVEVfQUxJR05NRU5UIF0gKSAmICggfiggKCBwb3J0UE9JTlRFUl9TSVpFX1RZUEUgKSBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICkgKTsKKworCS8qIHhTdGFydCBpcyB1c2VkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIGZyZWUKKwlibG9ja3MuICBUaGUgdm9pZCBjYXN0IGlzIHVzZWQgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncy4gKi8KKwl4U3RhcnQucHhOZXh0RnJlZUJsb2NrID0gKCB2b2lkICogKSBwdWNBbGlnbmVkSGVhcDsKKwl4U3RhcnQueEJsb2NrU2l6ZSA9ICggc2l6ZV90ICkgMDsKKworCS8qIHhFbmQgaXMgdXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJeEVuZC54QmxvY2tTaXplID0gY29uZmlnQURKVVNURURfSEVBUF9TSVpFOworCXhFbmQucHhOZXh0RnJlZUJsb2NrID0gTlVMTDsKKworCS8qIFRvIHN0YXJ0IHdpdGggdGhlcmUgaXMgYSBzaW5nbGUgZnJlZSBibG9jayB0aGF0IGlzIHNpemVkIHRvIHRha2UgdXAgdGhlCisJZW50aXJlIGhlYXAgc3BhY2UuICovCisJcHhGaXJzdEZyZWVCbG9jayA9ICggdm9pZCAqICkgcHVjQWxpZ25lZEhlYXA7CisJcHhGaXJzdEZyZWVCbG9jay0+eEJsb2NrU2l6ZSA9IGNvbmZpZ0FESlVTVEVEX0hFQVBfU0laRTsKKwlweEZpcnN0RnJlZUJsb2NrLT5weE5leHRGcmVlQmxvY2sgPSAmeEVuZDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF8zLmMgYi9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9oZWFwXzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGMzZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF8zLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHB2UG9ydE1hbGxvYygpIGFuZCB2UG9ydEZyZWUoKSB0aGF0IHJlbGllcyBvbiB0aGUKKyAqIGNvbXBpbGVycyBvd24gbWFsbG9jKCkgYW5kIGZyZWUoKSBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIGxpbmtlciBpcyBjb25maWd1cmVkIHRvIHRvIGdlbmVyYXRlCisgKiBhIGhlYXAgbWVtb3J5IGFyZWEuCisgKgorICogU2VlIGhlYXBfMS5jLCBoZWFwXzIuYyBhbmQgaGVhcF80LmMgZm9yIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9ucywgYW5kIHRoZQorICogbWVtb3J5IG1hbmFnZW1lbnQgcGFnZXMgb2YgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCithbGwgdGhlIEFQSSBmdW5jdGlvbnMgdG8gdXNlIHRoZSBNUFUgd3JhcHBlcnMuICBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgordGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAwICkKKwkjZXJyb3IgVGhpcyBmaWxlIG11c3Qgbm90IGJlIHVzZWQgaWYgY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gaXMgMAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkICpwdlBvcnRNYWxsb2MoIHNpemVfdCB4V2FudGVkU2l6ZSApCit7Cit2b2lkICpwdlJldHVybjsKKworCXZUYXNrU3VzcGVuZEFsbCgpOworCXsKKwkJcHZSZXR1cm4gPSBtYWxsb2MoIHhXYW50ZWRTaXplICk7CisJCXRyYWNlTUFMTE9DKCBwdlJldHVybiwgeFdhbnRlZFNpemUgKTsKKwl9CisJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKworCSNpZiggY29uZmlnVVNFX01BTExPQ19GQUlMRURfSE9PSyA9PSAxICkKKwl7CisJCWlmKCBwdlJldHVybiA9PSBOVUxMICkKKwkJeworCQkJZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uTWFsbG9jRmFpbGVkSG9vayggdm9pZCApOworCQkJdkFwcGxpY2F0aW9uTWFsbG9jRmFpbGVkSG9vaygpOworCQl9CisJfQorCSNlbmRpZgorCisJcmV0dXJuIHB2UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRGcmVlKCB2b2lkICpwdiApCit7CisJaWYoIHB2ICkKKwl7CisJCXZUYXNrU3VzcGVuZEFsbCgpOworCQl7CisJCQlmcmVlKCBwdiApOworCQkJdHJhY2VGUkVFKCBwdiwgMCApOworCQl9CisJCSggdm9pZCApIHhUYXNrUmVzdW1lQWxsKCk7CisJfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF80LmMgYi9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9oZWFwXzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjI1MWMwCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF80LmMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKgorICogQSBzYW1wbGUgaW1wbGVtZW50YXRpb24gb2YgcHZQb3J0TWFsbG9jKCkgYW5kIHZQb3J0RnJlZSgpIHRoYXQgY29tYmluZXMKKyAqIChjb2FsZXNjZW5jZXMpIGFkamFjZW50IG1lbW9yeSBibG9ja3MgYXMgdGhleSBhcmUgZnJlZWQsIGFuZCBpbiBzbyBkb2luZworICogbGltaXRzIG1lbW9yeSBmcmFnbWVudGF0aW9uLgorICoKKyAqIFNlZSBoZWFwXzEuYywgaGVhcF8yLmMgYW5kIGhlYXBfMy5jIGZvciBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMsIGFuZCB0aGUKKyAqIG1lbW9yeSBtYW5hZ2VtZW50IHBhZ2VzIG9mIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIERlZmluaW5nIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHByZXZlbnRzIHRhc2suaCBmcm9tIHJlZGVmaW5pbmcKK2FsbCB0aGUgQVBJIGZ1bmN0aW9ucyB0byB1c2UgdGhlIE1QVSB3cmFwcGVycy4gIFRoYXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuCit0YXNrLmggaXMgaW5jbHVkZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDAgKQorCSNlcnJvciBUaGlzIGZpbGUgbXVzdCBub3QgYmUgdXNlZCBpZiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiBpcyAwCisjZW5kaWYKKworLyogQmxvY2sgc2l6ZXMgbXVzdCBub3QgZ2V0IHRvbyBzbWFsbC4gKi8KKyNkZWZpbmUgaGVhcE1JTklNVU1fQkxPQ0tfU0laRQkoICggc2l6ZV90ICkgKCB4SGVhcFN0cnVjdFNpemUgPDwgMSApICkKKworLyogQXNzdW1lcyA4Yml0IGJ5dGVzISAqLworI2RlZmluZSBoZWFwQklUU19QRVJfQllURQkJKCAoIHNpemVfdCApIDggKQorCisvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgaGVhcC4gKi8KKyNpZiggY29uZmlnQVBQTElDQVRJT05fQUxMT0NBVEVEX0hFQVAgPT0gMSApCisJLyogVGhlIGFwcGxpY2F0aW9uIHdyaXRlciBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBhcnJheSB1c2VkIGZvciB0aGUgUlRPUworCWhlYXAgLSBwcm9iYWJseSBzbyBpdCBjYW4gYmUgcGxhY2VkIGluIGEgc3BlY2lhbCBzZWdtZW50IG9yIGFkZHJlc3MuICovCisJZXh0ZXJuIHVpbnQ4X3QgdWNIZWFwWyBjb25maWdUT1RBTF9IRUFQX1NJWkUgXTsKKyNlbHNlCisJc3RhdGljIHVpbnQ4X3QgdWNIZWFwWyBjb25maWdUT1RBTF9IRUFQX1NJWkUgXTsKKyNlbmRpZiAvKiBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCAqLworCisvKiBEZWZpbmUgdGhlIGxpbmtlZCBsaXN0IHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB0byBsaW5rIGZyZWUgYmxvY2tzIGluIG9yZGVyCitvZiB0aGVpciBtZW1vcnkgYWRkcmVzcy4gKi8KK3R5cGVkZWYgc3RydWN0IEFfQkxPQ0tfTElOSworeworCXN0cnVjdCBBX0JMT0NLX0xJTksgKnB4TmV4dEZyZWVCbG9jazsJLyo8PCBUaGUgbmV4dCBmcmVlIGJsb2NrIGluIHRoZSBsaXN0LiAqLworCXNpemVfdCB4QmxvY2tTaXplOwkJCQkJCS8qPDwgVGhlIHNpemUgb2YgdGhlIGZyZWUgYmxvY2suICovCit9IEJsb2NrTGlua190OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIEluc2VydHMgYSBibG9jayBvZiBtZW1vcnkgdGhhdCBpcyBiZWluZyBmcmVlZCBpbnRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluCisgKiB0aGUgbGlzdCBvZiBmcmVlIG1lbW9yeSBibG9ja3MuICBUaGUgYmxvY2sgYmVpbmcgZnJlZWQgd2lsbCBiZSBtZXJnZWQgd2l0aAorICogdGhlIGJsb2NrIGluIGZyb250IGl0IGFuZC9vciB0aGUgYmxvY2sgYmVoaW5kIGl0IGlmIHRoZSBtZW1vcnkgYmxvY2tzIGFyZQorICogYWRqYWNlbnQgdG8gZWFjaCBvdGhlci4KKyAqLworc3RhdGljIHZvaWQgcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoIEJsb2NrTGlua190ICpweEJsb2NrVG9JbnNlcnQgKTsKKworLyoKKyAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IHRvIHNldHVwIHRoZSByZXF1aXJlZCBoZWFwIHN0cnVjdHVyZXMgdGhlIGZpcnN0IHRpbWUKKyAqIHB2UG9ydE1hbGxvYygpIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIHZvaWQgcHJ2SGVhcEluaXQoIHZvaWQgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBhbGxvY2F0ZWQgbWVtb3J5CitibG9jayBtdXN0IGJ5IGNvcnJlY3RseSBieXRlIGFsaWduZWQuICovCitzdGF0aWMgY29uc3Qgc2l6ZV90IHhIZWFwU3RydWN0U2l6ZQk9ICggc2l6ZW9mKCBCbG9ja0xpbmtfdCApICsgKCAoIHNpemVfdCApICggcG9ydEJZVEVfQUxJR05NRU5UIC0gMSApICkgKSAmIH4oICggc2l6ZV90ICkgcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKTsKKworLyogQ3JlYXRlIGEgY291cGxlIG9mIGxpc3QgbGlua3MgdG8gbWFyayB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgbGlzdC4gKi8KK3N0YXRpYyBCbG9ja0xpbmtfdCB4U3RhcnQsICpweEVuZCA9IE5VTEw7CisKKy8qIEtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgZnJlZSBieXRlcyByZW1haW5pbmcsIGJ1dCBzYXlzIG5vdGhpbmcgYWJvdXQKK2ZyYWdtZW50YXRpb24uICovCitzdGF0aWMgc2l6ZV90IHhGcmVlQnl0ZXNSZW1haW5pbmcgPSAwVTsKK3N0YXRpYyBzaXplX3QgeE1pbmltdW1FdmVyRnJlZUJ5dGVzUmVtYWluaW5nID0gMFU7CisKKy8qIEdldHMgc2V0IHRvIHRoZSB0b3AgYml0IG9mIGFuIHNpemVfdCB0eXBlLiAgV2hlbiB0aGlzIGJpdCBpbiB0aGUgeEJsb2NrU2l6ZQorbWVtYmVyIG9mIGFuIEJsb2NrTGlua190IHN0cnVjdHVyZSBpcyBzZXQgdGhlbiB0aGUgYmxvY2sgYmVsb25ncyB0byB0aGUKK2FwcGxpY2F0aW9uLiAgV2hlbiB0aGUgYml0IGlzIGZyZWUgdGhlIGJsb2NrIGlzIHN0aWxsIHBhcnQgb2YgdGhlIGZyZWUgaGVhcAorc3BhY2UuICovCitzdGF0aWMgc2l6ZV90IHhCbG9ja0FsbG9jYXRlZEJpdCA9IDA7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkICpwdlBvcnRNYWxsb2MoIHNpemVfdCB4V2FudGVkU2l6ZSApCit7CitCbG9ja0xpbmtfdCAqcHhCbG9jaywgKnB4UHJldmlvdXNCbG9jaywgKnB4TmV3QmxvY2tMaW5rOwordm9pZCAqcHZSZXR1cm4gPSBOVUxMOworCisJdlRhc2tTdXNwZW5kQWxsKCk7CisJeworCQkvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIHRvIG1hbGxvYyB0aGVuIHRoZSBoZWFwIHdpbGwgcmVxdWlyZQorCQlpbml0aWFsaXNhdGlvbiB0byBzZXR1cCB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwkJaWYoIHB4RW5kID09IE5VTEwgKQorCQl7CisJCQlwcnZIZWFwSW5pdCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisKKwkJLyogQ2hlY2sgdGhlIHJlcXVlc3RlZCBibG9jayBzaXplIGlzIG5vdCBzbyBsYXJnZSB0aGF0IHRoZSB0b3AgYml0IGlzCisJCXNldC4gIFRoZSB0b3AgYml0IG9mIHRoZSBibG9jayBzaXplIG1lbWJlciBvZiB0aGUgQmxvY2tMaW5rX3Qgc3RydWN0dXJlCisJCWlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdobyBvd25zIHRoZSBibG9jayAtIHRoZSBhcHBsaWNhdGlvbiBvciB0aGUKKwkJa2VybmVsLCBzbyBpdCBtdXN0IGJlIGZyZWUuICovCisJCWlmKCAoIHhXYW50ZWRTaXplICYgeEJsb2NrQWxsb2NhdGVkQml0ICkgPT0gMCApCisJCXsKKwkJCS8qIFRoZSB3YW50ZWQgc2l6ZSBpcyBpbmNyZWFzZWQgc28gaXQgY2FuIGNvbnRhaW4gYSBCbG9ja0xpbmtfdAorCQkJc3RydWN0dXJlIGluIGFkZGl0aW9uIHRvIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGJ5dGVzLiAqLworCQkJaWYoIHhXYW50ZWRTaXplID4gMCApCisJCQl7CisJCQkJeFdhbnRlZFNpemUgKz0geEhlYXBTdHJ1Y3RTaXplOworCisJCQkJLyogRW5zdXJlIHRoYXQgYmxvY2tzIGFyZSBhbHdheXMgYWxpZ25lZCB0byB0aGUgcmVxdWlyZWQgbnVtYmVyCisJCQkJb2YgYnl0ZXMuICovCisJCQkJaWYoICggeFdhbnRlZFNpemUgJiBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICE9IDB4MDAgKQorCQkJCXsKKwkJCQkJLyogQnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICovCisJCQkJCXhXYW50ZWRTaXplICs9ICggcG9ydEJZVEVfQUxJR05NRU5UIC0gKCB4V2FudGVkU2l6ZSAmIHBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgKTsKKwkJCQkJY29uZmlnQVNTRVJUKCAoIHhXYW50ZWRTaXplICYgcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSA9PSAwICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCisJCQlpZiggKCB4V2FudGVkU2l6ZSA+IDAgKSAmJiAoIHhXYW50ZWRTaXplIDw9IHhGcmVlQnl0ZXNSZW1haW5pbmcgKSApCisJCQl7CisJCQkJLyogVHJhdmVyc2UgdGhlIGxpc3QgZnJvbSB0aGUgc3RhcnQJKGxvd2VzdCBhZGRyZXNzKSBibG9jayB1bnRpbAorCQkJCW9uZQlvZiBhZGVxdWF0ZSBzaXplIGlzIGZvdW5kLiAqLworCQkJCXB4UHJldmlvdXNCbG9jayA9ICZ4U3RhcnQ7CisJCQkJcHhCbG9jayA9IHhTdGFydC5weE5leHRGcmVlQmxvY2s7CisJCQkJd2hpbGUoICggcHhCbG9jay0+eEJsb2NrU2l6ZSA8IHhXYW50ZWRTaXplICkgJiYgKCBweEJsb2NrLT5weE5leHRGcmVlQmxvY2sgIT0gTlVMTCApICkKKwkJCQl7CisJCQkJCXB4UHJldmlvdXNCbG9jayA9IHB4QmxvY2s7CisJCQkJCXB4QmxvY2sgPSBweEJsb2NrLT5weE5leHRGcmVlQmxvY2s7CisJCQkJfQorCisJCQkJLyogSWYgdGhlIGVuZCBtYXJrZXIgd2FzIHJlYWNoZWQgdGhlbiBhIGJsb2NrIG9mIGFkZXF1YXRlIHNpemUKKwkJCQl3YXMJbm90IGZvdW5kLiAqLworCQkJCWlmKCBweEJsb2NrICE9IHB4RW5kICkKKwkJCQl7CisJCQkJCS8qIFJldHVybiB0aGUgbWVtb3J5IHNwYWNlIHBvaW50ZWQgdG8gLSBqdW1waW5nIG92ZXIgdGhlCisJCQkJCUJsb2NrTGlua190IHN0cnVjdHVyZSBhdCBpdHMgc3RhcnQuICovCisJCQkJCXB2UmV0dXJuID0gKCB2b2lkICogKSAoICggKCB1aW50OF90ICogKSBweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayApICsgeEhlYXBTdHJ1Y3RTaXplICk7CisKKwkJCQkJLyogVGhpcyBibG9jayBpcyBiZWluZyByZXR1cm5lZCBmb3IgdXNlIHNvIG11c3QgYmUgdGFrZW4gb3V0CisJCQkJCW9mIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzLiAqLworCQkJCQlweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayA9IHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jazsKKworCQkJCQkvKiBJZiB0aGUgYmxvY2sgaXMgbGFyZ2VyIHRoYW4gcmVxdWlyZWQgaXQgY2FuIGJlIHNwbGl0IGludG8KKwkJCQkJdHdvLiAqLworCQkJCQlpZiggKCBweEJsb2NrLT54QmxvY2tTaXplIC0geFdhbnRlZFNpemUgKSA+IGhlYXBNSU5JTVVNX0JMT0NLX1NJWkUgKQorCQkJCQl7CisJCQkJCQkvKiBUaGlzIGJsb2NrIGlzIHRvIGJlIHNwbGl0IGludG8gdHdvLiAgQ3JlYXRlIGEgbmV3CisJCQkJCQlibG9jayBmb2xsb3dpbmcgdGhlIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQuIFRoZSB2b2lkCisJCQkJCQljYXN0IGlzIHVzZWQgdG8gcHJldmVudCBieXRlIGFsaWdubWVudCB3YXJuaW5ncyBmcm9tIHRoZQorCQkJCQkJY29tcGlsZXIuICovCisJCQkJCQlweE5ld0Jsb2NrTGluayA9ICggdm9pZCAqICkgKCAoICggdWludDhfdCAqICkgcHhCbG9jayApICsgeFdhbnRlZFNpemUgKTsKKwkJCQkJCWNvbmZpZ0FTU0VSVCggKCAoICggc2l6ZV90ICkgcHhOZXdCbG9ja0xpbmsgKSAmIHBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgPT0gMCApOworCisJCQkJCQkvKiBDYWxjdWxhdGUgdGhlIHNpemVzIG9mIHR3byBibG9ja3Mgc3BsaXQgZnJvbSB0aGUKKwkJCQkJCXNpbmdsZSBibG9jay4gKi8KKwkJCQkJCXB4TmV3QmxvY2tMaW5rLT54QmxvY2tTaXplID0gcHhCbG9jay0+eEJsb2NrU2l6ZSAtIHhXYW50ZWRTaXplOworCQkJCQkJcHhCbG9jay0+eEJsb2NrU2l6ZSA9IHhXYW50ZWRTaXplOworCisJCQkJCQkvKiBJbnNlcnQgdGhlIG5ldyBibG9jayBpbnRvIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzLiAqLworCQkJCQkJcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoIHB4TmV3QmxvY2tMaW5rICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKworCQkJCQl4RnJlZUJ5dGVzUmVtYWluaW5nIC09IHB4QmxvY2stPnhCbG9ja1NpemU7CisKKwkJCQkJaWYoIHhGcmVlQnl0ZXNSZW1haW5pbmcgPCB4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgKQorCQkJCQl7CisJCQkJCQl4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgPSB4RnJlZUJ5dGVzUmVtYWluaW5nOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisKKwkJCQkJLyogVGhlIGJsb2NrIGlzIGJlaW5nIHJldHVybmVkIC0gaXQgaXMgYWxsb2NhdGVkIGFuZCBvd25lZAorCQkJCQlieSB0aGUgYXBwbGljYXRpb24gYW5kIGhhcyBubyAibmV4dCIgYmxvY2suICovCisJCQkJCXB4QmxvY2stPnhCbG9ja1NpemUgfD0geEJsb2NrQWxsb2NhdGVkQml0OworCQkJCQlweEJsb2NrLT5weE5leHRGcmVlQmxvY2sgPSBOVUxMOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCXRyYWNlTUFMTE9DKCBwdlJldHVybiwgeFdhbnRlZFNpemUgKTsKKwl9CisJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKworCSNpZiggY29uZmlnVVNFX01BTExPQ19GQUlMRURfSE9PSyA9PSAxICkKKwl7CisJCWlmKCBwdlJldHVybiA9PSBOVUxMICkKKwkJeworCQkJZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uTWFsbG9jRmFpbGVkSG9vayggdm9pZCApOworCQkJdkFwcGxpY2F0aW9uTWFsbG9jRmFpbGVkSG9vaygpOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCSNlbmRpZgorCisJY29uZmlnQVNTRVJUKCAoICggKCBzaXplX3QgKSBwdlJldHVybiApICYgKCBzaXplX3QgKSBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApID09IDAgKTsKKwlyZXR1cm4gcHZSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEZyZWUoIHZvaWQgKnB2ICkKK3sKK3VpbnQ4X3QgKnB1YyA9ICggdWludDhfdCAqICkgcHY7CitCbG9ja0xpbmtfdCAqcHhMaW5rOworCisJaWYoIHB2ICE9IE5VTEwgKQorCXsKKwkJLyogVGhlIG1lbW9yeSBiZWluZyBmcmVlZCB3aWxsIGhhdmUgYW4gQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGltbWVkaWF0ZWx5CisJCWJlZm9yZSBpdC4gKi8KKwkJcHVjIC09IHhIZWFwU3RydWN0U2l6ZTsKKworCQkvKiBUaGlzIGNhc3RpbmcgaXMgdG8ga2VlcCB0aGUgY29tcGlsZXIgZnJvbSBpc3N1aW5nIHdhcm5pbmdzLiAqLworCQlweExpbmsgPSAoIHZvaWQgKiApIHB1YzsKKworCQkvKiBDaGVjayB0aGUgYmxvY2sgaXMgYWN0dWFsbHkgYWxsb2NhdGVkLiAqLworCQljb25maWdBU1NFUlQoICggcHhMaW5rLT54QmxvY2tTaXplICYgeEJsb2NrQWxsb2NhdGVkQml0ICkgIT0gMCApOworCQljb25maWdBU1NFUlQoIHB4TGluay0+cHhOZXh0RnJlZUJsb2NrID09IE5VTEwgKTsKKworCQlpZiggKCBweExpbmstPnhCbG9ja1NpemUgJiB4QmxvY2tBbGxvY2F0ZWRCaXQgKSAhPSAwICkKKwkJeworCQkJaWYoIHB4TGluay0+cHhOZXh0RnJlZUJsb2NrID09IE5VTEwgKQorCQkJeworCQkJCS8qIFRoZSBibG9jayBpcyBiZWluZyByZXR1cm5lZCB0byB0aGUgaGVhcCAtIGl0IGlzIG5vIGxvbmdlcgorCQkJCWFsbG9jYXRlZC4gKi8KKwkJCQlweExpbmstPnhCbG9ja1NpemUgJj0gfnhCbG9ja0FsbG9jYXRlZEJpdDsKKworCQkJCXZUYXNrU3VzcGVuZEFsbCgpOworCQkJCXsKKwkJCQkJLyogQWRkIHRoaXMgYmxvY2sgdG8gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJCQkJCXhGcmVlQnl0ZXNSZW1haW5pbmcgKz0gcHhMaW5rLT54QmxvY2tTaXplOworCQkJCQl0cmFjZUZSRUUoIHB2LCBweExpbmstPnhCbG9ja1NpemUgKTsKKwkJCQkJcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoICggKCBCbG9ja0xpbmtfdCAqICkgcHhMaW5rICkgKTsKKwkJCQl9CisJCQkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhQb3J0R2V0RnJlZUhlYXBTaXplKCB2b2lkICkKK3sKKwlyZXR1cm4geEZyZWVCeXRlc1JlbWFpbmluZzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzaXplX3QgeFBvcnRHZXRNaW5pbXVtRXZlckZyZWVIZWFwU2l6ZSggdm9pZCApCit7CisJcmV0dXJuIHhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0SW5pdGlhbGlzZUJsb2Nrcyggdm9pZCApCit7CisJLyogVGhpcyBqdXN0IGV4aXN0cyB0byBrZWVwIHRoZSBsaW5rZXIgcXVpZXQuICovCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2SGVhcEluaXQoIHZvaWQgKQoreworQmxvY2tMaW5rX3QgKnB4Rmlyc3RGcmVlQmxvY2s7Cit1aW50OF90ICpwdWNBbGlnbmVkSGVhcDsKK3NpemVfdCB1eEFkZHJlc3M7CitzaXplX3QgeFRvdGFsSGVhcFNpemUgPSBjb25maWdUT1RBTF9IRUFQX1NJWkU7CisKKwkvKiBFbnN1cmUgdGhlIGhlYXAgc3RhcnRzIG9uIGEgY29ycmVjdGx5IGFsaWduZWQgYm91bmRhcnkuICovCisJdXhBZGRyZXNzID0gKCBzaXplX3QgKSB1Y0hlYXA7CisKKwlpZiggKCB1eEFkZHJlc3MgJiBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICE9IDAgKQorCXsKKwkJdXhBZGRyZXNzICs9ICggcG9ydEJZVEVfQUxJR05NRU5UIC0gMSApOworCQl1eEFkZHJlc3MgJj0gfiggKCBzaXplX3QgKSBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApOworCQl4VG90YWxIZWFwU2l6ZSAtPSB1eEFkZHJlc3MgLSAoIHNpemVfdCApIHVjSGVhcDsKKwl9CisKKwlwdWNBbGlnbmVkSGVhcCA9ICggdWludDhfdCAqICkgdXhBZGRyZXNzOworCisJLyogeFN0YXJ0IGlzIHVzZWQgdG8gaG9sZCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3Qgb2YgZnJlZQorCWJsb2Nrcy4gIFRoZSB2b2lkIGNhc3QgaXMgdXNlZCB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCXhTdGFydC5weE5leHRGcmVlQmxvY2sgPSAoIHZvaWQgKiApIHB1Y0FsaWduZWRIZWFwOworCXhTdGFydC54QmxvY2tTaXplID0gKCBzaXplX3QgKSAwOworCisJLyogcHhFbmQgaXMgdXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MgYW5kIGlzIGluc2VydGVkCisJYXQgdGhlIGVuZCBvZiB0aGUgaGVhcCBzcGFjZS4gKi8KKwl1eEFkZHJlc3MgPSAoICggc2l6ZV90ICkgcHVjQWxpZ25lZEhlYXAgKSArIHhUb3RhbEhlYXBTaXplOworCXV4QWRkcmVzcyAtPSB4SGVhcFN0cnVjdFNpemU7CisJdXhBZGRyZXNzICY9IH4oICggc2l6ZV90ICkgcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKTsKKwlweEVuZCA9ICggdm9pZCAqICkgdXhBZGRyZXNzOworCXB4RW5kLT54QmxvY2tTaXplID0gMDsKKwlweEVuZC0+cHhOZXh0RnJlZUJsb2NrID0gTlVMTDsKKworCS8qIFRvIHN0YXJ0IHdpdGggdGhlcmUgaXMgYSBzaW5nbGUgZnJlZSBibG9jayB0aGF0IGlzIHNpemVkIHRvIHRha2UgdXAgdGhlCisJZW50aXJlIGhlYXAgc3BhY2UsIG1pbnVzIHRoZSBzcGFjZSB0YWtlbiBieSBweEVuZC4gKi8KKwlweEZpcnN0RnJlZUJsb2NrID0gKCB2b2lkICogKSBwdWNBbGlnbmVkSGVhcDsKKwlweEZpcnN0RnJlZUJsb2NrLT54QmxvY2tTaXplID0gdXhBZGRyZXNzIC0gKCBzaXplX3QgKSBweEZpcnN0RnJlZUJsb2NrOworCXB4Rmlyc3RGcmVlQmxvY2stPnB4TmV4dEZyZWVCbG9jayA9IHB4RW5kOworCisJLyogT25seSBvbmUgYmxvY2sgZXhpc3RzIC0gYW5kIGl0IGNvdmVycyB0aGUgZW50aXJlIHVzYWJsZSBoZWFwIHNwYWNlLiAqLworCXhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZyA9IHB4Rmlyc3RGcmVlQmxvY2stPnhCbG9ja1NpemU7CisJeEZyZWVCeXRlc1JlbWFpbmluZyA9IHB4Rmlyc3RGcmVlQmxvY2stPnhCbG9ja1NpemU7CisKKwkvKiBXb3JrIG91dCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBiaXQgaW4gYSBzaXplX3QgdmFyaWFibGUuICovCisJeEJsb2NrQWxsb2NhdGVkQml0ID0gKCAoIHNpemVfdCApIDEgKSA8PCAoICggc2l6ZW9mKCBzaXplX3QgKSAqIGhlYXBCSVRTX1BFUl9CWVRFICkgLSAxICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoIEJsb2NrTGlua190ICpweEJsb2NrVG9JbnNlcnQgKQoreworQmxvY2tMaW5rX3QgKnB4SXRlcmF0b3I7Cit1aW50OF90ICpwdWM7CisKKwkvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3QgdW50aWwgYSBibG9jayBpcyBmb3VuZCB0aGF0IGhhcyBhIGhpZ2hlciBhZGRyZXNzCisJdGhhbiB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQuICovCisJZm9yKCBweEl0ZXJhdG9yID0gJnhTdGFydDsgcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrIDwgcHhCbG9ja1RvSW5zZXJ0OyBweEl0ZXJhdG9yID0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrICkKKwl7CisJCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSwganVzdCBpdGVyYXRlIHRvIHRoZSByaWdodCBwb3NpdGlvbi4gKi8KKwl9CisKKwkvKiBEbyB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQsIGFuZCB0aGUgYmxvY2sgaXQgaXMgYmVpbmcgaW5zZXJ0ZWQgYWZ0ZXIKKwltYWtlIGEgY29udGlndW91cyBibG9jayBvZiBtZW1vcnk/ICovCisJcHVjID0gKCB1aW50OF90ICogKSBweEl0ZXJhdG9yOworCWlmKCAoIHB1YyArIHB4SXRlcmF0b3ItPnhCbG9ja1NpemUgKSA9PSAoIHVpbnQ4X3QgKiApIHB4QmxvY2tUb0luc2VydCApCisJeworCQlweEl0ZXJhdG9yLT54QmxvY2tTaXplICs9IHB4QmxvY2tUb0luc2VydC0+eEJsb2NrU2l6ZTsKKwkJcHhCbG9ja1RvSW5zZXJ0ID0gcHhJdGVyYXRvcjsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCS8qIERvIHRoZSBibG9jayBiZWluZyBpbnNlcnRlZCwgYW5kIHRoZSBibG9jayBpdCBpcyBiZWluZyBpbnNlcnRlZCBiZWZvcmUKKwltYWtlIGEgY29udGlndW91cyBibG9jayBvZiBtZW1vcnk/ICovCisJcHVjID0gKCB1aW50OF90ICogKSBweEJsb2NrVG9JbnNlcnQ7CisJaWYoICggcHVjICsgcHhCbG9ja1RvSW5zZXJ0LT54QmxvY2tTaXplICkgPT0gKCB1aW50OF90ICogKSBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgKQorCXsKKwkJaWYoIHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayAhPSBweEVuZCApCisJCXsKKwkJCS8qIEZvcm0gb25lIGJpZyBibG9jayBmcm9tIHRoZSB0d28gYmxvY2tzLiAqLworCQkJcHhCbG9ja1RvSW5zZXJ0LT54QmxvY2tTaXplICs9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jay0+eEJsb2NrU2l6ZTsKKwkJCXB4QmxvY2tUb0luc2VydC0+cHhOZXh0RnJlZUJsb2NrID0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrLT5weE5leHRGcmVlQmxvY2s7CisJCX0KKwkJZWxzZQorCQl7CisJCQlweEJsb2NrVG9JbnNlcnQtPnB4TmV4dEZyZWVCbG9jayA9IHB4RW5kOworCQl9CisJfQorCWVsc2UKKwl7CisJCXB4QmxvY2tUb0luc2VydC0+cHhOZXh0RnJlZUJsb2NrID0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrOworCX0KKworCS8qIElmIHRoZSBibG9jayBiZWluZyBpbnNlcnRlZCBwbHVnZ2VkIGEgZ2FiLCBzbyB3YXMgbWVyZ2VkIHdpdGggdGhlIGJsb2NrCisJYmVmb3JlIGFuZCB0aGUgYmxvY2sgYWZ0ZXIsIHRoZW4gaXQncyBweE5leHRGcmVlQmxvY2sgcG9pbnRlciB3aWxsIGhhdmUKKwlhbHJlYWR5IGJlZW4gc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSBzZXQgaGVyZSBhcyB0aGF0IHdvdWxkIG1ha2UgaXQgcG9pbnQKKwl0byBpdHNlbGYuICovCisJaWYoIHB4SXRlcmF0b3IgIT0gcHhCbG9ja1RvSW5zZXJ0ICkKKwl7CisJCXB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayA9IHB4QmxvY2tUb0luc2VydDsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF81LmMgYi9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9oZWFwXzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM1M2E5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF81LmMKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKgorICogQSBzYW1wbGUgaW1wbGVtZW50YXRpb24gb2YgcHZQb3J0TWFsbG9jKCkgdGhhdCBhbGxvd3MgdGhlIGhlYXAgdG8gYmUgZGVmaW5lZAorICogYWNyb3NzIG11bHRpcGxlIG5vbi1jb250aWdvdXMgYmxvY2tzIGFuZCBjb21iaW5lcyAoY29hbGVzY2VuY2VzKSBhZGphY2VudAorICogbWVtb3J5IGJsb2NrcyBhcyB0aGV5IGFyZSBmcmVlZC4KKyAqCisgKiBTZWUgaGVhcF8xLmMsIGhlYXBfMi5jLCBoZWFwXzMuYyBhbmQgaGVhcF80LmMgZm9yIGFsdGVybmF0aXZlCisgKiBpbXBsZW1lbnRhdGlvbnMsIGFuZCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcGFnZXMgb2YgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFVzYWdlIG5vdGVzOgorICoKKyAqIHZQb3J0RGVmaW5lSGVhcFJlZ2lvbnMoKSAqKiptdXN0KioqIGJlIGNhbGxlZCBiZWZvcmUgcHZQb3J0TWFsbG9jKCkuCisgKiBwdlBvcnRNYWxsb2MoKSB3aWxsIGJlIGNhbGxlZCBpZiBhbnkgdGFzayBvYmplY3RzICh0YXNrcywgcXVldWVzLCBldmVudAorICogZ3JvdXBzLCBldGMuKSBhcmUgY3JlYXRlZCwgdGhlcmVmb3JlIHZQb3J0RGVmaW5lSGVhcFJlZ2lvbnMoKSAqKiptdXN0KioqIGJlCisgKiBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBvYmplY3RzIGFyZSBkZWZpbmVkLgorICoKKyAqIHZQb3J0RGVmaW5lSGVhcFJlZ2lvbnMoKSB0YWtlcyBhIHNpbmdsZSBwYXJhbWV0ZXIuICBUaGUgcGFyYW1ldGVyIGlzIGFuIGFycmF5CisgKiBvZiBIZWFwUmVnaW9uX3Qgc3RydWN0dXJlcy4gIEhlYXBSZWdpb25fdCBpcyBkZWZpbmVkIGluIHBvcnRhYmxlLmggYXMKKyAqCisgKiB0eXBlZGVmIHN0cnVjdCBIZWFwUmVnaW9uCisgKiB7CisgKgl1aW50OF90ICpwdWNTdGFydEFkZHJlc3M7IDw8IFN0YXJ0IGFkZHJlc3Mgb2YgYSBibG9jayBvZiBtZW1vcnkgdGhhdCB3aWxsIGJlIHBhcnQgb2YgdGhlIGhlYXAuCisgKglzaXplX3QgeFNpemVJbkJ5dGVzOwkgIDw8IFNpemUgb2YgdGhlIGJsb2NrIG9mIG1lbW9yeS4KKyAqIH0gSGVhcFJlZ2lvbl90OworICoKKyAqIFRoZSBhcnJheSBpcyB0ZXJtaW5hdGVkIHVzaW5nIGEgTlVMTCB6ZXJvIHNpemVkIHJlZ2lvbiBkZWZpbml0aW9uLCBhbmQgdGhlCisgKiBtZW1vcnkgcmVnaW9ucyBkZWZpbmVkIGluIHRoZSBhcnJheSAqKiptdXN0KioqIGFwcGVhciBpbiBhZGRyZXNzIG9yZGVyIGZyb20KKyAqIGxvdyBhZGRyZXNzIHRvIGhpZ2ggYWRkcmVzcy4gIFNvIHRoZSBmb2xsb3dpbmcgaXMgYSB2YWxpZCBleGFtcGxlIG9mIGhvdworICogdG8gdXNlIHRoZSBmdW5jdGlvbi4KKyAqCisgKiBIZWFwUmVnaW9uX3QgeEhlYXBSZWdpb25zW10gPQorICogeworICogCXsgKCB1aW50OF90ICogKSAweDgwMDAwMDAwVUwsIDB4MTAwMDAgfSwgPDwgRGVmaW5lcyBhIGJsb2NrIG9mIDB4MTAwMDAgYnl0ZXMgc3RhcnRpbmcgYXQgYWRkcmVzcyAweDgwMDAwMDAwCisgKiAJeyAoIHVpbnQ4X3QgKiApIDB4OTAwMDAwMDBVTCwgMHhhMDAwMCB9LCA8PCBEZWZpbmVzIGEgYmxvY2sgb2YgMHhhMDAwMCBieXRlcyBzdGFydGluZyBhdCBhZGRyZXNzIG9mIDB4OTAwMDAwMDAKKyAqIAl7IE5VTEwsIDAgfSAgICAgICAgICAgICAgICA8PCBUZXJtaW5hdGVzIHRoZSBhcnJheS4KKyAqIH07CisgKgorICogdlBvcnREZWZpbmVIZWFwUmVnaW9ucyggeEhlYXBSZWdpb25zICk7IDw8IFBhc3MgdGhlIGFycmF5IGludG8gdlBvcnREZWZpbmVIZWFwUmVnaW9ucygpLgorICoKKyAqIE5vdGUgMHg4MDAwMDAwMCBpcyB0aGUgbG93ZXIgYWRkcmVzcyBzbyBhcHBlYXJzIGluIHRoZSBhcnJheSBmaXJzdC4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiAgVGhhdCBzaG91bGQgb25seSBiZSBkb25lIHdoZW4KK3Rhc2suaCBpcyBpbmNsdWRlZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZpbGUuICovCisjZGVmaW5lIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMCApCisJI2Vycm9yIFRoaXMgZmlsZSBtdXN0IG5vdCBiZSB1c2VkIGlmIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OIGlzIDAKKyNlbmRpZgorCisvKiBCbG9jayBzaXplcyBtdXN0IG5vdCBnZXQgdG9vIHNtYWxsLiAqLworI2RlZmluZSBoZWFwTUlOSU1VTV9CTE9DS19TSVpFCSggKCBzaXplX3QgKSAoIHhIZWFwU3RydWN0U2l6ZSA8PCAxICkgKQorCisvKiBBc3N1bWVzIDhiaXQgYnl0ZXMhICovCisjZGVmaW5lIGhlYXBCSVRTX1BFUl9CWVRFCQkoICggc2l6ZV90ICkgOCApCisKKy8qIERlZmluZSB0aGUgbGlua2VkIGxpc3Qgc3RydWN0dXJlLiAgVGhpcyBpcyB1c2VkIHRvIGxpbmsgZnJlZSBibG9ja3MgaW4gb3JkZXIKK29mIHRoZWlyIG1lbW9yeSBhZGRyZXNzLiAqLwordHlwZWRlZiBzdHJ1Y3QgQV9CTE9DS19MSU5LCit7CisJc3RydWN0IEFfQkxPQ0tfTElOSyAqcHhOZXh0RnJlZUJsb2NrOwkvKjw8IFRoZSBuZXh0IGZyZWUgYmxvY2sgaW4gdGhlIGxpc3QuICovCisJc2l6ZV90IHhCbG9ja1NpemU7CQkJCQkJLyo8PCBUaGUgc2l6ZSBvZiB0aGUgZnJlZSBibG9jay4gKi8KK30gQmxvY2tMaW5rX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogSW5zZXJ0cyBhIGJsb2NrIG9mIG1lbW9yeSB0aGF0IGlzIGJlaW5nIGZyZWVkIGludG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4KKyAqIHRoZSBsaXN0IG9mIGZyZWUgbWVtb3J5IGJsb2Nrcy4gIFRoZSBibG9jayBiZWluZyBmcmVlZCB3aWxsIGJlIG1lcmdlZCB3aXRoCisgKiB0aGUgYmxvY2sgaW4gZnJvbnQgaXQgYW5kL29yIHRoZSBibG9jayBiZWhpbmQgaXQgaWYgdGhlIG1lbW9yeSBibG9ja3MgYXJlCisgKiBhZGphY2VudCB0byBlYWNoIG90aGVyLgorICovCitzdGF0aWMgdm9pZCBwcnZJbnNlcnRCbG9ja0ludG9GcmVlTGlzdCggQmxvY2tMaW5rX3QgKnB4QmxvY2tUb0luc2VydCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZSBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGFsbG9jYXRlZCBtZW1vcnkKK2Jsb2NrIG11c3QgYnkgY29ycmVjdGx5IGJ5dGUgYWxpZ25lZC4gKi8KK3N0YXRpYyBjb25zdCBzaXplX3QgeEhlYXBTdHJ1Y3RTaXplCT0gKCBzaXplb2YoIEJsb2NrTGlua190ICkgKyAoICggc2l6ZV90ICkgKCBwb3J0QllURV9BTElHTk1FTlQgLSAxICkgKSApICYgfiggKCBzaXplX3QgKSBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApOworCisvKiBDcmVhdGUgYSBjb3VwbGUgb2YgbGlzdCBsaW5rcyB0byBtYXJrIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBsaXN0LiAqLworc3RhdGljIEJsb2NrTGlua190IHhTdGFydCwgKnB4RW5kID0gTlVMTDsKKworLyogS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBmcmVlIGJ5dGVzIHJlbWFpbmluZywgYnV0IHNheXMgbm90aGluZyBhYm91dAorZnJhZ21lbnRhdGlvbi4gKi8KK3N0YXRpYyBzaXplX3QgeEZyZWVCeXRlc1JlbWFpbmluZyA9IDBVOworc3RhdGljIHNpemVfdCB4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgPSAwVTsKKworLyogR2V0cyBzZXQgdG8gdGhlIHRvcCBiaXQgb2YgYW4gc2l6ZV90IHR5cGUuICBXaGVuIHRoaXMgYml0IGluIHRoZSB4QmxvY2tTaXplCittZW1iZXIgb2YgYW4gQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGlzIHNldCB0aGVuIHRoZSBibG9jayBiZWxvbmdzIHRvIHRoZQorYXBwbGljYXRpb24uICBXaGVuIHRoZSBiaXQgaXMgZnJlZSB0aGUgYmxvY2sgaXMgc3RpbGwgcGFydCBvZiB0aGUgZnJlZSBoZWFwCitzcGFjZS4gKi8KK3N0YXRpYyBzaXplX3QgeEJsb2NrQWxsb2NhdGVkQml0ID0gMDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgKnB2UG9ydE1hbGxvYyggc2l6ZV90IHhXYW50ZWRTaXplICkKK3sKK0Jsb2NrTGlua190ICpweEJsb2NrLCAqcHhQcmV2aW91c0Jsb2NrLCAqcHhOZXdCbG9ja0xpbms7Cit2b2lkICpwdlJldHVybiA9IE5VTEw7CisKKwkvKiBUaGUgaGVhcCBtdXN0IGJlIGluaXRpYWxpc2VkIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0bworCXBydlBvcnRNYWxsb2MoKS4gKi8KKwljb25maWdBU1NFUlQoIHB4RW5kICk7CisKKwl2VGFza1N1c3BlbmRBbGwoKTsKKwl7CisJCS8qIENoZWNrIHRoZSByZXF1ZXN0ZWQgYmxvY2sgc2l6ZSBpcyBub3Qgc28gbGFyZ2UgdGhhdCB0aGUgdG9wIGJpdCBpcworCQlzZXQuICBUaGUgdG9wIGJpdCBvZiB0aGUgYmxvY2sgc2l6ZSBtZW1iZXIgb2YgdGhlIEJsb2NrTGlua190IHN0cnVjdHVyZQorCQlpcyB1c2VkIHRvIGRldGVybWluZSB3aG8gb3ducyB0aGUgYmxvY2sgLSB0aGUgYXBwbGljYXRpb24gb3IgdGhlCisJCWtlcm5lbCwgc28gaXQgbXVzdCBiZSBmcmVlLiAqLworCQlpZiggKCB4V2FudGVkU2l6ZSAmIHhCbG9ja0FsbG9jYXRlZEJpdCApID09IDAgKQorCQl7CisJCQkvKiBUaGUgd2FudGVkIHNpemUgaXMgaW5jcmVhc2VkIHNvIGl0IGNhbiBjb250YWluIGEgQmxvY2tMaW5rX3QKKwkJCXN0cnVjdHVyZSBpbiBhZGRpdGlvbiB0byB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBieXRlcy4gKi8KKwkJCWlmKCB4V2FudGVkU2l6ZSA+IDAgKQorCQkJeworCQkJCXhXYW50ZWRTaXplICs9IHhIZWFwU3RydWN0U2l6ZTsKKworCQkJCS8qIEVuc3VyZSB0aGF0IGJsb2NrcyBhcmUgYWx3YXlzIGFsaWduZWQgdG8gdGhlIHJlcXVpcmVkIG51bWJlcgorCQkJCW9mIGJ5dGVzLiAqLworCQkJCWlmKCAoIHhXYW50ZWRTaXplICYgcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSAhPSAweDAwICkKKwkJCQl7CisJCQkJCS8qIEJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAqLworCQkJCQl4V2FudGVkU2l6ZSArPSAoIHBvcnRCWVRFX0FMSUdOTUVOVCAtICggeFdhbnRlZFNpemUgJiBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCisJCQlpZiggKCB4V2FudGVkU2l6ZSA+IDAgKSAmJiAoIHhXYW50ZWRTaXplIDw9IHhGcmVlQnl0ZXNSZW1haW5pbmcgKSApCisJCQl7CisJCQkJLyogVHJhdmVyc2UgdGhlIGxpc3QgZnJvbSB0aGUgc3RhcnQJKGxvd2VzdCBhZGRyZXNzKSBibG9jayB1bnRpbAorCQkJCW9uZQlvZiBhZGVxdWF0ZSBzaXplIGlzIGZvdW5kLiAqLworCQkJCXB4UHJldmlvdXNCbG9jayA9ICZ4U3RhcnQ7CisJCQkJcHhCbG9jayA9IHhTdGFydC5weE5leHRGcmVlQmxvY2s7CisJCQkJd2hpbGUoICggcHhCbG9jay0+eEJsb2NrU2l6ZSA8IHhXYW50ZWRTaXplICkgJiYgKCBweEJsb2NrLT5weE5leHRGcmVlQmxvY2sgIT0gTlVMTCApICkKKwkJCQl7CisJCQkJCXB4UHJldmlvdXNCbG9jayA9IHB4QmxvY2s7CisJCQkJCXB4QmxvY2sgPSBweEJsb2NrLT5weE5leHRGcmVlQmxvY2s7CisJCQkJfQorCisJCQkJLyogSWYgdGhlIGVuZCBtYXJrZXIgd2FzIHJlYWNoZWQgdGhlbiBhIGJsb2NrIG9mIGFkZXF1YXRlIHNpemUKKwkJCQl3YXMJbm90IGZvdW5kLiAqLworCQkJCWlmKCBweEJsb2NrICE9IHB4RW5kICkKKwkJCQl7CisJCQkJCS8qIFJldHVybiB0aGUgbWVtb3J5IHNwYWNlIHBvaW50ZWQgdG8gLSBqdW1waW5nIG92ZXIgdGhlCisJCQkJCUJsb2NrTGlua190IHN0cnVjdHVyZSBhdCBpdHMgc3RhcnQuICovCisJCQkJCXB2UmV0dXJuID0gKCB2b2lkICogKSAoICggKCB1aW50OF90ICogKSBweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayApICsgeEhlYXBTdHJ1Y3RTaXplICk7CisKKwkJCQkJLyogVGhpcyBibG9jayBpcyBiZWluZyByZXR1cm5lZCBmb3IgdXNlIHNvIG11c3QgYmUgdGFrZW4gb3V0CisJCQkJCW9mIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzLiAqLworCQkJCQlweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayA9IHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jazsKKworCQkJCQkvKiBJZiB0aGUgYmxvY2sgaXMgbGFyZ2VyIHRoYW4gcmVxdWlyZWQgaXQgY2FuIGJlIHNwbGl0IGludG8KKwkJCQkJdHdvLiAqLworCQkJCQlpZiggKCBweEJsb2NrLT54QmxvY2tTaXplIC0geFdhbnRlZFNpemUgKSA+IGhlYXBNSU5JTVVNX0JMT0NLX1NJWkUgKQorCQkJCQl7CisJCQkJCQkvKiBUaGlzIGJsb2NrIGlzIHRvIGJlIHNwbGl0IGludG8gdHdvLiAgQ3JlYXRlIGEgbmV3CisJCQkJCQlibG9jayBmb2xsb3dpbmcgdGhlIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQuIFRoZSB2b2lkCisJCQkJCQljYXN0IGlzIHVzZWQgdG8gcHJldmVudCBieXRlIGFsaWdubWVudCB3YXJuaW5ncyBmcm9tIHRoZQorCQkJCQkJY29tcGlsZXIuICovCisJCQkJCQlweE5ld0Jsb2NrTGluayA9ICggdm9pZCAqICkgKCAoICggdWludDhfdCAqICkgcHhCbG9jayApICsgeFdhbnRlZFNpemUgKTsKKworCQkJCQkJLyogQ2FsY3VsYXRlIHRoZSBzaXplcyBvZiB0d28gYmxvY2tzIHNwbGl0IGZyb20gdGhlCisJCQkJCQlzaW5nbGUgYmxvY2suICovCisJCQkJCQlweE5ld0Jsb2NrTGluay0+eEJsb2NrU2l6ZSA9IHB4QmxvY2stPnhCbG9ja1NpemUgLSB4V2FudGVkU2l6ZTsKKwkJCQkJCXB4QmxvY2stPnhCbG9ja1NpemUgPSB4V2FudGVkU2l6ZTsKKworCQkJCQkJLyogSW5zZXJ0IHRoZSBuZXcgYmxvY2sgaW50byB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwkJCQkJCXBydkluc2VydEJsb2NrSW50b0ZyZWVMaXN0KCAoIHB4TmV3QmxvY2tMaW5rICkgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCisJCQkJCXhGcmVlQnl0ZXNSZW1haW5pbmcgLT0gcHhCbG9jay0+eEJsb2NrU2l6ZTsKKworCQkJCQlpZiggeEZyZWVCeXRlc1JlbWFpbmluZyA8IHhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZyApCisJCQkJCXsKKwkJCQkJCXhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZyA9IHhGcmVlQnl0ZXNSZW1haW5pbmc7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKworCQkJCQkvKiBUaGUgYmxvY2sgaXMgYmVpbmcgcmV0dXJuZWQgLSBpdCBpcyBhbGxvY2F0ZWQgYW5kIG93bmVkCisJCQkJCWJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQgaGFzIG5vICJuZXh0IiBibG9jay4gKi8KKwkJCQkJcHhCbG9jay0+eEJsb2NrU2l6ZSB8PSB4QmxvY2tBbGxvY2F0ZWRCaXQ7CisJCQkJCXB4QmxvY2stPnB4TmV4dEZyZWVCbG9jayA9IE5VTEw7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisKKwkJdHJhY2VNQUxMT0MoIHB2UmV0dXJuLCB4V2FudGVkU2l6ZSApOworCX0KKwkoIHZvaWQgKSB4VGFza1Jlc3VtZUFsbCgpOworCisJI2lmKCBjb25maWdVU0VfTUFMTE9DX0ZBSUxFRF9IT09LID09IDEgKQorCXsKKwkJaWYoIHB2UmV0dXJuID09IE5VTEwgKQorCQl7CisJCQlleHRlcm4gdm9pZCB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCB2b2lkICk7CisJCQl2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisJI2VuZGlmCisKKwlyZXR1cm4gcHZSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEZyZWUoIHZvaWQgKnB2ICkKK3sKK3VpbnQ4X3QgKnB1YyA9ICggdWludDhfdCAqICkgcHY7CitCbG9ja0xpbmtfdCAqcHhMaW5rOworCisJaWYoIHB2ICE9IE5VTEwgKQorCXsKKwkJLyogVGhlIG1lbW9yeSBiZWluZyBmcmVlZCB3aWxsIGhhdmUgYW4gQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGltbWVkaWF0ZWx5CisJCWJlZm9yZSBpdC4gKi8KKwkJcHVjIC09IHhIZWFwU3RydWN0U2l6ZTsKKworCQkvKiBUaGlzIGNhc3RpbmcgaXMgdG8ga2VlcCB0aGUgY29tcGlsZXIgZnJvbSBpc3N1aW5nIHdhcm5pbmdzLiAqLworCQlweExpbmsgPSAoIHZvaWQgKiApIHB1YzsKKworCQkvKiBDaGVjayB0aGUgYmxvY2sgaXMgYWN0dWFsbHkgYWxsb2NhdGVkLiAqLworCQljb25maWdBU1NFUlQoICggcHhMaW5rLT54QmxvY2tTaXplICYgeEJsb2NrQWxsb2NhdGVkQml0ICkgIT0gMCApOworCQljb25maWdBU1NFUlQoIHB4TGluay0+cHhOZXh0RnJlZUJsb2NrID09IE5VTEwgKTsKKworCQlpZiggKCBweExpbmstPnhCbG9ja1NpemUgJiB4QmxvY2tBbGxvY2F0ZWRCaXQgKSAhPSAwICkKKwkJeworCQkJaWYoIHB4TGluay0+cHhOZXh0RnJlZUJsb2NrID09IE5VTEwgKQorCQkJeworCQkJCS8qIFRoZSBibG9jayBpcyBiZWluZyByZXR1cm5lZCB0byB0aGUgaGVhcCAtIGl0IGlzIG5vIGxvbmdlcgorCQkJCWFsbG9jYXRlZC4gKi8KKwkJCQlweExpbmstPnhCbG9ja1NpemUgJj0gfnhCbG9ja0FsbG9jYXRlZEJpdDsKKworCQkJCXZUYXNrU3VzcGVuZEFsbCgpOworCQkJCXsKKwkJCQkJLyogQWRkIHRoaXMgYmxvY2sgdG8gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJCQkJCXhGcmVlQnl0ZXNSZW1haW5pbmcgKz0gcHhMaW5rLT54QmxvY2tTaXplOworCQkJCQl0cmFjZUZSRUUoIHB2LCBweExpbmstPnhCbG9ja1NpemUgKTsKKwkJCQkJcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoICggKCBCbG9ja0xpbmtfdCAqICkgcHhMaW5rICkgKTsKKwkJCQl9CisJCQkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhQb3J0R2V0RnJlZUhlYXBTaXplKCB2b2lkICkKK3sKKwlyZXR1cm4geEZyZWVCeXRlc1JlbWFpbmluZzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzaXplX3QgeFBvcnRHZXRNaW5pbXVtRXZlckZyZWVIZWFwU2l6ZSggdm9pZCApCit7CisJcmV0dXJuIHhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZJbnNlcnRCbG9ja0ludG9GcmVlTGlzdCggQmxvY2tMaW5rX3QgKnB4QmxvY2tUb0luc2VydCApCit7CitCbG9ja0xpbmtfdCAqcHhJdGVyYXRvcjsKK3VpbnQ4X3QgKnB1YzsKKworCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCB1bnRpbCBhIGJsb2NrIGlzIGZvdW5kIHRoYXQgaGFzIGEgaGlnaGVyIGFkZHJlc3MKKwl0aGFuIHRoZSBibG9jayBiZWluZyBpbnNlcnRlZC4gKi8KKwlmb3IoIHB4SXRlcmF0b3IgPSAmeFN0YXJ0OyBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgPCBweEJsb2NrVG9JbnNlcnQ7IHB4SXRlcmF0b3IgPSBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgKQorCXsKKwkJLyogTm90aGluZyB0byBkbyBoZXJlLCBqdXN0IGl0ZXJhdGUgdG8gdGhlIHJpZ2h0IHBvc2l0aW9uLiAqLworCX0KKworCS8qIERvIHRoZSBibG9jayBiZWluZyBpbnNlcnRlZCwgYW5kIHRoZSBibG9jayBpdCBpcyBiZWluZyBpbnNlcnRlZCBhZnRlcgorCW1ha2UgYSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeT8gKi8KKwlwdWMgPSAoIHVpbnQ4X3QgKiApIHB4SXRlcmF0b3I7CisJaWYoICggcHVjICsgcHhJdGVyYXRvci0+eEJsb2NrU2l6ZSApID09ICggdWludDhfdCAqICkgcHhCbG9ja1RvSW5zZXJ0ICkKKwl7CisJCXB4SXRlcmF0b3ItPnhCbG9ja1NpemUgKz0gcHhCbG9ja1RvSW5zZXJ0LT54QmxvY2tTaXplOworCQlweEJsb2NrVG9JbnNlcnQgPSBweEl0ZXJhdG9yOworCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorCisJLyogRG8gdGhlIGJsb2NrIGJlaW5nIGluc2VydGVkLCBhbmQgdGhlIGJsb2NrIGl0IGlzIGJlaW5nIGluc2VydGVkIGJlZm9yZQorCW1ha2UgYSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeT8gKi8KKwlwdWMgPSAoIHVpbnQ4X3QgKiApIHB4QmxvY2tUb0luc2VydDsKKwlpZiggKCBwdWMgKyBweEJsb2NrVG9JbnNlcnQtPnhCbG9ja1NpemUgKSA9PSAoIHVpbnQ4X3QgKiApIHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayApCisJeworCQlpZiggcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrICE9IHB4RW5kICkKKwkJeworCQkJLyogRm9ybSBvbmUgYmlnIGJsb2NrIGZyb20gdGhlIHR3byBibG9ja3MuICovCisJCQlweEJsb2NrVG9JbnNlcnQtPnhCbG9ja1NpemUgKz0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrLT54QmxvY2tTaXplOworCQkJcHhCbG9ja1RvSW5zZXJ0LT5weE5leHRGcmVlQmxvY2sgPSBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2stPnB4TmV4dEZyZWVCbG9jazsKKwkJfQorCQllbHNlCisJCXsKKwkJCXB4QmxvY2tUb0luc2VydC0+cHhOZXh0RnJlZUJsb2NrID0gcHhFbmQ7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcHhCbG9ja1RvSW5zZXJ0LT5weE5leHRGcmVlQmxvY2sgPSBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2s7CisJfQorCisJLyogSWYgdGhlIGJsb2NrIGJlaW5nIGluc2VydGVkIHBsdWdnZWQgYSBnYWIsIHNvIHdhcyBtZXJnZWQgd2l0aCB0aGUgYmxvY2sKKwliZWZvcmUgYW5kIHRoZSBibG9jayBhZnRlciwgdGhlbiBpdCdzIHB4TmV4dEZyZWVCbG9jayBwb2ludGVyIHdpbGwgaGF2ZQorCWFscmVhZHkgYmVlbiBzZXQsIGFuZCBzaG91bGQgbm90IGJlIHNldCBoZXJlIGFzIHRoYXQgd291bGQgbWFrZSBpdCBwb2ludAorCXRvIGl0c2VsZi4gKi8KKwlpZiggcHhJdGVyYXRvciAhPSBweEJsb2NrVG9JbnNlcnQgKQorCXsKKwkJcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrID0gcHhCbG9ja1RvSW5zZXJ0OworCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnREZWZpbmVIZWFwUmVnaW9ucyggY29uc3QgSGVhcFJlZ2lvbl90ICogY29uc3QgcHhIZWFwUmVnaW9ucyApCit7CitCbG9ja0xpbmtfdCAqcHhGaXJzdEZyZWVCbG9ja0luUmVnaW9uID0gTlVMTCwgKnB4UHJldmlvdXNGcmVlQmxvY2s7CitzaXplX3QgeEFsaWduZWRIZWFwOworc2l6ZV90IHhUb3RhbFJlZ2lvblNpemUsIHhUb3RhbEhlYXBTaXplID0gMDsKK0Jhc2VUeXBlX3QgeERlZmluZWRSZWdpb25zID0gMDsKK3NpemVfdCB4QWRkcmVzczsKK2NvbnN0IEhlYXBSZWdpb25fdCAqcHhIZWFwUmVnaW9uOworCisJLyogQ2FuIG9ubHkgY2FsbCBvbmNlISAqLworCWNvbmZpZ0FTU0VSVCggcHhFbmQgPT0gTlVMTCApOworCisJcHhIZWFwUmVnaW9uID0gJiggcHhIZWFwUmVnaW9uc1sgeERlZmluZWRSZWdpb25zIF0gKTsKKworCXdoaWxlKCBweEhlYXBSZWdpb24tPnhTaXplSW5CeXRlcyA+IDAgKQorCXsKKwkJeFRvdGFsUmVnaW9uU2l6ZSA9IHB4SGVhcFJlZ2lvbi0+eFNpemVJbkJ5dGVzOworCisJCS8qIEVuc3VyZSB0aGUgaGVhcCByZWdpb24gc3RhcnRzIG9uIGEgY29ycmVjdGx5IGFsaWduZWQgYm91bmRhcnkuICovCisJCXhBZGRyZXNzID0gKCBzaXplX3QgKSBweEhlYXBSZWdpb24tPnB1Y1N0YXJ0QWRkcmVzczsKKwkJaWYoICggeEFkZHJlc3MgJiBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICE9IDAgKQorCQl7CisJCQl4QWRkcmVzcyArPSAoIHBvcnRCWVRFX0FMSUdOTUVOVCAtIDEgKTsKKwkJCXhBZGRyZXNzICY9IH5wb3J0QllURV9BTElHTk1FTlRfTUFTSzsKKworCQkJLyogQWRqdXN0IHRoZSBzaXplIGZvciB0aGUgYnl0ZXMgbG9zdCB0byBhbGlnbm1lbnQuICovCisJCQl4VG90YWxSZWdpb25TaXplIC09IHhBZGRyZXNzIC0gKCBzaXplX3QgKSBweEhlYXBSZWdpb24tPnB1Y1N0YXJ0QWRkcmVzczsKKwkJfQorCisJCXhBbGlnbmVkSGVhcCA9IHhBZGRyZXNzOworCisJCS8qIFNldCB4U3RhcnQgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gc2V0LiAqLworCQlpZiggeERlZmluZWRSZWdpb25zID09IDAgKQorCQl7CisJCQkvKiB4U3RhcnQgaXMgdXNlZCB0byBob2xkIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBvZgorCQkJZnJlZSBibG9ja3MuICBUaGUgdm9pZCBjYXN0IGlzIHVzZWQgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncy4gKi8KKwkJCXhTdGFydC5weE5leHRGcmVlQmxvY2sgPSAoIEJsb2NrTGlua190ICogKSB4QWxpZ25lZEhlYXA7CisJCQl4U3RhcnQueEJsb2NrU2l6ZSA9ICggc2l6ZV90ICkgMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFNob3VsZCBvbmx5IGdldCBoZXJlIGlmIG9uZSByZWdpb24gaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUKKwkJCWhlYXAuICovCisJCQljb25maWdBU1NFUlQoIHB4RW5kICE9IE5VTEwgKTsKKworCQkJLyogQ2hlY2sgYmxvY2tzIGFyZSBwYXNzZWQgaW4gd2l0aCBpbmNyZWFzaW5nIHN0YXJ0IGFkZHJlc3Nlcy4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggeEFkZHJlc3MgPiAoIHNpemVfdCApIHB4RW5kICk7CisJCX0KKworCQkvKiBSZW1lbWJlciB0aGUgbG9jYXRpb24gb2YgdGhlIGVuZCBtYXJrZXIgaW4gdGhlIHByZXZpb3VzIHJlZ2lvbiwgaWYKKwkJYW55LiAqLworCQlweFByZXZpb3VzRnJlZUJsb2NrID0gcHhFbmQ7CisKKwkJLyogcHhFbmQgaXMgdXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MgYW5kIGlzCisJCWluc2VydGVkIGF0IHRoZSBlbmQgb2YgdGhlIHJlZ2lvbiBzcGFjZS4gKi8KKwkJeEFkZHJlc3MgPSB4QWxpZ25lZEhlYXAgKyB4VG90YWxSZWdpb25TaXplOworCQl4QWRkcmVzcyAtPSB4SGVhcFN0cnVjdFNpemU7CisJCXhBZGRyZXNzICY9IH5wb3J0QllURV9BTElHTk1FTlRfTUFTSzsKKwkJcHhFbmQgPSAoIEJsb2NrTGlua190ICogKSB4QWRkcmVzczsKKwkJcHhFbmQtPnhCbG9ja1NpemUgPSAwOworCQlweEVuZC0+cHhOZXh0RnJlZUJsb2NrID0gTlVMTDsKKworCQkvKiBUbyBzdGFydCB3aXRoIHRoZXJlIGlzIGEgc2luZ2xlIGZyZWUgYmxvY2sgaW4gdGhpcyByZWdpb24gdGhhdCBpcworCQlzaXplZCB0byB0YWtlIHVwIHRoZSBlbnRpcmUgaGVhcCByZWdpb24gbWludXMgdGhlIHNwYWNlIHRha2VuIGJ5IHRoZQorCQlmcmVlIGJsb2NrIHN0cnVjdHVyZS4gKi8KKwkJcHhGaXJzdEZyZWVCbG9ja0luUmVnaW9uID0gKCBCbG9ja0xpbmtfdCAqICkgeEFsaWduZWRIZWFwOworCQlweEZpcnN0RnJlZUJsb2NrSW5SZWdpb24tPnhCbG9ja1NpemUgPSB4QWRkcmVzcyAtICggc2l6ZV90ICkgcHhGaXJzdEZyZWVCbG9ja0luUmVnaW9uOworCQlweEZpcnN0RnJlZUJsb2NrSW5SZWdpb24tPnB4TmV4dEZyZWVCbG9jayA9IHB4RW5kOworCisJCS8qIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCByZWdpb24gdGhhdCBtYWtlcyB1cCB0aGUgZW50aXJlIGhlYXAgc3BhY2UKKwkJdGhlbiBsaW5rIHRoZSBwcmV2aW91cyByZWdpb24gdG8gdGhpcyByZWdpb24uICovCisJCWlmKCBweFByZXZpb3VzRnJlZUJsb2NrICE9IE5VTEwgKQorCQl7CisJCQlweFByZXZpb3VzRnJlZUJsb2NrLT5weE5leHRGcmVlQmxvY2sgPSBweEZpcnN0RnJlZUJsb2NrSW5SZWdpb247CisJCX0KKworCQl4VG90YWxIZWFwU2l6ZSArPSBweEZpcnN0RnJlZUJsb2NrSW5SZWdpb24tPnhCbG9ja1NpemU7CisKKwkJLyogTW92ZSBvbnRvIHRoZSBuZXh0IEhlYXBSZWdpb25fdCBzdHJ1Y3R1cmUuICovCisJCXhEZWZpbmVkUmVnaW9ucysrOworCQlweEhlYXBSZWdpb24gPSAmKCBweEhlYXBSZWdpb25zWyB4RGVmaW5lZFJlZ2lvbnMgXSApOworCX0KKworCXhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZyA9IHhUb3RhbEhlYXBTaXplOworCXhGcmVlQnl0ZXNSZW1haW5pbmcgPSB4VG90YWxIZWFwU2l6ZTsKKworCS8qIENoZWNrIHNvbWV0aGluZyB3YXMgYWN0dWFsbHkgZGVmaW5lZCBiZWZvcmUgaXQgaXMgYWNjZXNzZWQuICovCisJY29uZmlnQVNTRVJUKCB4VG90YWxIZWFwU2l6ZSApOworCisJLyogV29yayBvdXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgYml0IGluIGEgc2l6ZV90IHZhcmlhYmxlLiAqLworCXhCbG9ja0FsbG9jYXRlZEJpdCA9ICggKCBzaXplX3QgKSAxICkgPDwgKCAoIHNpemVvZiggc2l6ZV90ICkgKiBoZWFwQklUU19QRVJfQllURSApIC0gMSApOworfQorCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00wL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTAvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWNlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00wL3BvcnQuYwpAQCAtMCwwICsxLDUxMCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmggZm9yIHRoZSBBUk0gQ00wIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyNpZm5kZWYgY29uZmlnU1lTVElDS19DTE9DS19IWgorCSNkZWZpbmUgY29uZmlnU1lTVElDS19DTE9DS19IWiBjb25maWdDUFVfQ0xPQ0tfSFoKKyNlbmRpZgorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTlZJQy4gKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVFJMCQkoICooICggdm9sYXRpbGUgdWludDMyX3QgKikgMHhlMDAwZTAxMCApKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQUQJCSggKiggKCB2b2xhdGlsZSB1aW50MzJfdCAqKSAweGUwMDBlMDE0ICkpCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTAkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqKSAweGUwMDBlZDA0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMgkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqKSAweGUwMDBlZDIwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEsJCTB4MDAwMDAwMDQKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHCQkoIDFVTCA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUCQkJMHgxMDAwMDAwMAorI2RlZmluZSBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWQkoIDI1NVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCSggcG9ydE1JTl9JTlRFUlJVUFRfUFJJT1JJVFkgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkoIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZIDw8IDI0VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJKCAweDAxMDAwMDAwICkKKworLyogQ29uc3RhbnRzIHVzZWQgd2l0aCBtZW1vcnkgYmFycmllciBpbnRyaW5zaWNzLiAqLworI2RlZmluZSBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFCQkoIDE1ICkKKworLyogVGhlIHN5c3RpY2sgaXMgYSAyNC1iaXQgY291bnRlci4gKi8KKyNkZWZpbmUgcG9ydE1BWF8yNF9CSVRfTlVNQkVSCQkJCSggMHhmZmZmZmZVTCApCisKKy8qIEEgZmlkZGxlIGZhY3RvciB0byBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIFN5c1RpY2sgY291bnRzIHRoYXQgd291bGQgaGF2ZQorb2NjdXJyZWQgd2hpbGUgdGhlIFN5c1RpY2sgY291bnRlciBpcyBzdG9wcGVkIGR1cmluZyB0aWNrbGVzcyBpZGxlCitjYWxjdWxhdGlvbnMuICovCisjZGVmaW5lIHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUgkJCSggNDVVTCApCisKKy8qIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCit2YXJpYWJsZS4gKi8KK3N0YXRpYyBVQmFzZVR5cGVfdCB1eENyaXRpY2FsTmVzdGluZyA9IDB4YWFhYWFhYWE7CisKKy8qCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApOworCisvKgorICogRXhjZXB0aW9uIGhhbmRsZXJzLgorICovCit2b2lkIHhQb3J0UGVuZFNWSGFuZGxlciggdm9pZCApOwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICk7Cit2b2lkIHZQb3J0U1ZDSGFuZGxlciggdm9pZCApOworCisvKgorICogU3RhcnQgZmlyc3QgdGFzayBpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSB0ZXN0ZWQgaW4gaXNvbGF0aW9uLgorICovCitzdGF0aWMgdm9pZCBwcnZQb3J0U3RhcnRGaXJzdFRhc2soIHZvaWQgKTsKKworLyoKKyAqIFVzZWQgdG8gY2F0Y2ggdGFza3MgdGhhdCBhdHRlbXB0IHRvIHJldHVybiBmcm9tIHRoZWlyIGltcGxlbWVudGluZyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFRoZSBudW1iZXIgb2YgU3lzVGljayBpbmNyZW1lbnRzIHRoYXQgbWFrZSB1cCBvbmUgdGljayBwZXJpb2QuCisgKi8KKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisJc3RhdGljIHVuc2lnbmVkIGxvbmcgdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGljayBwZXJpb2RzIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgaXMgbGltaXRlZCBieSB0aGUKKyAqIDI0IGJpdCByZXNvbHV0aW9uIG9mIHRoZSBTeXNUaWNrIHRpbWVyLgorICovCisjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCXN0YXRpYyB1bnNpZ25lZCBsb25nIHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBDb21wZW5zYXRlIGZvciB0aGUgQ1BVIGN5Y2xlcyB0aGF0IHBhc3Mgd2hpbGUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCAobG93CisgKiBwb3dlciBmdW5jdGlvbmFsaXR5IG9ubHkuCisgKi8KKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisJc3RhdGljIHVuc2lnbmVkIGxvbmcgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBTZWUgaGVhZGVyIGZpbGUgZm9yIGRlc2NyaXB0aW9uLgorICovCitTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycyApCit7CisJLyogU2ltdWxhdGUgdGhlIHN0YWNrIGZyYW1lIGFzIGl0IHdvdWxkIGJlIGNyZWF0ZWQgYnkgYSBjb250ZXh0IHN3aXRjaAorCWludGVycnVwdC4gKi8KKwlweFRvcE9mU3RhY2stLTsgLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0IG9mIGludGVycnVwdHMuICovCisJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX1hQU1I7CS8qIHhQU1IgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4Q29kZTsJLyogUEMgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBydlRhc2tFeGl0RXJyb3I7CS8qIExSICovCisJcHhUb3BPZlN0YWNrIC09IDU7CS8qIFIxMiwgUjMsIFIyIGFuZCBSMS4gKi8KKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJLyogUjAgKi8KKwlweFRvcE9mU3RhY2sgLT0gODsgLyogUjExLi5SNC4gKi8KKworCXJldHVybiBweFRvcE9mU3RhY2s7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApCit7CisJLyogQSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYSB0YXNrIG11c3Qgbm90IGV4aXQgb3IgYXR0ZW1wdCB0byByZXR1cm4gdG8KKwlpdHMgY2FsbGVyIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLiAgSWYgYSB0YXNrIHdhbnRzIHRvIGV4aXQgaXQKKwlzaG91bGQgaW5zdGVhZCBjYWxsIHZUYXNrRGVsZXRlKCBOVUxMICkuCisKKwlBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0KCkgdG8gYmUgdHJpZ2dlcmVkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzCisJZGVmaW5lZCwgdGhlbiBzdG9wIGhlcmUgc28gYXBwbGljYXRpb24gd3JpdGVycyBjYW4gY2F0Y2ggdGhlIGVycm9yLiAqLworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgPT0gfjBVTCApOworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwlmb3IoIDs7ICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKQoreworCS8qIFRoaXMgZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIHVzZWQsIGJ1dCByZXRhaW5lZCBmb3IgYmFja3dhcmQKKwljb21wYXRpYmlsaXR5LiAqLworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgcHJ2UG9ydFN0YXJ0Rmlyc3RUYXNrKCB2b2lkICkKK3sKKwlleHRlcm4gcHhDdXJyZW50VENCOworCisJUFJFU0VSVkU4CisKKwkvKiBUaGUgTVNQIHN0YWNrIGlzIG5vdCByZXNldCBhcywgdW5saWtlIG9uIE0zLzQgcGFydHMsIHRoZXJlIGlzIG5vIHZlY3RvcgorCXRhYmxlIG9mZnNldCByZWdpc3RlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvY2F0ZSB0aGUgaW5pdGlhbCBzdGFjayB2YWx1ZS4KKwlOb3QgYWxsIE0wIHBhcnRzIGhhdmUgdGhlIGFwcGxpY2F0aW9uIHZlY3RvciB0YWJsZSBhdCBhZGRyZXNzIDAuICovCisKKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IJLyogT2J0YWluIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQi4gKi8KKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0JCQkvKiBUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCWFkZHMgcjAsICMzMgkJCS8qIERpc2NhcmQgZXZlcnl0aGluZyB1cCB0byByMC4gKi8KKwltc3IgcHNwLCByMAkJCQkvKiBUaGlzIGlzIG5vdyB0aGUgbmV3IHRvcCBvZiBzdGFjayB0byB1c2UgaW4gdGhlIHRhc2suICovCisJbW92cyByMCwgIzIJCQkJLyogU3dpdGNoIHRvIHRoZSBwc3Agc3RhY2suICovCisJbXNyIENPTlRST0wsIHIwCisJaXNiCisJcG9wIHtyMC1yNX0JCQkJLyogUG9wIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgc2F2ZWQgYXV0b21hdGljYWxseS4gKi8KKwltb3YgbHIsIHI1CQkJCS8qIGxyIGlzIG5vdyBpbiByNS4gKi8KKwlwb3Age3IzfQkJCQkvKiBUaGUgcmV0dXJuIGFkZHJlc3MgaXMgbm93IGluIHIzLiAqLworCXBvcCB7cjJ9CQkJCS8qIFBvcCBhbmQgZGlzY2FyZCB0aGUgWFBTUi4gKi8KKwljcHNpZSBpCQkJCQkvKiBUaGUgZmlyc3QgdGFzayBoYXMgaXRzIGNvbnRleHQgYW5kIGludGVycnVwdHMgY2FuIGJlIGVuYWJsZWQuICovCisJYnggcjMJCQkJCS8qIEZpbmFsbHksIGp1bXAgdG8gdGhlIHVzZXIgZGVmaW5lZCB0YXNrIGNvZGUuICovCisKKwlBTElHTgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZWUgaGVhZGVyIGZpbGUgZm9yIGRlc2NyaXB0aW9uLgorICovCitCYXNlVHlwZV90IHhQb3J0U3RhcnRTY2hlZHVsZXIoIHZvaWQgKQoreworCS8qIE1ha2UgUGVuZFNWLCBDYWxsU1YgYW5kIFN5c1RpY2sgdGhlIHNhbWUgcHJpcm9pdHkgYXMgdGhlIGtlcm5lbC4gKi8KKwkqKHBvcnROVklDX1NZU1BSSTIpIHw9IHBvcnROVklDX1BFTkRTVl9QUkk7CisJKihwb3J0TlZJQ19TWVNQUkkyKSB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwlwcnZTZXR1cFRpbWVySW50ZXJydXB0KCk7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IHJlYWR5IGZvciB0aGUgZmlyc3QgdGFzay4gKi8KKwl1eENyaXRpY2FsTmVzdGluZyA9IDA7CisKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwlwcnZQb3J0U3RhcnRGaXJzdFRhc2soKTsKKworCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUhICovCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApCit7CisJLyogTm90IGltcGxlbWVudGVkIGluIHBvcnRzIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLgorCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxMDAwVUwgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0WWllbGQoIHZvaWQgKQoreworCS8qIFNldCBhIFBlbmRTViB0byByZXF1ZXN0IGEgY29udGV4dCBzd2l0Y2guICovCisJKiggcG9ydE5WSUNfSU5UX0NUUkwgKSA9IHBvcnROVklDX1BFTkRTVlNFVDsKKworCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQgYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CisJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLworCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJX19pc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApCit7CisgICAgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworICAgIHV4Q3JpdGljYWxOZXN0aW5nKys7CisJX19kc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKwlfX2lzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKQoreworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgKTsKKyAgICB1eENyaXRpY2FsTmVzdGluZy0tOworICAgIGlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAwICkKKyAgICB7CisgICAgICAgIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworICAgIH0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSB1aW50MzJfdCB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCB2b2lkICkKK3sKKwltcnMgcjAsIFBSSU1BU0sKKwljcHNpZCBpCisJYnggbHIKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSB2b2lkIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCB1aW50MzJfdCB1bE1hc2sgKQoreworCW1zciBQUklNQVNLLCByMAorCWJ4IGxyCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworX19hc20gdm9pZCB4UG9ydFBlbmRTVkhhbmRsZXIoIHZvaWQgKQoreworCWV4dGVybiB2VGFza1N3aXRjaENvbnRleHQKKwlleHRlcm4gcHhDdXJyZW50VENCCisKKwlQUkVTRVJWRTgKKworCW1ycyByMCwgcHNwCisKKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IgCS8qIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgVENCLiAqLworCWxkcglyMiwgW3IzXQorCisJc3VicyByMCwgIzMyCQkJLyogTWFrZSBzcGFjZSBmb3IgdGhlIHJlbWFpbmluZyBsb3cgcmVnaXN0ZXJzLiAqLworCXN0ciByMCwgW3IyXQkJCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2suICovCisJc3RtaWEgcjAhLCB7cjQtcjd9CQkvKiBTdG9yZSB0aGUgbG93IHJlZ2lzdGVycyB0aGF0IGFyZSBub3Qgc2F2ZWQgYXV0b21hdGljYWxseS4gKi8KKwltb3YgcjQsIHI4CQkJCS8qIFN0b3JlIHRoZSBoaWdoIHJlZ2lzdGVycy4gKi8KKwltb3YgcjUsIHI5CisJbW92IHI2LCByMTAKKwltb3YgcjcsIHIxMQorCXN0bWlhIHIwISwge3I0LXI3fQorCisJcHVzaCB7cjMsIHIxNH0KKwljcHNpZCBpCisJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CisJY3BzaWUgaQorCXBvcCB7cjIsIHIzfQkJCS8qIGxyIGdvZXMgaW4gcjMuIHIyIG5vdyBob2xkcyB0Y2IgcG9pbnRlci4gKi8KKworCWxkciByMSwgW3IyXQorCWxkciByMCwgW3IxXQkJCS8qIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJYWRkcyByMCwgIzE2CQkJLyogTW92ZSB0byB0aGUgaGlnaCByZWdpc3RlcnMuICovCisJbGRtaWEgcjAhLCB7cjQtcjd9CQkvKiBQb3AgdGhlIGhpZ2ggcmVnaXN0ZXJzLiAqLworCW1vdiByOCwgcjQKKwltb3YgcjksIHI1CisJbW92IHIxMCwgcjYKKwltb3YgcjExLCByNworCisJbXNyIHBzcCwgcjAJCQkJLyogUmVtZW1iZXIgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgZm9yIHRoZSB0YXNrLiAqLworCisJc3VicyByMCwgIzMyCQkJLyogR28gYmFjayBmb3IgdGhlIGxvdyByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuICovCisJbGRtaWEgcjAhLCB7cjQtcjd9ICAgICAgLyogUG9wIGxvdyByZWdpc3RlcnMuICAqLworCisJYnggcjMKKwlBTElHTgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApCit7Cit1aW50MzJfdCB1bFByZXZpb3VzTWFzazsKKworCXVsUHJldmlvdXNNYXNrID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCXsKKwkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2suICovCisJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogUGVuZCBhIGNvbnRleHQgc3dpdGNoLiAqLworCQkJKihwb3J0TlZJQ19JTlRfQ1RSTCkgPSBwb3J0TlZJQ19QRU5EU1ZTRVQ7CisJCX0KKwl9CisJcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCB1bFByZXZpb3VzTWFzayApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisKKwlfX3dlYWsgdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApCisJeworCXVpbnQzMl90IHVsUmVsb2FkVmFsdWUsIHVsQ29tcGxldGVUaWNrUGVyaW9kcywgdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cywgdWxTeXNUaWNrQ1RSTDsKKwlUaWNrVHlwZV90IHhNb2RpZmlhYmxlSWRsZVRpbWU7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBTeXNUaWNrIHJlbG9hZCB2YWx1ZSBkb2VzIG5vdCBvdmVyZmxvdyB0aGUgY291bnRlci4gKi8KKwkJaWYoIHhFeHBlY3RlZElkbGVUaW1lID4geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyApCisJCXsKKwkJCXhFeHBlY3RlZElkbGVUaW1lID0geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrczsKKwkJfQorCisJCS8qIFN0b3AgdGhlIFN5c1RpY2sgbW9tZW50YXJpbHkuICBUaGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvcgorCQlpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIGJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbAorCQlpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkgZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUKKwkJa2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhciB0aW1lLiAqLworCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkwgJj0gfnBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworCisJCS8qIENhbGN1bGF0ZSB0aGUgcmVsb2FkIHZhbHVlIHJlcXVpcmVkIHRvIHdhaXQgeEV4cGVjdGVkSWRsZVRpbWUKKwkJdGljayBwZXJpb2RzLiAgLTEgaXMgdXNlZCBiZWNhdXNlIHRoaXMgY29kZSB3aWxsIGV4ZWN1dGUgcGFydCB3YXkKKwkJdGhyb3VnaCBvbmUgb2YgdGhlIHRpY2sgcGVyaW9kcy4gKi8KKwkJdWxSZWxvYWRWYWx1ZSA9IHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRSArICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKiAoIHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMICkgKTsKKwkJaWYoIHVsUmVsb2FkVmFsdWUgPiB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApCisJCXsKKwkJCXVsUmVsb2FkVmFsdWUgLT0gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb247CisJCX0KKworCQkvKiBFbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYnV0IGRvbid0IHVzZSB0aGUgdGFza0VOVEVSX0NSSVRJQ0FMKCkKKwkJbWV0aG9kIGFzIHRoYXQgd2lsbCBtYXNrIGludGVycnVwdHMgdGhhdCBzaG91bGQgZXhpdCBzbGVlcCBtb2RlLiAqLworCQlfX2Rpc2FibGVfaXJxKCk7CisKKwkJLyogSWYgYSBjb250ZXh0IHN3aXRjaCBpcyBwZW5kaW5nIG9yIGEgdGFzayBpcyB3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGVyCisJCXRvIGJlIHVuc3VzcGVuZGVkIHRoZW4gYWJhbmRvbiB0aGUgbG93IHBvd2VyIGVudHJ5LiAqLworCQlpZiggZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgPT0gZUFib3J0U2xlZXAgKQorCQl7CisJCQkvKiBSZXN0YXJ0IGZyb20gd2hhdGV2ZXIgaXMgbGVmdCBpbiB0aGUgY291bnQgcmVnaXN0ZXIgdG8gY29tcGxldGUKKwkJCXRoaXMgdGljayBwZXJpb2QuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQUQgPSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUU7CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljay4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTCB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKworCQkJLyogUmVzZXQgdGhlIHJlbG9hZCByZWdpc3RlciB0byB0aGUgdmFsdWUgcmVxdWlyZWQgZm9yIG5vcm1hbCB0aWNrCisJCQlwZXJpb2RzLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEID0gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUw7CisKKwkJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIC0gc2VlIGNvbW1lbnRzIGFib3ZlIF9fZGlzYWJsZV9pcnEoKSBjYWxsCisJCQlhYm92ZS4gKi8KKwkJCV9fZW5hYmxlX2lycSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogU2V0IHRoZSBuZXcgcmVsb2FkIHZhbHVlLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEID0gdWxSZWxvYWRWYWx1ZTsKKworCQkJLyogQ2xlYXIgdGhlIFN5c1RpY2sgY291bnQgZmxhZyBhbmQgc2V0IHRoZSBjb3VudCB2YWx1ZSBiYWNrIHRvCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFID0gMFVMOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkwgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7CisKKwkJCS8qIFNsZWVwIHVudGlsIHNvbWV0aGluZyBoYXBwZW5zLiAgY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoKSBjYW4KKwkJCXNldCBpdHMgcGFyYW1ldGVyIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCBpdHMgaW1wbGVtZW50YXRpb24gY29udGFpbnMKKwkJCWl0cyBvd24gd2FpdCBmb3IgaW50ZXJydXB0IG9yIHdhaXQgZm9yIGV2ZW50IGluc3RydWN0aW9uLCBhbmQgc28gd2ZpCisJCQlzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGFnYWluLiAgSG93ZXZlciwgdGhlIG9yaWdpbmFsIGV4cGVjdGVkIGlkbGUKKwkJCXRpbWUgdmFyaWFibGUgbXVzdCByZW1haW4gdW5tb2RpZmllZCwgc28gYSBjb3B5IGlzIHRha2VuLiAqLworCQkJeE1vZGlmaWFibGVJZGxlVGltZSA9IHhFeHBlY3RlZElkbGVUaW1lOworCQkJY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoICZ4TW9kaWZpYWJsZUlkbGVUaW1lICk7CisJCQlpZiggeE1vZGlmaWFibGVJZGxlVGltZSA+IDAgKQorCQkJeworCQkJCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCQkJX193ZmkoKTsKKwkJCQlfX2lzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOworCQkJfQorCQkJY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HKCAmeEV4cGVjdGVkSWRsZVRpbWUgKTsKKworCQkJLyogU3RvcCBTeXNUaWNrLiAgQWdhaW4sIHRoZSB0aW1lIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgZm9yIGlzCisJCQlhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIGJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbAorCQkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCisJCQlrZXJuZWwgd2l0aCByZXNwZWN0IHRvIGNhbGVuZGFyIHRpbWUuICovCisJCQl1bFN5c1RpY2tDVFJMID0gcG9ydE5WSUNfU1lTVElDS19DVFJMOworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMID0gKCB1bFN5c1RpY2tDVFJMICYgfnBvcnROVklDX1NZU1RJQ0tfRU5BQkxFICk7CisKKwkJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIC0gc2VlIGNvbW1lbnRzIGFib3ZlIF9fZGlzYWJsZV9pcnEoKSBjYWxsCisJCQlhYm92ZS4gKi8KKwkJCV9fZW5hYmxlX2lycSgpOworCisJCQlpZiggKCB1bFN5c1RpY2tDVFJMICYgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHICkgIT0gMCApCisJCQl7CisJCQkJdWludDMyX3QgdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogVGhlIHRpY2sgaW50ZXJydXB0IGhhcyBhbHJlYWR5IGV4ZWN1dGVkLCBhbmQgdGhlIFN5c1RpY2sKKwkJCQljb3VudCByZWxvYWRlZCB3aXRoIHVsUmVsb2FkVmFsdWUuICBSZXNldCB0aGUKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQUQgd2l0aCB3aGF0ZXZlciByZW1haW5zIG9mIHRoaXMgdGljaworCQkJCXBlcmlvZC4gKi8KKwkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICkgLSAoIHVsUmVsb2FkVmFsdWUgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgKTsKKworCQkJCS8qIERvbid0IGFsbG93IGEgdGlueSB2YWx1ZSwgb3IgdmFsdWVzIHRoYXQgaGF2ZSBzb21laG93CisJCQkJdW5kZXJmbG93ZWQgYmVjYXVzZSB0aGUgcG9zdCBzbGVlcCBob29rIGRpZCBzb21ldGhpbmcKKwkJCQl0aGF0IHRvb2sgdG9vIGxvbmcuICovCisJCQkJaWYoICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlIDwgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gKSB8fCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA+IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgKQorCQkJCXsKKwkJCQkJdWxDYWxjdWxhdGVkTG9hZFZhbHVlID0gKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTCApOworCQkJCX0KKworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBoYW5kbGVyIHdpbGwgYWxyZWFkeSBoYXZlIHBlbmRlZCB0aGUgdGljaworCQkJCXByb2Nlc3NpbmcgaW4gdGhlIGtlcm5lbC4gIEFzIHRoZSBwZW5kaW5nIHRpY2sgd2lsbCBiZQorCQkJCXByb2Nlc3NlZCBhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gZXhpdHMsIHRoZSB0aWNrIHZhbHVlCisJCQkJbWFpbnRhaW5lZCBieSB0aGUgdGljayBpcyBzdGVwcGVkIGZvcndhcmQgYnkgb25lIGxlc3MgdGhhbiB0aGUKKwkJCQl0aW1lIHNwZW50IHdhaXRpbmcuICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0geEV4cGVjdGVkSWRsZVRpbWUgLSAxVUw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogU29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHRpY2sgaW50ZXJydXB0IGVuZGVkIHRoZSBzbGVlcC4KKwkJCQlXb3JrIG91dCBob3cgbG9uZyB0aGUgc2xlZXAgbGFzdGVkIHJvdW5kZWQgdG8gY29tcGxldGUgdGljaworCQkJCXBlcmlvZHMgKG5vdCB0aGUgdWxSZWxvYWQgdmFsdWUgd2hpY2ggYWNjb3VudGVkIGZvciBwYXJ0CisJCQkJdGlja3MpLiAqLworCQkJCXVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgPSAoIHhFeHBlY3RlZElkbGVUaW1lICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRTsKKworCQkJCS8qIEhvdyBtYW55IGNvbXBsZXRlIHRpY2sgcGVyaW9kcyBwYXNzZWQgd2hpbGUgdGhlIHByb2Nlc3NvcgorCQkJCXdhcyB3YWl0aW5nPyAqLworCQkJCXVsQ29tcGxldGVUaWNrUGVyaW9kcyA9IHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKworCQkJCS8qIFRoZSByZWxvYWQgdmFsdWUgaXMgc2V0IHRvIHdoYXRldmVyIGZyYWN0aW9uIG9mIGEgc2luZ2xlIHRpY2sKKwkJCQlwZXJpb2QgcmVtYWlucy4gKi8KKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQUQgPSAoICggdWxDb21wbGV0ZVRpY2tQZXJpb2RzICsgMSApICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHM7CisJCQl9CisKKwkJCS8qIFJlc3RhcnQgU3lzVGljayBzbyBpdCBydW5zIGZyb20gcG9ydE5WSUNfU1lTVElDS19MT0FECisJCQlhZ2FpbiwgdGhlbiBzZXQgcG9ydE5WSUNfU1lTVElDS19MT0FEIGJhY2sgdG8gaXRzIHN0YW5kYXJkCisJCQl2YWx1ZS4gIFRoZSBjcml0aWNhbCBzZWN0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoZSB0aWNrIGludGVycnVwdAorCQkJY2FuIG9ubHkgZXhlY3V0ZSBvbmNlIGluIHRoZSBjYXNlIHRoYXQgdGhlIHJlbG9hZCByZWdpc3RlciBpcyBuZWFyCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFID0gMFVMOworCQkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7CisJCQl7CisJCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworCQkJCXZUYXNrU3RlcFRpY2soIHVsQ29tcGxldGVUaWNrUGVyaW9kcyApOworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCQkJfQorCQkJcG9ydEVYSVRfQ1JJVElDQUwoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qICNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNldHVwIHRoZSBzeXN0aWNrIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMgYXQgdGhlIHJlcXVpcmVkCisgKiBmcmVxdWVuY3kuCisgKi8KK3ZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCit7CisJCQkvKiBDYWxjdWxhdGUgdGhlIGNvbnN0YW50cyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlIHRpY2sgaW50ZXJydXB0LiAqLworICAjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCQl7CisJCQl1bFRpbWVyQ291bnRzRm9yT25lVGljayA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApOworCQkJeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IHBvcnRNQVhfMjRfQklUX05VTUJFUiAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCQkJdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKKwkJfQorCQkjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworCS8qIFN0b3AgYW5kIHJlc2V0IHRoZSBTeXNUaWNrLiAqLworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTCA9IDBVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgPSAwVUw7CisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCXBvcnROVklDX1NZU1RJQ0tfTE9BRCA9ICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJcG9ydE5WSUNfU1lTVElDS19DVFJMID0gcG9ydE5WSUNfU1lTVElDS19DTEsgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTAvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00wL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWY3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00wL3BvcnRtYWNyby5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyogU2NoZWR1bGVyIHV0aWxpdGllcy4gKi8KK2V4dGVybiB2b2lkIHZQb3J0WWllbGQoIHZvaWQgKTsKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkxfUkVHCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCQkoIDFVTCA8PCAyOFVMICkKKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJCXZQb3J0WWllbGQoKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApIGlmKCB4U3dpdGNoUmVxdWlyZWQgKSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LiAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApOworZXh0ZXJuIHVpbnQzMl90IHVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCB1aW50MzJfdCB1bE1hc2sgKTsKKworI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCXVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHggKQorI2RlZmluZSBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkJCQkJX19kaXNhYmxlX2lycSgpCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQlfX2VuYWJsZV9pcnEoKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRhc2sgZnVuY3Rpb24gbWFjcm9zIGFzIGRlc2NyaWJlZCBvbiB0aGUgRnJlZVJUT1Mub3JnIFdFQiBzaXRlLiAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisKKyNkZWZpbmUgcG9ydE5PUCgpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00zL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTMvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjVhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00zL3BvcnQuYwpAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmggZm9yIHRoZSBBUk0gQ00zIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyNpZm5kZWYgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWQorCSNkZWZpbmUgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSAyNTUKKyNlbmRpZgorCisjaWYgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZID09IDAKKwkjZXJyb3IgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLiAgU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwKKyNlbmRpZgorCisjaWZuZGVmIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFoKKwkjZGVmaW5lIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogY29uZmlnQ1BVX0NMT0NLX0haCisJLyogRW5zdXJlIHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgYXQgdGhlIHNhbWUgZnJlcXVlbmN5IGFzIHRoZSBjb3JlLiAqLworCSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEtfQklUCSggMVVMIDw8IDJVTCApCisjZWxzZQorCS8qIFRoZSB3YXkgdGhlIFN5c1RpY2sgaXMgY2xvY2tlZCBpcyBub3QgbW9kaWZpZWQgaW4gY2FzZSBpdCBpcyBub3QgdGhlIHNhbWUKKwlhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDAgKQorI2VuZGlmCisKKy8qIFRoZSBfX3dlYWsgYXR0cmlidXRlIGRvZXMgbm90IHdvcmsgYXMgeW91IG1pZ2h0IGV4cGVjdCB3aXRoIHRoZSBLZWlsIHRvb2xzCitzbyB0aGUgY29uZmlnT1ZFUlJJREVfREVGQVVMVF9USUNLX0NPTkZJR1VSQVRJT04gY29uc3RhbnQgbXVzdCBiZSBzZXQgdG8gMSBpZgordGhlIGFwcGxpY2F0aW9uIHdyaXRlciB3YW50cyB0byBwcm92aWRlIHRoZWlyIG93biBpbXBsZW1lbnRhdGlvbiBvZgordlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCkuICBFbnN1cmUgY29uZmlnT1ZFUlJJREVfREVGQVVMVF9USUNLX0NPTkZJR1VSQVRJT04KK2lzIGRlZmluZWQuICovCisjaWZuZGVmIGNvbmZpZ09WRVJSSURFX0RFRkFVTFRfVElDS19DT05GSUdVUkFUSU9OCisJI2RlZmluZSBjb25maWdPVkVSUklERV9ERUZBVUxUX1RJQ0tfQ09ORklHVVJBVElPTiAwCisjZW5kaWYKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIGNvcmUuICBSZWdpc3RlcnMgZmlyc3QuLi4gKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTAgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTggKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTJfUkVHCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjAgKSApCisvKiAuLi50aGVuIGJpdHMgaW4gdGhlIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUCQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUCQkJKCAxVUwgPDwgMFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVAkJKCAxVUwgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVkNMRUFSX0JJVCAJCQkoIDFVTCA8PCAyN1VMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORF9TWVNUSUNLX0NMRUFSX0JJVAkJKCAxVUwgPDwgMjVVTCApCisKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDI0VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFuIGludGVycnVwdCBwcmlvcml0eS4gKi8KKyNkZWZpbmUgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUgkJKCAxNiApCisjZGVmaW5lIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgCSggMHhFMDAwRTNGMCApCisjZGVmaW5lIHBvcnRBSVJDUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBFRDBDICkgKQorI2RlZmluZSBwb3J0TUFYXzhfQklUX1ZBTFVFCQkJCQkoICggdWludDhfdCApIDB4ZmYgKQorI2RlZmluZSBwb3J0VE9QX0JJVF9PRl9CWVRFCQkJCQkoICggdWludDhfdCApIDB4ODAgKQorI2RlZmluZSBwb3J0TUFYX1BSSUdST1VQX0JJVFMJCQkJKCAoIHVpbnQ4X3QgKSA3ICkKKyNkZWZpbmUgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sJCQkJKCAweDA3VUwgPDwgOFVMICkKKyNkZWZpbmUgcG9ydFBSSUdST1VQX1NISUZUCQkJCQkoIDhVTCApCisKKy8qIE1hc2tzIG9mZiBhbGwgYml0cyBidXQgdGhlIFZFQ1RBQ1RJVkUgYml0cyBpbiB0aGUgSUNTUiByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydFZFQ1RBQ1RJVkVfTUFTSwkJCQkJKCAweEZGVUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJKCAweDAxMDAwMDAwICkKKworLyogVGhlIHN5c3RpY2sgaXMgYSAyNC1iaXQgY291bnRlci4gKi8KKyNkZWZpbmUgcG9ydE1BWF8yNF9CSVRfTlVNQkVSCQkJCSggMHhmZmZmZmZVTCApCisKKy8qIEEgZmlkZGxlIGZhY3RvciB0byBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIFN5c1RpY2sgY291bnRzIHRoYXQgd291bGQgaGF2ZQorb2NjdXJyZWQgd2hpbGUgdGhlIFN5c1RpY2sgY291bnRlciBpcyBzdG9wcGVkIGR1cmluZyB0aWNrbGVzcyBpZGxlCitjYWxjdWxhdGlvbnMuICovCisjZGVmaW5lIHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUgkJCSggNDVVTCApCisKKy8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCitoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KKyNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKgorICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuICBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcworICogZmlsZSBpcyB3ZWFrIHRvIGFsbG93IGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gY2hhbmdlIHRoZSB0aW1lciB1c2VkIHRvCisgKiBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CisKKy8qCisgKiBFeGNlcHRpb24gaGFuZGxlcnMuCisgKi8KK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICk7Cit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKTsKK3ZvaWQgdlBvcnRTVkNIYW5kbGVyKCB2b2lkICk7CisKKy8qCisgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlN0YXJ0Rmlyc3RUYXNrKCB2b2lkICk7CisKKy8qCisgKiBVc2VkIHRvIGNhdGNoIHRhc2tzIHRoYXQgYXR0ZW1wdCB0byByZXR1cm4gZnJvbSB0aGVpciBpbXBsZW1lbnRpbmcgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCit2YXJpYWJsZS4gKi8KK3N0YXRpYyBVQmFzZVR5cGVfdCB1eENyaXRpY2FsTmVzdGluZyA9IDB4YWFhYWFhYWE7CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIFN5c1RpY2sgaW5jcmVtZW50cyB0aGF0IG1ha2UgdXAgb25lIHRpY2sgcGVyaW9kLgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrIHBlcmlvZHMgdGhhdCBjYW4gYmUgc3VwcHJlc3NlZCBpcyBsaW1pdGVkIGJ5IHRoZQorICogMjQgYml0IHJlc29sdXRpb24gb2YgdGhlIFN5c1RpY2sgdGltZXIuCisgKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJc3RhdGljIHVpbnQzMl90IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBDb21wZW5zYXRlIGZvciB0aGUgQ1BVIGN5Y2xlcyB0aGF0IHBhc3Mgd2hpbGUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCAobG93CisgKiBwb3dlciBmdW5jdGlvbmFsaXR5IG9ubHkuCisgKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisJc3RhdGljIHVpbnQzMl90IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogVXNlZCBieSB0aGUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIG1hY3JvIHRvIGVuc3VyZQorICogRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBhcmUgbm90IGNhbGxlZCBmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQKKyAqIGEgcHJpb3JpdHkgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorICovCisjaWYgKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwkgc3RhdGljIHVpbnQ4X3QgdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSAwOworCSBzdGF0aWMgdWludDMyX3QgdWxNYXhQUklHUk9VUFZhbHVlID0gMDsKKwkgc3RhdGljIGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzID0gKCB1aW50OF90ICogKSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2OworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMgKQoreworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwlpbnRlcnJ1cHQuICovCisJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkvKiB4UFNSICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggKCBTdGFja1R5cGVfdCApIHB4Q29kZSApICYgcG9ydFNUQVJUX0FERFJFU1NfTUFTSzsJLyogUEMgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBydlRhc2tFeGl0RXJyb3I7CS8qIExSICovCisKKwlweFRvcE9mU3RhY2sgLT0gNTsJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkvKiBSMCAqLworCXB4VG9wT2ZTdGFjayAtPSA4OwkvKiBSMTEsIFIxMCwgUjksIFI4LCBSNywgUjYsIFI1IGFuZCBSNC4gKi8KKworCXJldHVybiBweFRvcE9mU3RhY2s7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApCit7CisJLyogQSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYSB0YXNrIG11c3Qgbm90IGV4aXQgb3IgYXR0ZW1wdCB0byByZXR1cm4gdG8KKwlpdHMgY2FsbGVyIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLiAgSWYgYSB0YXNrIHdhbnRzIHRvIGV4aXQgaXQKKwlzaG91bGQgaW5zdGVhZCBjYWxsIHZUYXNrRGVsZXRlKCBOVUxMICkuCisKKwlBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0KCkgdG8gYmUgdHJpZ2dlcmVkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzCisJZGVmaW5lZCwgdGhlbiBzdG9wIGhlcmUgc28gYXBwbGljYXRpb24gd3JpdGVycyBjYW4gY2F0Y2ggdGhlIGVycm9yLiAqLworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgPT0gfjBVTCApOworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwlmb3IoIDs7ICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworX19hc20gdm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKQoreworCVBSRVNFUlZFOAorCisJbGRyCXIzLCA9cHhDdXJyZW50VENCCS8qIFJlc3RvcmUgdGhlIGNvbnRleHQuICovCisJbGRyIHIxLCBbcjNdCQkJLyogVXNlIHB4Q3VycmVudFRDQkNvbnN0IHRvIGdldCB0aGUgcHhDdXJyZW50VENCIGFkZHJlc3MuICovCisJbGRyIHIwLCBbcjFdCQkJLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwlsZG1pYSByMCEsIHtyNC1yMTF9CQkvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCBvbiBleGNlcHRpb24gZW50cnkgYW5kIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50LiAqLworCW1zciBwc3AsIHIwCQkJCS8qIFJlc3RvcmUgdGhlIHRhc2sgc3RhY2sgcG9pbnRlci4gKi8KKwlpc2IKKwltb3YgcjAsICMwCisJbXNyCWJhc2VwcmksIHIwCisJb3JyIHIxNCwgIzB4ZAorCWJ4IHIxNAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgcHJ2U3RhcnRGaXJzdFRhc2soIHZvaWQgKQoreworCVBSRVNFUlZFOAorCisJLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCWxkciByMCwgPTB4RTAwMEVEMDgKKwlsZHIgcjAsIFtyMF0KKwlsZHIgcjAsIFtyMF0KKworCS8qIFNldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwltc3IgbXNwLCByMAorCS8qIEdsb2JhbGx5IGVuYWJsZSBpbnRlcnJ1cHRzLiAqLworCWNwc2llIGkKKwljcHNpZSBmCisJZHNiCisJaXNiCisJLyogQ2FsbCBTVkMgdG8gc3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJc3ZjIDAKKwlub3AKKwlub3AKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCXsKKwkJdm9sYXRpbGUgdWludDMyX3QgdWxPcmlnaW5hbFByaW9yaXR5OworCQl2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9ICggdWludDhfdCAqICkgKCBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2ICsgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApOworCQl2b2xhdGlsZSB1aW50OF90IHVjTWF4UHJpb3JpdHlWYWx1ZTsKKworCQkvKiBEZXRlcm1pbmUgdGhlIG1heGltdW0gcHJpb3JpdHkgZnJvbSB3aGljaCBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQuICBJU1Igc2FmZSBmdW5jdGlvbnMgYXJlIHRob3NlIHRoYXQgZW5kIGluCisJCSJGcm9tSVNSIi4gIEZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvCisJCWVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCVNhdmUgdGhlIGludGVycnVwdCBwcmlvcml0eSB2YWx1ZSB0aGF0IGlzIGFib3V0IHRvIGJlIGNsb2JiZXJlZC4gKi8KKwkJdWxPcmlnaW5hbFByaW9yaXR5ID0gKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXI7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhdmFpbGFibGUuICBGaXJzdCB3cml0ZSB0byBhbGwKKwkJcG9zc2libGUgYml0cy4gKi8KKwkJKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSBwb3J0TUFYXzhfQklUX1ZBTFVFOworCisJCS8qIFJlYWQgdGhlIHZhbHVlIGJhY2sgdG8gc2VlIGhvdyBtYW55IGJpdHMgc3R1Y2suICovCisJCXVjTWF4UHJpb3JpdHlWYWx1ZSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIFRoZSBrZXJuZWwgaW50ZXJydXB0IHByaW9yaXR5IHNob3VsZCBiZSBzZXQgdG8gdGhlIGxvd2VzdAorCQlwcmlvcml0eS4gKi8KKwkJY29uZmlnQVNTRVJUKCB1Y01heFByaW9yaXR5VmFsdWUgPT0gKCBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICYgdWNNYXhQcmlvcml0eVZhbHVlICkgKTsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCSNpZmRlZiBfX05WSUNfUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBDTVNJUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IF9fTlZJQ19QUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkjaWZkZWYgY29uZmlnUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBGcmVlUlRPUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IGNvbmZpZ1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCXBydlN0YXJ0Rmlyc3RUYXNrKCk7CisKKwkvKiBTaG91bGQgbm90IGdldCBoZXJlISAqLworCXJldHVybiAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbmRTY2hlZHVsZXIoIHZvaWQgKQoreworCS8qIE5vdCBpbXBsZW1lbnRlZCBpbiBwb3J0cyB3aGVyZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiB0by4KKwlBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0LiAqLworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgPT0gMTAwMFVMICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKQoreworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl1eENyaXRpY2FsTmVzdGluZysrOworCisJLyogVGhpcyBpcyBub3QgdGhlIGludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIGVudGVyIGNyaXRpY2FsIGZ1bmN0aW9uIHNvCisJYXNzZXJ0KCkgaWYgaXQgaXMgYmVpbmcgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQuICBPbmx5IEFQSQorCWZ1bmN0aW9ucyB0aGF0IGVuZCBpbiAiRnJvbUlTUiIgY2FuIGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0LiAgT25seSBhc3NlcnQgaWYKKwl0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCBpcyAxIHRvIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpdmUgY2FsbHMgaWYgdGhlCisJYXNzZXJ0IGZ1bmN0aW9uIGFsc28gdXNlcyBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEgKQorCXsKKwkJY29uZmlnQVNTRVJUKCAoIHBvcnROVklDX0lOVF9DVFJMX1JFRyAmIHBvcnRWRUNUQUNUSVZFX01BU0sgKSA9PSAwICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKQoreworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgKTsKKwl1eENyaXRpY2FsTmVzdGluZy0tOworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSB2b2lkIHhQb3J0UGVuZFNWSGFuZGxlciggdm9pZCApCit7CisJZXh0ZXJuIHV4Q3JpdGljYWxOZXN0aW5nOworCWV4dGVybiBweEN1cnJlbnRUQ0I7CisJZXh0ZXJuIHZUYXNrU3dpdGNoQ29udGV4dDsKKworCVBSRVNFUlZFOAorCisJbXJzIHIwLCBwc3AKKwlpc2IKKworCWxkcglyMywgPXB4Q3VycmVudFRDQgkJLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJbGRyCXIyLCBbcjNdCisKKwlzdG1kYiByMCEsIHtyNC1yMTF9CQkJLyogU2F2ZSB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycy4gKi8KKwlzdHIgcjAsIFtyMl0JCQkJLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbnRvIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIFRDQi4gKi8KKworCXN0bWRiIHNwISwge3IzLCByMTR9CisJbW92IHIwLCAjY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZCisJbXNyIGJhc2VwcmksIHIwCisJZHNiCisJaXNiCisJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CisJbW92IHIwLCAjMAorCW1zciBiYXNlcHJpLCByMAorCWxkbWlhIHNwISwge3IzLCByMTR9CisKKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0JCQkJLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwlsZG1pYSByMCEsIHtyNC1yMTF9CQkJLyogUG9wIHRoZSByZWdpc3RlcnMgYW5kIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50LiAqLworCW1zciBwc3AsIHIwCisJaXNiCisJYnggcjE0CisJbm9wCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBUaGUgU3lzVGljayBydW5zIGF0IHRoZSBsb3dlc3QgaW50ZXJydXB0IHByaW9yaXR5LCBzbyB3aGVuIHRoaXMgaW50ZXJydXB0CisJZXhlY3V0ZXMgYWxsIGludGVycnVwdHMgbXVzdCBiZSB1bm1hc2tlZC4gIFRoZXJlIGlzIHRoZXJlZm9yZSBubyBuZWVkIHRvCisJc2F2ZSBhbmQgdGhlbiByZXN0b3JlIHRoZSBpbnRlcnJ1cHQgbWFzayB2YWx1ZSBhcyBpdHMgdmFsdWUgaXMgYWxyZWFkeQorCWtub3duIC0gdGhlcmVmb3JlIHRoZSBzbGlnaHRseSBmYXN0ZXIgdlBvcnRSYWlzZUJBU0VQUkkoKSBmdW5jdGlvbiBpcyB1c2VkCisJaW4gcGxhY2Ugb2YgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpLiAqLworCXZQb3J0UmFpc2VCQVNFUFJJKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBBIGNvbnRleHQgc3dpdGNoIGlzIHJlcXVpcmVkLiAgQ29udGV4dCBzd2l0Y2hpbmcgaXMgcGVyZm9ybWVkIGluCisJCQl0aGUgUGVuZFNWIGludGVycnVwdC4gIFBlbmQgdGhlIFBlbmRTViBpbnRlcnJ1cHQuICovCisJCQlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQl9CisJfQorCXZQb3J0Q2xlYXJCQVNFUFJJRnJvbUlTUigpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisKKwlfX3dlYWsgdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApCisJeworCXVpbnQzMl90IHVsUmVsb2FkVmFsdWUsIHVsQ29tcGxldGVUaWNrUGVyaW9kcywgdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50czsKKwlUaWNrVHlwZV90IHhNb2RpZmlhYmxlSWRsZVRpbWU7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBTeXNUaWNrIHJlbG9hZCB2YWx1ZSBkb2VzIG5vdCBvdmVyZmxvdyB0aGUgY291bnRlci4gKi8KKwkJaWYoIHhFeHBlY3RlZElkbGVUaW1lID4geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyApCisJCXsKKwkJCXhFeHBlY3RlZElkbGVUaW1lID0geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrczsKKwkJfQorCisJCS8qIFN0b3AgdGhlIFN5c1RpY2sgbW9tZW50YXJpbHkuICBUaGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvcgorCQlpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIGJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbAorCQlpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkgZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUKKwkJa2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhciB0aW1lLiAqLworCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHICY9IH5wb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSByZWxvYWQgdmFsdWUgcmVxdWlyZWQgdG8gd2FpdCB4RXhwZWN0ZWRJZGxlVGltZQorCQl0aWNrIHBlcmlvZHMuICAtMSBpcyB1c2VkIGJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgZXhlY3V0ZSBwYXJ0IHdheQorCQl0aHJvdWdoIG9uZSBvZiB0aGUgdGljayBwZXJpb2RzLiAqLworCQl1bFJlbG9hZFZhbHVlID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyArICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKiAoIHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMICkgKTsKKwkJaWYoIHVsUmVsb2FkVmFsdWUgPiB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApCisJCXsKKwkJCXVsUmVsb2FkVmFsdWUgLT0gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb247CisJCX0KKworCQkvKiBFbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYnV0IGRvbid0IHVzZSB0aGUgdGFza0VOVEVSX0NSSVRJQ0FMKCkKKwkJbWV0aG9kIGFzIHRoYXQgd2lsbCBtYXNrIGludGVycnVwdHMgdGhhdCBzaG91bGQgZXhpdCBzbGVlcCBtb2RlLiAqLworCQlfX2Rpc2FibGVfaXJxKCk7CisJCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisKKwkJLyogSWYgYSBjb250ZXh0IHN3aXRjaCBpcyBwZW5kaW5nIG9yIGEgdGFzayBpcyB3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGVyCisJCXRvIGJlIHVuc3VzcGVuZGVkIHRoZW4gYWJhbmRvbiB0aGUgbG93IHBvd2VyIGVudHJ5LiAqLworCQlpZiggZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgPT0gZUFib3J0U2xlZXAgKQorCQl7CisJCQkvKiBSZXN0YXJ0IGZyb20gd2hhdGV2ZXIgaXMgbGVmdCBpbiB0aGUgY291bnQgcmVnaXN0ZXIgdG8gY29tcGxldGUKKwkJCXRoaXMgdGljayBwZXJpb2QuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFJlc2V0IHRoZSByZWxvYWQgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciBub3JtYWwgdGljaworCQkJcGVyaW9kcy4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgLSBzZWUgY29tbWVudHMgYWJvdmUgX19kaXNhYmxlX2lycSgpIGNhbGwKKwkJCWFib3ZlLiAqLworCQkJX19lbmFibGVfaXJxKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTZXQgdGhlIG5ldyByZWxvYWQgdmFsdWUuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxSZWxvYWRWYWx1ZTsKKworCQkJLyogQ2xlYXIgdGhlIFN5c1RpY2sgY291bnQgZmxhZyBhbmQgc2V0IHRoZSBjb3VudCB2YWx1ZSBiYWNrIHRvCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFNsZWVwIHVudGlsIHNvbWV0aGluZyBoYXBwZW5zLiAgY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoKSBjYW4KKwkJCXNldCBpdHMgcGFyYW1ldGVyIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCBpdHMgaW1wbGVtZW50YXRpb24gY29udGFpbnMKKwkJCWl0cyBvd24gd2FpdCBmb3IgaW50ZXJydXB0IG9yIHdhaXQgZm9yIGV2ZW50IGluc3RydWN0aW9uLCBhbmQgc28gd2ZpCisJCQlzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGFnYWluLiAgSG93ZXZlciwgdGhlIG9yaWdpbmFsIGV4cGVjdGVkIGlkbGUKKwkJCXRpbWUgdmFyaWFibGUgbXVzdCByZW1haW4gdW5tb2RpZmllZCwgc28gYSBjb3B5IGlzIHRha2VuLiAqLworCQkJeE1vZGlmaWFibGVJZGxlVGltZSA9IHhFeHBlY3RlZElkbGVUaW1lOworCQkJY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoICZ4TW9kaWZpYWJsZUlkbGVUaW1lICk7CisJCQlpZiggeE1vZGlmaWFibGVJZGxlVGltZSA+IDAgKQorCQkJeworCQkJCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCQkJX193ZmkoKTsKKwkJCQlfX2lzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOworCQkJfQorCQkJY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HKCAmeEV4cGVjdGVkSWRsZVRpbWUgKTsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgdG8gYWxsb3cgdGhlIGludGVycnVwdCB0aGF0IGJyb3VnaHQgdGhlIE1DVQorCQkJb3V0IG9mIHNsZWVwIG1vZGUgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseS4gIHNlZSBjb21tZW50cyBhYm92ZQorCQkJX19kaXNhYmxlX2ludGVycnVwdCgpIGNhbGwgYWJvdmUuICovCisJCQlfX2VuYWJsZV9pcnEoKTsKKwkJCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCQlfX2lzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOworCisJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgYWdhaW4gYmVjYXVzZSB0aGUgY2xvY2sgaXMgYWJvdXQgdG8gYmUgc3RvcHBlZAorCQkJYW5kIGludGVycnVwdHMgdGhhdCBleGVjdXRlIHdoaWxlIHRoZSBjbG9jayBpcyBzdG9wcGVkIHdpbGwgaW5jcmVhc2UKKwkJCWFueSBzbGlwcGFnZSBiZXR3ZWVuIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlIFJUT1MgYW5kIGNhbGVuZGFyCisJCQl0aW1lLiAqLworCQkJX19kaXNhYmxlX2lycSgpOworCQkJX19kc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKwkJCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCQkKKwkJCS8qIERpc2FibGUgdGhlIFN5c1RpY2sgY2xvY2sgd2l0aG91dCByZWFkaW5nIHRoZSAKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgcmVnaXN0ZXIgdG8gZW5zdXJlIHRoZQorCQkJcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVCBpcyBub3QgY2xlYXJlZCBpZiBpdCBpcyBzZXQuICBBZ2FpbiwgCisJCQl0aGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvciBpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIAorCQkJYmUsIGJ1dCB1c2luZyB0aGUgdGlja2xlc3MgbW9kZSB3aWxsIGluZXZpdGFibHkgcmVzdWx0IGluIHNvbWUgdGlueSAKKwkJCWRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlIGtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgCisJCQl0aW1lKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCApOworCisJCQkvKiBEZXRlcm1pbmUgaWYgdGhlIFN5c1RpY2sgY2xvY2sgaGFzIGFscmVhZHkgY291bnRlZCB0byB6ZXJvIGFuZAorCQkJYmVlbiBzZXQgYmFjayB0byB0aGUgY3VycmVudCByZWxvYWQgdmFsdWUgKHRoZSByZWxvYWQgYmFjayBiZWluZworCQkJY29ycmVjdCBmb3IgdGhlIGVudGlyZSBleHBlY3RlZCBpZGxlIHRpbWUpIG9yIGlmIHRoZSBTeXNUaWNrIGlzIHlldAorCQkJdG8gY291bnQgdG8gemVybyAoaW4gd2hpY2ggY2FzZSBhbiBpbnRlcnJ1cHQgb3RoZXIgdGhhbiB0aGUgU3lzVGljaworCQkJbXVzdCBoYXZlIGJyb3VnaHQgdGhlIHN5c3RlbSBvdXQgb2Ygc2xlZXAgbW9kZSkuICovCisJCQlpZiggKCBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHICYgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVCApICE9IDAgKQorCQkJeworCQkJCXVpbnQzMl90IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBpcyBhbHJlYWR5IHBlbmRpbmcsIGFuZCB0aGUgU3lzVGljayBjb3VudAorCQkJCXJlbG9hZGVkIHdpdGggdWxSZWxvYWRWYWx1ZS4gIFJlc2V0IHRoZQorCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgd2l0aCB3aGF0ZXZlciByZW1haW5zIG9mIHRoaXMgdGljaworCQkJCXBlcmlvZC4gKi8KKwkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICkgLSAoIHVsUmVsb2FkVmFsdWUgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHICk7CisKKwkJCQkvKiBEb24ndCBhbGxvdyBhIHRpbnkgdmFsdWUsIG9yIHZhbHVlcyB0aGF0IGhhdmUgc29tZWhvdworCQkJCXVuZGVyZmxvd2VkIGJlY2F1c2UgdGhlIHBvc3Qgc2xlZXAgaG9vayBkaWQgc29tZXRoaW5nCisJCQkJdGhhdCB0b29rIHRvbyBsb25nLiAqLworCQkJCWlmKCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA8IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uICkgfHwgKCB1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApICkKKwkJCQl7CisJCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKTsKKwkJCQl9CisKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogQXMgdGhlIHBlbmRpbmcgdGljayB3aWxsIGJlIHByb2Nlc3NlZCBhcyBzb29uIGFzIHRoaXMKKwkJCQlmdW5jdGlvbiBleGl0cywgdGhlIHRpY2sgdmFsdWUgbWFpbnRhaW5lZCBieSB0aGUgdGljayBpcyBzdGVwcGVkCisJCQkJZm9yd2FyZCBieSBvbmUgbGVzcyB0aGFuIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcuICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0geEV4cGVjdGVkSWRsZVRpbWUgLSAxVUw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogU29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHRpY2sgaW50ZXJydXB0IGVuZGVkIHRoZSBzbGVlcC4KKwkJCQlXb3JrIG91dCBob3cgbG9uZyB0aGUgc2xlZXAgbGFzdGVkIHJvdW5kZWQgdG8gY29tcGxldGUgdGljaworCQkJCXBlcmlvZHMgKG5vdCB0aGUgdWxSZWxvYWQgdmFsdWUgd2hpY2ggYWNjb3VudGVkIGZvciBwYXJ0CisJCQkJdGlja3MpLiAqLworCQkJCXVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgPSAoIHhFeHBlY3RlZElkbGVUaW1lICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUc7CisKKwkJCQkvKiBIb3cgbWFueSBjb21wbGV0ZSB0aWNrIHBlcmlvZHMgcGFzc2VkIHdoaWxlIHRoZSBwcm9jZXNzb3IKKwkJCQl3YXMgd2FpdGluZz8gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzIC8gdWxUaW1lckNvdW50c0Zvck9uZVRpY2s7CisKKwkJCQkvKiBUaGUgcmVsb2FkIHZhbHVlIGlzIHNldCB0byB3aGF0ZXZlciBmcmFjdGlvbiBvZiBhIHNpbmdsZSB0aWNrCisJCQkJcGVyaW9kIHJlbWFpbnMuICovCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKyAxVUwgKSAqIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgLSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzOworCQkJfQorCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2sgc28gaXQgcnVucyBmcm9tIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcKKwkJCWFnYWluLCB0aGVuIHNldCBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHIGJhY2sgdG8gaXRzIHN0YW5kYXJkCisJCQl2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKwkJCXZUYXNrU3RlcFRpY2soIHVsQ29tcGxldGVUaWNrUGVyaW9kcyApOworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBFeGl0IHdpdGggaW50ZXJycHRzIGVuYWJsZWQuICovCisJCQlfX2VuYWJsZV9pcnEoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qICNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNldHVwIHRoZSBTeXNUaWNrIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMgYXQgdGhlIHJlcXVpcmVkCisgKiBmcmVxdWVuY3kuCisgKi8KKyNpZiggY29uZmlnT1ZFUlJJREVfREVGQVVMVF9USUNLX0NPTkZJR1VSQVRJT04gPT0gMCApCisKKwl2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCisJeworCQkvKiBDYWxjdWxhdGUgdGhlIGNvbnN0YW50cyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlIHRpY2sgaW50ZXJydXB0LiAqLworCQkjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCQl7CisJCQl1bFRpbWVyQ291bnRzRm9yT25lVGljayA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApOworCQkJeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IHBvcnRNQVhfMjRfQklUX05VTUJFUiAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCQkJdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKKwkJfQorCQkjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworCQkvKiBTdG9wIGFuZCBjbGVhciB0aGUgU3lzVGljay4gKi8KKwkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9IDBVTDsKKwkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCQkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVCApOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ09WRVJSSURFX0RFRkFVTFRfVElDS19DT05GSUdVUkFUSU9OICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworX19hc20gdWludDMyX3QgdlBvcnRHZXRJUFNSKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKworCW1ycyByMCwgaXBzcgorCWJ4IHIxNAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApCisJeworCXVpbnQzMl90IHVsQ3VycmVudEludGVycnVwdDsKKwl1aW50OF90IHVjQ3VycmVudFByaW9yaXR5OworCisJCS8qIE9idGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGludGVycnVwdC4gKi8KKwkJdWxDdXJyZW50SW50ZXJydXB0ID0gdlBvcnRHZXRJUFNSKCk7CisKKwkJLyogSXMgdGhlIGludGVycnVwdCBudW1iZXIgYSB1c2VyIGRlZmluZWQgaW50ZXJydXB0PyAqLworCQlpZiggdWxDdXJyZW50SW50ZXJydXB0ID49IHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKQorCQl7CisJCQkvKiBMb29rIHVwIHRoZSBpbnRlcnJ1cHQncyBwcmlvcml0eS4gKi8KKwkJCXVjQ3VycmVudFByaW9yaXR5ID0gcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVyc1sgdWxDdXJyZW50SW50ZXJydXB0IF07CisKKwkJCS8qIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZiBhIHNlcnZpY2Ugcm91dGluZSAoSVNSKSBmb3IKKwkJCWFuIGludGVycnVwdCB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYWJvdmUKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBjYWxscyBhbiBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJCWZ1bmN0aW9uLiAgSVNSIHNhZmUgRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBtdXN0ICpvbmx5KiBiZSBjYWxsZWQKKwkJCWZyb20gaW50ZXJydXB0cyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGF0IG9yIGJlbG93CisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCU51bWVyaWNhbGx5IGxvdyBpbnRlcnJ1cHQgcHJpb3JpdHkgbnVtYmVycyByZXByZXNlbnQgbG9naWNhbGx5IGhpZ2gKKwkJCWludGVycnVwdCBwcmlvcml0aWVzLCB0aGVyZWZvcmUgdGhlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQgbXVzdAorCQkJYmUgc2V0IHRvIGEgdmFsdWUgZXF1YWwgdG8gb3IgbnVtZXJpY2FsbHkgKmhpZ2hlciogdGhhbgorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlJbnRlcnJ1cHRzIHRoYXQJdXNlIHRoZSBGcmVlUlRPUyBBUEkgbXVzdCBub3QgYmUgbGVmdCBhdCB0aGVpcgorCQkJZGVmYXVsdCBwcmlvcml0eSBvZgl6ZXJvIGFzIHRoYXQgaXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgcHJpb3JpdHksCisJCQl3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSwKKwkJCWFuZAl0aGVyZWZvcmUgYWxzbyBndWFyYW50ZWVkIHRvIGJlIGludmFsaWQuCisKKwkJCUZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvIGVuc3VyZQorCQkJaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQkJVGhlIGZvbGxvd2luZyBsaW5rcyBwcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uOgorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbAorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvRkFRSGVscC5odG1sICovCisJCQljb25maWdBU1NFUlQoIHVjQ3VycmVudFByaW9yaXR5ID49IHVjTWF4U3lzQ2FsbFByaW9yaXR5ICk7CisJCX0KKworCQkvKiBQcmlvcml0eSBncm91cGluZzogIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykgYWxsb3dzIHRoZSBiaXRzCisJCXRoYXQgZGVmaW5lIGVhY2ggaW50ZXJydXB0J3MgcHJpb3JpdHkgdG8gYmUgc3BsaXQgYmV0d2VlbiBiaXRzIHRoYXQKKwkJZGVmaW5lIHRoZSBpbnRlcnJ1cHQncyBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzIGFuZCBiaXRzIHRoYXQgZGVmaW5lCisJCXRoZSBpbnRlcnJ1cHQncyBzdWItcHJpb3JpdHkuICBGb3Igc2ltcGxpY2l0eSBhbGwgYml0cyBtdXN0IGJlIGRlZmluZWQKKwkJdG8gYmUgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cy4gIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZgorCQl0aGlzIGlzIG5vdCB0aGUgY2FzZSAoaWYgc29tZSBiaXRzIHJlcHJlc2VudCBhIHN1Yi1wcmlvcml0eSkuCisKKwkJSWYgdGhlIGFwcGxpY2F0aW9uIG9ubHkgdXNlcyBDTVNJUyBsaWJyYXJpZXMgZm9yIGludGVycnVwdAorCQljb25maWd1cmF0aW9uIHRoZW4gdGhlIGNvcnJlY3Qgc2V0dGluZyBjYW4gYmUgYWNoaWV2ZWQgb24gYWxsIENvcnRleC1NCisJCWRldmljZXMgYnkgY2FsbGluZyBOVklDX1NldFByaW9yaXR5R3JvdXBpbmcoIDAgKTsgYmVmb3JlIHN0YXJ0aW5nIHRoZQorCQlzY2hlZHVsZXIuICBOb3RlIGhvd2V2ZXIgdGhhdCBzb21lIHZlbmRvciBzcGVjaWZpYyBwZXJpcGhlcmFsIGxpYnJhcmllcworCQlhc3N1bWUgYSBub24temVybyBwcmlvcml0eSBncm91cCBzZXR0aW5nLCBpbiB3aGljaCBjYXNlcyB1c2luZyBhIHZhbHVlCisJCW9mIHplcm8gd2lsbCByZXN1bHQgaW4gdW5wcmVkaWN0YWJsZSBiZWhhdmlvdXIuICovCisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0QUlSQ1JfUkVHICYgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sgKSA8PSB1bE1heFBSSUdST1VQVmFsdWUgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTMvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00zL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmYwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00zL3BvcnRtYWNyby5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorCisvKiBDb25zdGFudHMgdXNlZCB3aXRoIG1lbW9yeSBiYXJyaWVyIGludHJpbnNpY3MuICovCisjZGVmaW5lIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUJCSggMTUgKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2NoZWR1bGVyIHV0aWxpdGllcy4gKi8KKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCS8qIFNldCBhIFBlbmRTViB0byByZXF1ZXN0IGEgY29udGV4dCBzd2l0Y2guICovCQkJCQkJCQlcCisJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQgYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CVwKKwl3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCQkJCQkJXAorCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CQkJCQkJCQkJCQlcCisJX19pc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsJCQkJCQkJCQkJCVwKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUX0JJVAkJKCAxVUwgPDwgMjhVTCApCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkgaWYoIHhTd2l0Y2hSZXF1aXJlZCAhPSBwZEZBTFNFICkgcG9ydFlJRUxEKCkKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuICovCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICk7CisKKyNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCXZQb3J0UmFpc2VCQVNFUFJJKCkKKyNkZWZpbmUgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCkJCQkJCXZQb3J0U2V0QkFTRVBSSSggMCApCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQkJCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCXVsUG9ydFJhaXNlQkFTRVBSSSgpCisjZGVmaW5lIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUih4KQl2UG9ydFNldEJBU0VQUkkoeCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRpY2tsZXNzIGlkbGUvbG93IHBvd2VyIGZ1bmN0aW9uYWxpdHkuICovCisjaWZuZGVmIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAKKwlleHRlcm4gdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApOworCSNkZWZpbmUgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCggeEV4cGVjdGVkSWRsZVRpbWUgKSB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggeEV4cGVjdGVkSWRsZVRpbWUgKQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUG9ydCBzcGVjaWZpYyBvcHRpbWlzYXRpb25zLiAqLworI2lmbmRlZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04KKwkjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAxCisjZW5kaWYKKworI2lmIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiA9PSAxCisKKwkvKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KKwkjaWYoIGNvbmZpZ01BWF9QUklPUklUSUVTID4gMzIgKQorCQkjZXJyb3IgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIGNhbiBvbmx5IGJlIHNldCB0byAxIHdoZW4gY29uZmlnTUFYX1BSSU9SSVRJRVMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLiAgSXQgaXMgdmVyeSByYXJlIHRoYXQgYSBzeXN0ZW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEwIHRvIDE1IGRpZmZlcmVuY2UgcHJpb3JpdGllcyBhcyB0YXNrcyB0aGF0IHNoYXJlIGEgcHJpb3JpdHkgd2lsbCB0aW1lIHNsaWNlLgorCSNlbmRpZgorCisJLyogU3RvcmUvY2xlYXIgdGhlIHJlYWR5IHByaW9yaXRpZXMgaW4gYSBiaXQgbWFwLiAqLworCSNkZWZpbmUgcG9ydFJFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgfD0gKCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCSNkZWZpbmUgcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSAmPSB+KCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkjZGVmaW5lIHBvcnRHRVRfSElHSEVTVF9QUklPUklUWSggdXhUb3BQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSB1eFRvcFByaW9yaXR5ID0gKCAzMVVMIC0gKCB1aW50MzJfdCApIF9fY2x6KCAoIHV4UmVhZHlQcmlvcml0aWVzICkgKSApCisKKyNlbmRpZiAvKiB0YXNrUkVDT1JEX1JFQURZX1BSSU9SSVRZICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGFzayBmdW5jdGlvbiBtYWNyb3MgYXMgZGVzY3JpYmVkIG9uIHRoZSBGcmVlUlRPUy5vcmcgV0VCIHNpdGUuICBUaGVzZSBhcmUKK25vdCBuZWNlc3NhcnkgZm9yIHRvIHVzZSB0aGlzIHBvcnQuICBUaGV5IGFyZSBkZWZpbmVkIHNvIHRoZSBjb21tb24gZGVtbyBmaWxlcworKHdoaWNoIGJ1aWxkIHdpdGggYWxsIHRoZSBwb3J0cykgd2lsbCBidWlsZC4gKi8KKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBjb25maWdBU1NFUlQKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApOworCSNkZWZpbmUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIAl2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoKQorI2VuZGlmCisKKy8qIHBvcnROT1AoKSBpcyBub3QgcmVxdWlyZWQgYnkgdGhpcyBwb3J0LiAqLworI2RlZmluZSBwb3J0Tk9QKCkKKworI2RlZmluZSBwb3J0SU5MSU5FIF9faW5saW5lCisKKyNpZm5kZWYgcG9ydEZPUkNFX0lOTElORQorCSNkZWZpbmUgcG9ydEZPUkNFX0lOTElORSBfX2ZvcmNlaW5saW5lCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIHZvaWQgdlBvcnRTZXRCQVNFUFJJKCB1aW50MzJfdCB1bEJBU0VQUkkgKQoreworCV9fYXNtCisJeworCQkvKiBCYXJyaWVyIGluc3RydWN0aW9ucyBhcmUgbm90IHVzZWQgYXMgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgdG8KKwkJbG93ZXIgdGhlIEJBU0VQUkkgdmFsdWUuICovCisJCW1zciBiYXNlcHJpLCB1bEJBU0VQUkkKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHBvcnRGT1JDRV9JTkxJTkUgdm9pZCB2UG9ydFJhaXNlQkFTRVBSSSggdm9pZCApCit7Cit1aW50MzJfdCB1bE5ld0JBU0VQUkkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFk7CisKKwlfX2FzbQorCXsKKwkJLyogU2V0IEJBU0VQUkkgdG8gdGhlIG1heCBzeXNjYWxsIHByaW9yaXR5IHRvIGVmZmVjdCBhIGNyaXRpY2FsCisJCXNlY3Rpb24uICovCisJCW1zciBiYXNlcHJpLCB1bE5ld0JBU0VQUkkKKwkJZHNiCisJCWlzYgorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSB2b2lkIHZQb3J0Q2xlYXJCQVNFUFJJRnJvbUlTUiggdm9pZCApCit7CisJX19hc20KKwl7CisJCS8qIFNldCBCQVNFUFJJIHRvIDAgc28gbm8gaW50ZXJydXB0cyBhcmUgbWFza2VkLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5CisJCXVzZWQgdG8gbG93ZXIgdGhlIG1hc2sgaW4gYW4gaW50ZXJydXB0LCBzbyBtZW1vcnkgYmFycmllcnMgYXJlIG5vdCAKKwkJdXNlZC4gKi8KKwkJbXNyIGJhc2VwcmksICMwCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIHVpbnQzMl90IHVsUG9ydFJhaXNlQkFTRVBSSSggdm9pZCApCit7Cit1aW50MzJfdCB1bFJldHVybiwgdWxOZXdCQVNFUFJJID0gY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZOworCisJX19hc20KKwl7CisJCS8qIFNldCBCQVNFUFJJIHRvIHRoZSBtYXggc3lzY2FsbCBwcmlvcml0eSB0byBlZmZlY3QgYSBjcml0aWNhbAorCQlzZWN0aW9uLiAqLworCQltcnMgdWxSZXR1cm4sIGJhc2VwcmkKKwkJbXNyIGJhc2VwcmksIHVsTmV3QkFTRVBSSQorCQlkc2IKKwkJaXNiCisJfQorCisJcmV0dXJuIHVsUmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIEJhc2VUeXBlX3QgeFBvcnRJc0luc2lkZUludGVycnVwdCggdm9pZCApCit7Cit1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CitCYXNlVHlwZV90IHhSZXR1cm47CisKKwkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJX19hc20KKwl7CisJCW1ycyB1bEN1cnJlbnRJbnRlcnJ1cHQsIGlwc3IKKwl9CisKKwlpZiggdWxDdXJyZW50SW50ZXJydXB0ID09IDAgKQorCXsKKwkJeFJldHVybiA9IHBkRkFMU0U7CisJfQorCWVsc2UKKwl7CisJCXhSZXR1cm4gPSBwZFRSVUU7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRGL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRGL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkyODI2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNEYvcG9ydC5jCkBAIC0wLDAgKzEsNzg4IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gcG9ydGFibGUuaCBmb3IgdGhlIEFSTSBDTTRGIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyNpZm5kZWYgX19UQVJHRVRfRlBVX1ZGUAorCSNlcnJvciBUaGlzIHBvcnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgdG8gZW5hYmxlIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQuCisjZW5kaWYKKworI2lmIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSA9PSAwCisJI2Vycm9yIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBtdXN0IG5vdCBiZSBzZXQgdG8gMC4gIFNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdTWVNUSUNLX0NMT0NLX0haCisJI2RlZmluZSBjb25maWdTWVNUSUNLX0NMT0NLX0haIGNvbmZpZ0NQVV9DTE9DS19IWgorCS8qIEVuc3VyZSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGF0IHRoZSBzYW1lIGZyZXF1ZW5jeSBhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDFVTCA8PCAyVUwgKQorI2Vsc2UKKwkvKiBUaGUgd2F5IHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgaXMgbm90IG1vZGlmaWVkIGluIGNhc2UgaXQgaXMgbm90IHRoZSBzYW1lCisJYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQJKCAwICkKKyNlbmRpZgorCisvKiBUaGUgX193ZWFrIGF0dHJpYnV0ZSBkb2VzIG5vdCB3b3JrIGFzIHlvdSBtaWdodCBleHBlY3Qgd2l0aCB0aGUgS2VpbCB0b29scworc28gdGhlIGNvbmZpZ09WRVJSSURFX0RFRkFVTFRfVElDS19DT05GSUdVUkFUSU9OIGNvbnN0YW50IG11c3QgYmUgc2V0IHRvIDEgaWYKK3RoZSBhcHBsaWNhdGlvbiB3cml0ZXIgd2FudHMgdG8gcHJvdmlkZSB0aGVpciBvd24gaW1wbGVtZW50YXRpb24gb2YKK3ZQb3J0U2V0dXBUaW1lckludGVycnVwdCgpLiAgRW5zdXJlIGNvbmZpZ09WRVJSSURFX0RFRkFVTFRfVElDS19DT05GSUdVUkFUSU9OCitpcyBkZWZpbmVkLiAqLworI2lmbmRlZiBjb25maWdPVkVSUklERV9ERUZBVUxUX1RJQ0tfQ09ORklHVVJBVElPTgorCSNkZWZpbmUgY29uZmlnT1ZFUlJJREVfREVGQVVMVF9USUNLX0NPTkZJR1VSQVRJT04gMAorI2VuZGlmCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBjb3JlLiAgUmVnaXN0ZXJzIGZpcnN0Li4uICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRwkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkgKQorLyogLi4udGhlbiBiaXRzIGluIHRoZSByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVAkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVAkJCSggMVVMIDw8IDBVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQJCSggMVVMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZDTEVBUl9CSVQgCQkJKCAxVUwgPDwgMjdVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRfU1lTVElDS19DTEVBUl9CSVQJCSggMVVMIDw8IDI1VUwgKQorCisvKiBDb25zdGFudHMgdXNlZCB0byBkZXRlY3QgYSBDb3J0ZXgtTTcgcjBwMSBjb3JlLCB3aGljaCBzaG91bGQgdXNlIHRoZSBBUk1fQ003CityMHAxIHBvcnQuICovCisjZGVmaW5lIHBvcnRDUFVJRAkJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBlZDAwICkgKQorI2RlZmluZSBwb3J0Q09SVEVYX003X3IwcDFfSUQJCQkJKCAweDQxMEZDMjcxVUwgKQorI2RlZmluZSBwb3J0Q09SVEVYX003X3IwcDBfSUQJCQkJKCAweDQxMEZDMjcwVUwgKQorCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVl9QUkkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAyNFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBhbiBpbnRlcnJ1cHQgcHJpb3JpdHkuICovCisjZGVmaW5lIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIJCSggMTYgKQorI2RlZmluZSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2IAkoIDB4RTAwMEUzRjAgKQorI2RlZmluZSBwb3J0QUlSQ1JfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhFMDAwRUQwQyApICkKKyNkZWZpbmUgcG9ydE1BWF84X0JJVF9WQUxVRQkJCQkJKCAoIHVpbnQ4X3QgKSAweGZmICkKKyNkZWZpbmUgcG9ydFRPUF9CSVRfT0ZfQllURQkJCQkJKCAoIHVpbnQ4X3QgKSAweDgwICkKKyNkZWZpbmUgcG9ydE1BWF9QUklHUk9VUF9CSVRTCQkJCSggKCB1aW50OF90ICkgNyApCisjZGVmaW5lIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLCQkJCSggMHgwN1VMIDw8IDhVTCApCisjZGVmaW5lIHBvcnRQUklHUk9VUF9TSElGVAkJCQkJKCA4VUwgKQorCisvKiBNYXNrcyBvZmYgYWxsIGJpdHMgYnV0IHRoZSBWRUNUQUNUSVZFIGJpdHMgaW4gdGhlIElDU1IgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRWRUNUQUNUSVZFX01BU0sJCQkJCSggMHhGRlVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIFZGUC4gKi8KKyNkZWZpbmUgcG9ydEZQQ0NSCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVmMzQgKSAvKiBGbG9hdGluZyBwb2ludCBjb250ZXh0IGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUwkoIDB4M1VMIDw8IDMwVUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJKCAweDAxMDAwMDAwICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJKCAweGZmZmZmZmZkICkKKworLyogVGhlIHN5c3RpY2sgaXMgYSAyNC1iaXQgY291bnRlci4gKi8KKyNkZWZpbmUgcG9ydE1BWF8yNF9CSVRfTlVNQkVSCQkoIDB4ZmZmZmZmVUwgKQorCisvKiBBIGZpZGRsZSBmYWN0b3IgdG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBTeXNUaWNrIGNvdW50cyB0aGF0IHdvdWxkIGhhdmUKK29jY3VycmVkIHdoaWxlIHRoZSBTeXNUaWNrIGNvdW50ZXIgaXMgc3RvcHBlZCBkdXJpbmcgdGlja2xlc3MgaWRsZQorY2FsY3VsYXRpb25zLiAqLworI2RlZmluZSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IJKCA0NVVMICkKKworLyogRm9yIHN0cmljdCBjb21wbGlhbmNlIHdpdGggdGhlIENvcnRleC1NIHNwZWMgdGhlIHRhc2sgc3RhcnQgYWRkcmVzcyBzaG91bGQKK2hhdmUgYml0LTAgY2xlYXIsIGFzIGl0IGlzIGxvYWRlZCBpbnRvIHRoZSBQQyBvbiBleGl0IGZyb20gYW4gSVNSLiAqLworI2RlZmluZSBwb3J0U1RBUlRfQUREUkVTU19NQVNLCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKgorICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuICBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcworICogZmlsZSBpcyB3ZWFrIHRvIGFsbG93IGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gY2hhbmdlIHRoZSB0aW1lciB1c2VkIHRvCisgKiBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CisKKy8qCisgKiBFeGNlcHRpb24gaGFuZGxlcnMuCisgKi8KK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICk7Cit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKTsKK3ZvaWQgdlBvcnRTVkNIYW5kbGVyKCB2b2lkICk7CisKKy8qCisgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlN0YXJ0Rmlyc3RUYXNrKCB2b2lkICk7CisKKy8qCisgKiBGdW5jdGlvbnMgZGVmaW5lZCBpbiBwb3J0YXNtLnMgdG8gZW5hYmxlIHRoZSBWRlAuCisgKi8KK3N0YXRpYyB2b2lkIHBydkVuYWJsZVZGUCggdm9pZCApOworCisvKgorICogVXNlZCB0byBjYXRjaCB0YXNrcyB0aGF0IGF0dGVtcHQgdG8gcmV0dXJuIGZyb20gdGhlaXIgaW1wbGVtZW50aW5nIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZwordmFyaWFibGUuICovCitzdGF0aWMgVUJhc2VUeXBlX3QgdXhDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhOworCisvKgorICogVGhlIG51bWJlciBvZiBTeXNUaWNrIGluY3JlbWVudHMgdGhhdCBtYWtlIHVwIG9uZSB0aWNrIHBlcmlvZC4KKyAqLworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwlzdGF0aWMgdWludDMyX3QgdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGljayBwZXJpb2RzIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgaXMgbGltaXRlZCBieSB0aGUKKyAqIDI0IGJpdCByZXNvbHV0aW9uIG9mIHRoZSBTeXNUaWNrIHRpbWVyLgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogQ29tcGVuc2F0ZSBmb3IgdGhlIENQVSBjeWNsZXMgdGhhdCBwYXNzIHdoaWxlIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgKGxvdworICogcG93ZXIgZnVuY3Rpb25hbGl0eSBvbmx5LgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFVzZWQgYnkgdGhlIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSBtYWNybyB0byBlbnN1cmUKKyAqIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgYXJlIG5vdCBjYWxsZWQgZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkCisgKiBhIHByaW9yaXR5IGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKyAqLworI2lmICggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJIHN0YXRpYyB1aW50OF90IHVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gMDsKKwkgc3RhdGljIHVpbnQzMl90IHVsTWF4UFJJR1JPVVBWYWx1ZSA9IDA7CisJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggdWludDhfdCAqICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK1N0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkKK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJaW50ZXJydXB0LiAqLworCisJLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0CisJb2YgaW50ZXJydXB0cywgYW5kIHRvIGVuc3VyZSBhbGlnbm1lbnQuICovCisJcHhUb3BPZlN0YWNrLS07CisKKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJLyogeFBTUiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoICggU3RhY2tUeXBlX3QgKSBweENvZGUgKSAmIHBvcnRTVEFSVF9BRERSRVNTX01BU0s7CS8qIFBDICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwcnZUYXNrRXhpdEVycm9yOwkvKiBMUiAqLworCisJLyogU2F2ZSBjb2RlIHNwYWNlIGJ5IHNraXBwaW5nIHJlZ2lzdGVyIGluaXRpYWxpc2F0aW9uLiAqLworCXB4VG9wT2ZTdGFjayAtPSA1OwkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CS8qIFIwICovCisKKwkvKiBBIHNhdmUgbWV0aG9kIGlzIGJlaW5nIHVzZWQgdGhhdCByZXF1aXJlcyBlYWNoIHRhc2sgdG8gbWFpbnRhaW4gaXRzCisJb3duIGV4ZWMgcmV0dXJuIHZhbHVlLiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCisJcHhUb3BPZlN0YWNrIC09IDg7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCWl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uICBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCXNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4KKworCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQoKSB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMKKwlkZWZpbmVkLCB0aGVuIHN0b3AgaGVyZSBzbyBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCWZvciggOzsgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSB2b2lkIHZQb3J0U1ZDSGFuZGxlciggdm9pZCApCit7CisJUFJFU0VSVkU4CisKKwkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IKKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0KKwkvKiBQb3AgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIwISwge3I0LXIxMSwgcjE0fQorCW1zciBwc3AsIHIwCisJaXNiCisJbW92IHIwLCAjMAorCW1zcgliYXNlcHJpLCByMAorCWJ4IHIxNAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgcHJ2U3RhcnRGaXJzdFRhc2soIHZvaWQgKQoreworCVBSRVNFUlZFOAorCisJLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCWxkciByMCwgPTB4RTAwMEVEMDgKKwlsZHIgcjAsIFtyMF0KKwlsZHIgcjAsIFtyMF0KKwkvKiBTZXQgdGhlIG1zcCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJbXNyIG1zcCwgcjAKKwkvKiBDbGVhciB0aGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoZSBGUFUgaXMgaW4gdXNlIGluIGNhc2UgdGhlIEZQVSB3YXMgdXNlZAorCWJlZm9yZSB0aGUgc2NoZWR1bGVyIHdhcyBzdGFydGVkIC0gd2hpY2ggd291bGQgb3RoZXJ3aXNlIHJlc3VsdCBpbiB0aGUKKwl1bm5lY2Vzc2FyeSBsZWF2aW5nIG9mIHNwYWNlIGluIHRoZSBTVkMgc3RhY2sgZm9yIGxhenkgc2F2aW5nIG9mIEZQVQorCXJlZ2lzdGVycy4gKi8KKwltb3YgcjAsICMwCisJbXNyIGNvbnRyb2wsIHIwCisJLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJY3BzaWUgaQorCWNwc2llIGYKKwlkc2IKKwlpc2IKKwkvKiBDYWxsIFNWQyB0byBzdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwlzdmMgMAorCW5vcAorCW5vcAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgcHJ2RW5hYmxlVkZQKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKworCS8qIFRoZSBGUFUgZW5hYmxlIGJpdHMgYXJlIGluIHRoZSBDUEFDUi4gKi8KKwlsZHIudyByMCwgPTB4RTAwMEVEODgKKwlsZHIJcjEsIFtyMF0KKworCS8qIEVuYWJsZSBDUDEwIGFuZCBDUDExIGNvcHJvY2Vzc29ycywgdGhlbiBzYXZlIGJhY2suICovCisJb3JyCXIxLCByMSwgIyggMHhmIDw8IDIwICkKKwlzdHIgcjEsIFtyMF0KKwlieAlyMTQKKwlub3AKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgbXVzdCBub3QgYmUgc2V0IHRvIDAuCisJU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwljb25maWdBU1NFUlQoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOworCisJLyogVGhpcyBwb3J0IGNhbiBiZSB1c2VkIG9uIGFsbCByZXZpc2lvbnMgb2YgdGhlIENvcnRleC1NNyBjb3JlIG90aGVyIHRoYW4KKwl0aGUgcjBwMSBwYXJ0cy4gIHIwcDEgcGFydHMgc2hvdWxkIHVzZSB0aGUgcG9ydCBmcm9tIHRoZQorCS9zb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTcvcjBwMSBkaXJlY3RvcnkuICovCisJY29uZmlnQVNTRVJUKCBwb3J0Q1BVSUQgIT0gcG9ydENPUlRFWF9NN19yMHAxX0lEICk7CisJY29uZmlnQVNTRVJUKCBwb3J0Q1BVSUQgIT0gcG9ydENPUlRFWF9NN19yMHAwX0lEICk7CisKKwkjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCXsKKwkJdm9sYXRpbGUgdWludDMyX3QgdWxPcmlnaW5hbFByaW9yaXR5OworCQl2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9ICggdWludDhfdCAqICkgKCBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2ICsgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApOworCQl2b2xhdGlsZSB1aW50OF90IHVjTWF4UHJpb3JpdHlWYWx1ZTsKKworCQkvKiBEZXRlcm1pbmUgdGhlIG1heGltdW0gcHJpb3JpdHkgZnJvbSB3aGljaCBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQuICBJU1Igc2FmZSBmdW5jdGlvbnMgYXJlIHRob3NlIHRoYXQgZW5kIGluCisJCSJGcm9tSVNSIi4gIEZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvCisJCWVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCVNhdmUgdGhlIGludGVycnVwdCBwcmlvcml0eSB2YWx1ZSB0aGF0IGlzIGFib3V0IHRvIGJlIGNsb2JiZXJlZC4gKi8KKwkJdWxPcmlnaW5hbFByaW9yaXR5ID0gKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXI7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhdmFpbGFibGUuICBGaXJzdCB3cml0ZSB0byBhbGwKKwkJcG9zc2libGUgYml0cy4gKi8KKwkJKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSBwb3J0TUFYXzhfQklUX1ZBTFVFOworCisJCS8qIFJlYWQgdGhlIHZhbHVlIGJhY2sgdG8gc2VlIGhvdyBtYW55IGJpdHMgc3R1Y2suICovCisJCXVjTWF4UHJpb3JpdHlWYWx1ZSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIFRoZSBrZXJuZWwgaW50ZXJydXB0IHByaW9yaXR5IHNob3VsZCBiZSBzZXQgdG8gdGhlIGxvd2VzdAorCQlwcmlvcml0eS4gKi8KKwkJY29uZmlnQVNTRVJUKCB1Y01heFByaW9yaXR5VmFsdWUgPT0gKCBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICYgdWNNYXhQcmlvcml0eVZhbHVlICkgKTsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCSNpZmRlZiBfX05WSUNfUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBDTVNJUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IF9fTlZJQ19QUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkjaWZkZWYgY29uZmlnUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBGcmVlUlRPUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IGNvbmZpZ1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIEVuc3VyZSB0aGUgVkZQIGlzIGVuYWJsZWQgLSBpdCBzaG91bGQgYmUgYW55d2F5LiAqLworCXBydkVuYWJsZVZGUCgpOworCisJLyogTGF6eSBzYXZlIGFsd2F5cy4gKi8KKwkqKCBwb3J0RlBDQ1IgKSB8PSBwb3J0QVNQRU5fQU5EX0xTUEVOX0JJVFM7CisKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwlwcnZTdGFydEZpcnN0VGFzaygpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSEgKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkKK3sKKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJdXhDcml0aWNhbE5lc3RpbmcrKzsKKworCS8qIFRoaXMgaXMgbm90IHRoZSBpbnRlcnJ1cHQgc2FmZSB2ZXJzaW9uIG9mIHRoZSBlbnRlciBjcml0aWNhbCBmdW5jdGlvbiBzbworCWFzc2VydCgpIGlmIGl0IGlzIGJlaW5nIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LiAgT25seSBBUEkKKwlmdW5jdGlvbnMgdGhhdCBlbmQgaW4gIkZyb21JU1IiIGNhbiBiZSB1c2VkIGluIGFuIGludGVycnVwdC4gIE9ubHkgYXNzZXJ0IGlmCisJdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgaXMgMSB0byBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaXZlIGNhbGxzIGlmIHRoZQorCWFzc2VydCBmdW5jdGlvbiBhbHNvIHVzZXMgYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxICkKKwl7CisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgJiBwb3J0VkVDVEFDVElWRV9NQVNLICkgPT0gMCApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkKK3sKKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nICk7CisJdXhDcml0aWNhbE5lc3RpbmctLTsKKwlpZiggdXhDcml0aWNhbE5lc3RpbmcgPT0gMCApCisJeworCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworX19hc20gdm9pZCB4UG9ydFBlbmRTVkhhbmRsZXIoIHZvaWQgKQoreworCWV4dGVybiB1eENyaXRpY2FsTmVzdGluZzsKKwlleHRlcm4gcHhDdXJyZW50VENCOworCWV4dGVybiB2VGFza1N3aXRjaENvbnRleHQ7CisKKwlQUkVTRVJWRTgKKworCW1ycyByMCwgcHNwCisJaXNiCisJLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJbGRyCXIzLCA9cHhDdXJyZW50VENCCisJbGRyCXIyLCBbcjNdCisKKwkvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcHVzaCBoaWdoIHZmcCByZWdpc3RlcnMuICovCisJdHN0IHIxNCwgIzB4MTAKKwlpdCBlcQorCXZzdG1kYmVxIHIwISwge3MxNi1zMzF9CisKKwkvKiBTYXZlIHRoZSBjb3JlIHJlZ2lzdGVycy4gKi8KKwlzdG1kYiByMCEsIHtyNC1yMTEsIHIxNH0KKworCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW50byB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBUQ0IuICovCisJc3RyIHIwLCBbcjJdCisKKwlzdG1kYiBzcCEsIHtyMCwgcjN9CisJbW92IHIwLCAjY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZCisJbXNyIGJhc2VwcmksIHIwCisJZHNiCisJaXNiCisJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CisJbW92IHIwLCAjMAorCW1zciBiYXNlcHJpLCByMAorCWxkbWlhIHNwISwge3IwLCByM30KKworCS8qIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJbGRyIHIxLCBbcjNdCisJbGRyIHIwLCBbcjFdCisKKwkvKiBQb3AgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIwISwge3I0LXIxMSwgcjE0fQorCisJLyogSXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHBvcCB0aGUgaGlnaCB2ZnAgcmVnaXN0ZXJzCisJdG9vLiAqLworCXRzdCByMTQsICMweDEwCisJaXQgZXEKKwl2bGRtaWFlcSByMCEsIHtzMTYtczMxfQorCisJbXNyIHBzcCwgcjAKKwlpc2IKKwkjaWZkZWYgV09SS0FST1VORF9QTVVfQ00wMDEgLyogWE1DNDAwMCBzcGVjaWZpYyBlcnJhdGEgKi8KKwkJI2lmIFdPUktBUk9VTkRfUE1VX0NNMDAxID09IDEKKwkJCXB1c2ggeyByMTQgfQorCQkJcG9wIHsgcGMgfQorCQkJbm9wCisJCSNlbmRpZgorCSNlbmRpZgorCisJYnggcjE0Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICkKK3sKKwkvKiBUaGUgU3lzVGljayBydW5zIGF0IHRoZSBsb3dlc3QgaW50ZXJydXB0IHByaW9yaXR5LCBzbyB3aGVuIHRoaXMgaW50ZXJydXB0CisJZXhlY3V0ZXMgYWxsIGludGVycnVwdHMgbXVzdCBiZSB1bm1hc2tlZC4gIFRoZXJlIGlzIHRoZXJlZm9yZSBubyBuZWVkIHRvCisJc2F2ZSBhbmQgdGhlbiByZXN0b3JlIHRoZSBpbnRlcnJ1cHQgbWFzayB2YWx1ZSBhcyBpdHMgdmFsdWUgaXMgYWxyZWFkeQorCWtub3duIC0gdGhlcmVmb3JlIHRoZSBzbGlnaHRseSBmYXN0ZXIgdlBvcnRSYWlzZUJBU0VQUkkoKSBmdW5jdGlvbiBpcyB1c2VkCisJaW4gcGxhY2Ugb2YgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpLiAqLworCXZQb3J0UmFpc2VCQVNFUFJJKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBBIGNvbnRleHQgc3dpdGNoIGlzIHJlcXVpcmVkLiAgQ29udGV4dCBzd2l0Y2hpbmcgaXMgcGVyZm9ybWVkIGluCisJCQl0aGUgUGVuZFNWIGludGVycnVwdC4gIFBlbmQgdGhlIFBlbmRTViBpbnRlcnJ1cHQuICovCisJCQlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQl9CisJfQorCXZQb3J0Q2xlYXJCQVNFUFJJRnJvbUlTUigpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisKKwlfX3dlYWsgdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApCisJeworCXVpbnQzMl90IHVsUmVsb2FkVmFsdWUsIHVsQ29tcGxldGVUaWNrUGVyaW9kcywgdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50czsKKwlUaWNrVHlwZV90IHhNb2RpZmlhYmxlSWRsZVRpbWU7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBTeXNUaWNrIHJlbG9hZCB2YWx1ZSBkb2VzIG5vdCBvdmVyZmxvdyB0aGUgY291bnRlci4gKi8KKwkJaWYoIHhFeHBlY3RlZElkbGVUaW1lID4geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyApCisJCXsKKwkJCXhFeHBlY3RlZElkbGVUaW1lID0geE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrczsKKwkJfQorCisJCS8qIFN0b3AgdGhlIFN5c1RpY2sgbW9tZW50YXJpbHkuICBUaGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvcgorCQlpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIGJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbAorCQlpbmV2aXRhYmx5IHJlc3VsdCBpbiBzb21lIHRpbnkgZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUKKwkJa2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhciB0aW1lLiAqLworCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHICY9IH5wb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSByZWxvYWQgdmFsdWUgcmVxdWlyZWQgdG8gd2FpdCB4RXhwZWN0ZWRJZGxlVGltZQorCQl0aWNrIHBlcmlvZHMuICAtMSBpcyB1c2VkIGJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgZXhlY3V0ZSBwYXJ0IHdheQorCQl0aHJvdWdoIG9uZSBvZiB0aGUgdGljayBwZXJpb2RzLiAqLworCQl1bFJlbG9hZFZhbHVlID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyArICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKiAoIHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMICkgKTsKKwkJaWYoIHVsUmVsb2FkVmFsdWUgPiB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApCisJCXsKKwkJCXVsUmVsb2FkVmFsdWUgLT0gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb247CisJCX0KKworCQkvKiBFbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYnV0IGRvbid0IHVzZSB0aGUgdGFza0VOVEVSX0NSSVRJQ0FMKCkKKwkJbWV0aG9kIGFzIHRoYXQgd2lsbCBtYXNrIGludGVycnVwdHMgdGhhdCBzaG91bGQgZXhpdCBzbGVlcCBtb2RlLiAqLworCQlfX2Rpc2FibGVfaXJxKCk7CisJCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisKKwkJLyogSWYgYSBjb250ZXh0IHN3aXRjaCBpcyBwZW5kaW5nIG9yIGEgdGFzayBpcyB3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGVyCisJCXRvIGJlIHVuc3VzcGVuZGVkIHRoZW4gYWJhbmRvbiB0aGUgbG93IHBvd2VyIGVudHJ5LiAqLworCQlpZiggZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgPT0gZUFib3J0U2xlZXAgKQorCQl7CisJCQkvKiBSZXN0YXJ0IGZyb20gd2hhdGV2ZXIgaXMgbGVmdCBpbiB0aGUgY291bnQgcmVnaXN0ZXIgdG8gY29tcGxldGUKKwkJCXRoaXMgdGljayBwZXJpb2QuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFJlc2V0IHRoZSByZWxvYWQgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciBub3JtYWwgdGljaworCQkJcGVyaW9kcy4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgLSBzZWUgY29tbWVudHMgYWJvdmUgX19kaXNhYmxlX2lycSgpIGNhbGwKKwkJCWFib3ZlLiAqLworCQkJX19lbmFibGVfaXJxKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTZXQgdGhlIG5ldyByZWxvYWQgdmFsdWUuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxSZWxvYWRWYWx1ZTsKKworCQkJLyogQ2xlYXIgdGhlIFN5c1RpY2sgY291bnQgZmxhZyBhbmQgc2V0IHRoZSBjb3VudCB2YWx1ZSBiYWNrIHRvCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisKKwkJCS8qIFNsZWVwIHVudGlsIHNvbWV0aGluZyBoYXBwZW5zLiAgY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoKSBjYW4KKwkJCXNldCBpdHMgcGFyYW1ldGVyIHRvIDAgdG8gaW5kaWNhdGUgdGhhdCBpdHMgaW1wbGVtZW50YXRpb24gY29udGFpbnMKKwkJCWl0cyBvd24gd2FpdCBmb3IgaW50ZXJydXB0IG9yIHdhaXQgZm9yIGV2ZW50IGluc3RydWN0aW9uLCBhbmQgc28gd2ZpCisJCQlzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGFnYWluLiAgSG93ZXZlciwgdGhlIG9yaWdpbmFsIGV4cGVjdGVkIGlkbGUKKwkJCXRpbWUgdmFyaWFibGUgbXVzdCByZW1haW4gdW5tb2RpZmllZCwgc28gYSBjb3B5IGlzIHRha2VuLiAqLworCQkJeE1vZGlmaWFibGVJZGxlVGltZSA9IHhFeHBlY3RlZElkbGVUaW1lOworCQkJY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcoICZ4TW9kaWZpYWJsZUlkbGVUaW1lICk7CisJCQlpZiggeE1vZGlmaWFibGVJZGxlVGltZSA+IDAgKQorCQkJeworCQkJCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCQkJX193ZmkoKTsKKwkJCQlfX2lzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOworCQkJfQorCQkJY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HKCAmeEV4cGVjdGVkSWRsZVRpbWUgKTsKKworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgdG8gYWxsb3cgdGhlIGludGVycnVwdCB0aGF0IGJyb3VnaHQgdGhlIE1DVQorCQkJb3V0IG9mIHNsZWVwIG1vZGUgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseS4gIHNlZSBjb21tZW50cyBhYm92ZQorCQkJX19kaXNhYmxlX2ludGVycnVwdCgpIGNhbGwgYWJvdmUuICovCisJCQlfX2VuYWJsZV9pcnEoKTsKKwkJCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCQlfX2lzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOworCisJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgYWdhaW4gYmVjYXVzZSB0aGUgY2xvY2sgaXMgYWJvdXQgdG8gYmUgc3RvcHBlZAorCQkJYW5kIGludGVycnVwdHMgdGhhdCBleGVjdXRlIHdoaWxlIHRoZSBjbG9jayBpcyBzdG9wcGVkIHdpbGwgaW5jcmVhc2UKKwkJCWFueSBzbGlwcGFnZSBiZXR3ZWVuIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlIFJUT1MgYW5kIGNhbGVuZGFyCisJCQl0aW1lLiAqLworCQkJX19kaXNhYmxlX2lycSgpOworCQkJX19kc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKwkJCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisKKwkJCS8qIERpc2FibGUgdGhlIFN5c1RpY2sgY2xvY2sgd2l0aG91dCByZWFkaW5nIHRoZQorCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyByZWdpc3RlciB0byBlbnN1cmUgdGhlCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUdfQklUIGlzIG5vdCBjbGVhcmVkIGlmIGl0IGlzIHNldC4gIEFnYWluLAorCQkJdGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IgaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbgorCQkJYmUsIGJ1dCB1c2luZyB0aGUgdGlja2xlc3MgbW9kZSB3aWxsIGluZXZpdGFibHkgcmVzdWx0IGluIHNvbWUgdGlueQorCQkJZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUga2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhcgorCQkJdGltZSovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gKCBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVF9CSVQgKTsKKworCQkJLyogRGV0ZXJtaW5lIGlmIHRoZSBTeXNUaWNrIGNsb2NrIGhhcyBhbHJlYWR5IGNvdW50ZWQgdG8gemVybyBhbmQKKwkJCWJlZW4gc2V0IGJhY2sgdG8gdGhlIGN1cnJlbnQgcmVsb2FkIHZhbHVlICh0aGUgcmVsb2FkIGJhY2sgYmVpbmcKKwkJCWNvcnJlY3QgZm9yIHRoZSBlbnRpcmUgZXhwZWN0ZWQgaWRsZSB0aW1lKSBvciBpZiB0aGUgU3lzVGljayBpcyB5ZXQKKwkJCXRvIGNvdW50IHRvIHplcm8gKGluIHdoaWNoIGNhc2UgYW4gaW50ZXJydXB0IG90aGVyIHRoYW4gdGhlIFN5c1RpY2sKKwkJCW11c3QgaGF2ZSBicm91Z2h0IHRoZSBzeXN0ZW0gb3V0IG9mIHNsZWVwIG1vZGUpLiAqLworCQkJaWYoICggcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyAmIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQgKSAhPSAwICkKKwkJCXsKKwkJCQl1aW50MzJfdCB1bENhbGN1bGF0ZWRMb2FkVmFsdWU7CisKKwkJCQkvKiBUaGUgdGljayBpbnRlcnJ1cHQgaXMgYWxyZWFkeSBwZW5kaW5nLCBhbmQgdGhlIFN5c1RpY2sgY291bnQKKwkJCQlyZWxvYWRlZCB3aXRoIHVsUmVsb2FkVmFsdWUuICBSZXNldCB0aGUKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHIHdpdGggd2hhdGV2ZXIgcmVtYWlucyBvZiB0aGlzIHRpY2sKKwkJCQlwZXJpb2QuICovCisJCQkJdWxDYWxjdWxhdGVkTG9hZFZhbHVlID0gKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTCApIC0gKCB1bFJlbG9hZFZhbHVlIC0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyApOworCisJCQkJLyogRG9uJ3QgYWxsb3cgYSB0aW55IHZhbHVlLCBvciB2YWx1ZXMgdGhhdCBoYXZlIHNvbWVob3cKKwkJCQl1bmRlcmZsb3dlZCBiZWNhdXNlIHRoZSBwb3N0IHNsZWVwIGhvb2sgZGlkIHNvbWV0aGluZworCQkJCXRoYXQgdG9vayB0b28gbG9uZy4gKi8KKwkJCQlpZiggKCB1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPCB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApIHx8ICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlID4gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSApCisJCQkJeworCQkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICk7CisJCQkJfQorCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIEFzIHRoZSBwZW5kaW5nIHRpY2sgd2lsbCBiZSBwcm9jZXNzZWQgYXMgc29vbiBhcyB0aGlzCisJCQkJZnVuY3Rpb24gZXhpdHMsIHRoZSB0aWNrIHZhbHVlIG1haW50YWluZWQgYnkgdGhlIHRpY2sgaXMgc3RlcHBlZAorCQkJCWZvcndhcmQgYnkgb25lIGxlc3MgdGhhbiB0aGUgdGltZSBzcGVudCB3YWl0aW5nLiAqLworCQkJCXVsQ29tcGxldGVUaWNrUGVyaW9kcyA9IHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIFNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSB0aWNrIGludGVycnVwdCBlbmRlZCB0aGUgc2xlZXAuCisJCQkJV29yayBvdXQgaG93IGxvbmcgdGhlIHNsZWVwIGxhc3RlZCByb3VuZGVkIHRvIGNvbXBsZXRlIHRpY2sKKwkJCQlwZXJpb2RzIChub3QgdGhlIHVsUmVsb2FkIHZhbHVlIHdoaWNoIGFjY291bnRlZCBmb3IgcGFydAorCQkJCXRpY2tzKS4gKi8KKwkJCQl1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzID0gKCB4RXhwZWN0ZWRJZGxlVGltZSAqIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHOworCisJCQkJLyogSG93IG1hbnkgY29tcGxldGUgdGljayBwZXJpb2RzIHBhc3NlZCB3aGlsZSB0aGUgcHJvY2Vzc29yCisJCQkJd2FzIHdhaXRpbmc/ICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0gdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cyAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCisJCQkJLyogVGhlIHJlbG9hZCB2YWx1ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgZnJhY3Rpb24gb2YgYSBzaW5nbGUgdGljaworCQkJCXBlcmlvZCByZW1haW5zLiAqLworCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSAoICggdWxDb21wbGV0ZVRpY2tQZXJpb2RzICsgMVVMICkgKiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApIC0gdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50czsKKwkJCX0KKworCQkJLyogUmVzdGFydCBTeXNUaWNrIHNvIGl0IHJ1bnMgZnJvbSBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHCisJCQlhZ2FpbiwgdGhlbiBzZXQgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyBiYWNrIHRvIGl0cyBzdGFuZGFyZAorCQkJdmFsdWUuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CisJCQl2VGFza1N0ZXBUaWNrKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKTsKKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKKworCQkJLyogRXhpdCB3aXRoIGludGVycnB0cyBlbmFibGVkLiAqLworCQkJX19lbmFibGVfaXJxKCk7CisJCX0KKwl9CisKKyNlbmRpZiAvKiAjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBTZXR1cCB0aGUgU3lzVGljayB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzIGF0IHRoZSByZXF1aXJlZAorICogZnJlcXVlbmN5LgorICovCisjaWYoIGNvbmZpZ09WRVJSSURFX0RFRkFVTFRfVElDS19DT05GSUdVUkFUSU9OID09IDAgKQorCisJdm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKQorCXsKKwkJLyogQ2FsY3VsYXRlIHRoZSBjb25zdGFudHMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSB0aWNrIGludGVycnVwdC4gKi8KKwkJI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwkJeworCQkJdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKTsKKwkJCXhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKKwkJCXVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SIC8gKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdTWVNUSUNLX0NMT0NLX0haICk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKwkJLyogU3RvcCBhbmQgY2xlYXIgdGhlIFN5c1RpY2suICovCisJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAwVUw7CisJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisKKwkJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC0gMVVMOworCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gKCBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVF9CSVQgfCBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdPVkVSUklERV9ERUZBVUxUX1RJQ0tfQ09ORklHVVJBVElPTiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHVpbnQzMl90IHZQb3J0R2V0SVBTUiggdm9pZCApCit7CisJUFJFU0VSVkU4CisKKwltcnMgcjAsIGlwc3IKKwlieCByMTQKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKQorCXsKKwl1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CisJdWludDhfdCB1Y0N1cnJlbnRQcmlvcml0eTsKKworCQkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJCXVsQ3VycmVudEludGVycnVwdCA9IHZQb3J0R2V0SVBTUigpOworCisJCS8qIElzIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGEgdXNlciBkZWZpbmVkIGludGVycnVwdD8gKi8KKwkJaWYoIHVsQ3VycmVudEludGVycnVwdCA+PSBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSICkKKwkJeworCQkJLyogTG9vayB1cCB0aGUgaW50ZXJydXB0J3MgcHJpb3JpdHkuICovCisJCQl1Y0N1cnJlbnRQcmlvcml0eSA9IHBjSW50ZXJydXB0UHJpb3JpdHlSZWdpc3RlcnNbIHVsQ3VycmVudEludGVycnVwdCBdOworCisJCQkvKiBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYgYSBzZXJ2aWNlIHJvdXRpbmUgKElTUikgZm9yCisJCQlhbiBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgY2FsbHMgYW4gSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCQlmdW5jdGlvbi4gIElTUiBzYWZlIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgbXVzdCAqb25seSogYmUgY2FsbGVkCisJCQlmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhdCBvciBiZWxvdworCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlOdW1lcmljYWxseSBsb3cgaW50ZXJydXB0IHByaW9yaXR5IG51bWJlcnMgcmVwcmVzZW50IGxvZ2ljYWxseSBoaWdoCisJCQlpbnRlcnJ1cHQgcHJpb3JpdGllcywgdGhlcmVmb3JlIHRoZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0IG11c3QKKwkJCWJlIHNldCB0byBhIHZhbHVlIGVxdWFsIHRvIG9yIG51bWVyaWNhbGx5ICpoaWdoZXIqIHRoYW4KKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJSW50ZXJydXB0cyB0aGF0CXVzZSB0aGUgRnJlZVJUT1MgQVBJIG11c3Qgbm90IGJlIGxlZnQgYXQgdGhlaXIKKwkJCWRlZmF1bHQgcHJpb3JpdHkgb2YJemVybyBhcyB0aGF0IGlzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHByaW9yaXR5LAorCQkJd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBhYm92ZSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFksCisJCQlhbmQJdGhlcmVmb3JlIGFsc28gZ3VhcmFudGVlZCB0byBiZSBpbnZhbGlkLgorCisJCQlGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0byBlbnN1cmUKKwkJCWludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBzaW1wbGUgYXMgcG9zc2libGUuCisKKwkJCVRoZSBmb2xsb3dpbmcgbGlua3MgcHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbjoKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL0ZBUUhlbHAuaHRtbCAqLworCQkJY29uZmlnQVNTRVJUKCB1Y0N1cnJlbnRQcmlvcml0eSA+PSB1Y01heFN5c0NhbGxQcmlvcml0eSApOworCQl9CisKKwkJLyogUHJpb3JpdHkgZ3JvdXBpbmc6ICBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKE5WSUMpIGFsbG93cyB0aGUgYml0cworCQl0aGF0IGRlZmluZSBlYWNoIGludGVycnVwdCdzIHByaW9yaXR5IHRvIGJlIHNwbGl0IGJldHdlZW4gYml0cyB0aGF0CisJCWRlZmluZSB0aGUgaW50ZXJydXB0J3MgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cyBhbmQgYml0cyB0aGF0IGRlZmluZQorCQl0aGUgaW50ZXJydXB0J3Mgc3ViLXByaW9yaXR5LiAgRm9yIHNpbXBsaWNpdHkgYWxsIGJpdHMgbXVzdCBiZSBkZWZpbmVkCisJCXRvIGJlIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMuICBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYKKwkJdGhpcyBpcyBub3QgdGhlIGNhc2UgKGlmIHNvbWUgYml0cyByZXByZXNlbnQgYSBzdWItcHJpb3JpdHkpLgorCisJCUlmIHRoZSBhcHBsaWNhdGlvbiBvbmx5IHVzZXMgQ01TSVMgbGlicmFyaWVzIGZvciBpbnRlcnJ1cHQKKwkJY29uZmlndXJhdGlvbiB0aGVuIHRoZSBjb3JyZWN0IHNldHRpbmcgY2FuIGJlIGFjaGlldmVkIG9uIGFsbCBDb3J0ZXgtTQorCQlkZXZpY2VzIGJ5IGNhbGxpbmcgTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKCAwICk7IGJlZm9yZSBzdGFydGluZyB0aGUKKwkJc2NoZWR1bGVyLiAgTm90ZSBob3dldmVyIHRoYXQgc29tZSB2ZW5kb3Igc3BlY2lmaWMgcGVyaXBoZXJhbCBsaWJyYXJpZXMKKwkJYXNzdW1lIGEgbm9uLXplcm8gcHJpb3JpdHkgZ3JvdXAgc2V0dGluZywgaW4gd2hpY2ggY2FzZXMgdXNpbmcgYSB2YWx1ZQorCQlvZiB6ZXJvIHdpbGwgcmVzdWx0IGluIHVucHJlZGljdGFibGUgYmVoYXZpb3VyLiAqLworCQljb25maWdBU1NFUlQoICggcG9ydEFJUkNSX1JFRyAmIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLICkgPD0gdWxNYXhQUklHUk9VUFZhbHVlICk7CisJfQorCisjZW5kaWYgLyogY29uZmlnQVNTRVJUX0RFRklORUQgKi8KKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ000Ri9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRGL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmYwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ000Ri9wb3J0bWFjcm8uaApAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKworI2lmbmRlZiBQT1JUTUFDUk9fSAorI2RlZmluZSBQT1JUTUFDUk9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnQgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgKgorICogVGhlIHNldHRpbmdzIGluIHRoaXMgZmlsZSBjb25maWd1cmUgRnJlZVJUT1MgY29ycmVjdGx5IGZvciB0aGUKKyAqIGdpdmVuIGhhcmR3YXJlIGFuZCBjb21waWxlci4KKyAqCisgKiBUaGVzZSBzZXR0aW5ncyBzaG91bGQgbm90IGJlIGFsdGVyZWQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogVHlwZSBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydENIQVIJCWNoYXIKKyNkZWZpbmUgcG9ydEZMT0FUCQlmbG9hdAorI2RlZmluZSBwb3J0RE9VQkxFCQlkb3VibGUKKyNkZWZpbmUgcG9ydExPTkcJCWxvbmcKKyNkZWZpbmUgcG9ydFNIT1JUCQlzaG9ydAorI2RlZmluZSBwb3J0U1RBQ0tfVFlQRQl1aW50MzJfdAorI2RlZmluZSBwb3J0QkFTRV9UWVBFCWxvbmcKKwordHlwZWRlZiBwb3J0U1RBQ0tfVFlQRSBTdGFja1R5cGVfdDsKK3R5cGVkZWYgbG9uZyBCYXNlVHlwZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVCYXNlVHlwZV90OworCisjaWYoIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMSApCisJdHlwZWRlZiB1aW50MTZfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmYKKyNlbHNlCisJdHlwZWRlZiB1aW50MzJfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmZmZmZmVUwKKworCS8qIDMyLWJpdCB0aWNrIHR5cGUgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyByZWFkcyBvZiB0aGUgdGljayBjb3VudCBkbworCW5vdCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQyAxCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWNzLiAqLworI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCTgKKworLyogQ29uc3RhbnRzIHVzZWQgd2l0aCBtZW1vcnkgYmFycmllciBpbnRyaW5zaWNzLiAqLworI2RlZmluZSBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFCQkoIDE1ICkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNjaGVkdWxlciB1dGlsaXRpZXMuICovCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLwkJCQkJCQkJXAorCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMgY29tcGxldGVseQlcCisJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLwkJCQkJCVwKKwlfX2RzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOwkJCQkJCQkJCQkJXAorCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CQkJCQkJCQkJCQlcCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVF9CSVQJCSggMVVMIDw8IDI4VUwgKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApIGlmKCB4U3dpdGNoUmVxdWlyZWQgIT0gcGRGQUxTRSApIHBvcnRZSUVMRCgpCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LiAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApOworCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQkJCQl2UG9ydFJhaXNlQkFTRVBSSSgpCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQl2UG9ydFNldEJBU0VQUkkoIDAgKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpCQl1bFBvcnRSYWlzZUJBU0VQUkkoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJdlBvcnRTZXRCQVNFUFJJKHgpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaWNrbGVzcyBpZGxlL2xvdyBwb3dlciBmdW5jdGlvbmFsaXR5LiAqLworI2lmbmRlZiBwb3J0U1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQCisJZXh0ZXJuIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKTsKKwkjZGVmaW5lIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAoIHhFeHBlY3RlZElkbGVUaW1lICkgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIHhFeHBlY3RlZElkbGVUaW1lICkKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFBvcnQgc3BlY2lmaWMgb3B0aW1pc2F0aW9ucy4gKi8KKyNpZm5kZWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OCisJI2RlZmluZSBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gMQorI2VuZGlmCisKKyNpZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gPT0gMQorCisJLyogQ2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24uICovCisJI2lmKCBjb25maWdNQVhfUFJJT1JJVElFUyA+IDMyICkKKwkJI2Vycm9yIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiBjYW4gb25seSBiZSBzZXQgdG8gMSB3aGVuIGNvbmZpZ01BWF9QUklPUklUSUVTIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzMi4gIEl0IGlzIHZlcnkgcmFyZSB0aGF0IGEgc3lzdGVtIHJlcXVpcmVzIG1vcmUgdGhhbiAxMCB0byAxNSBkaWZmZXJlbmNlIHByaW9yaXRpZXMgYXMgdGFza3MgdGhhdCBzaGFyZSBhIHByaW9yaXR5IHdpbGwgdGltZSBzbGljZS4KKwkjZW5kaWYKKworCS8qIFN0b3JlL2NsZWFyIHRoZSByZWFkeSBwcmlvcml0aWVzIGluIGEgYml0IG1hcC4gKi8KKwkjZGVmaW5lIHBvcnRSRUNPUkRfUkVBRFlfUFJJT1JJVFkoIHV4UHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgKCB1eFJlYWR5UHJpb3JpdGllcyApIHw9ICggMVVMIDw8ICggdXhQcmlvcml0eSApICkKKwkjZGVmaW5lIHBvcnRSRVNFVF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgJj0gfiggMVVMIDw8ICggdXhQcmlvcml0eSApICkKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJI2RlZmluZSBwb3J0R0VUX0hJR0hFU1RfUFJJT1JJVFkoIHV4VG9wUHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgdXhUb3BQcmlvcml0eSA9ICggMzFVTCAtICggdWludDMyX3QgKSBfX2NseiggKCB1eFJlYWR5UHJpb3JpdGllcyApICkgKQorCisjZW5kaWYgLyogdGFza1JFQ09SRF9SRUFEWV9QUklPUklUWSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRhc2sgZnVuY3Rpb24gbWFjcm9zIGFzIGRlc2NyaWJlZCBvbiB0aGUgRnJlZVJUT1Mub3JnIFdFQiBzaXRlLiAgVGhlc2UgYXJlCitub3QgbmVjZXNzYXJ5IGZvciB0byB1c2UgdGhpcyBwb3J0LiAgVGhleSBhcmUgZGVmaW5lZCBzbyB0aGUgY29tbW9uIGRlbW8gZmlsZXMKKyh3aGljaCBidWlsZCB3aXRoIGFsbCB0aGUgcG9ydHMpIHdpbGwgYnVpbGQuICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgY29uZmlnQVNTRVJUCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKTsKKwkjZGVmaW5lIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSAJdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCkKKyNlbmRpZgorCisvKiBwb3J0Tk9QKCkgaXMgbm90IHJlcXVpcmVkIGJ5IHRoaXMgcG9ydC4gKi8KKyNkZWZpbmUgcG9ydE5PUCgpCisKKyNkZWZpbmUgcG9ydElOTElORSBfX2lubGluZQorCisjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKKwkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUgX19mb3JjZWlubGluZQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSB2b2lkIHZQb3J0U2V0QkFTRVBSSSggdWludDMyX3QgdWxCQVNFUFJJICkKK3sKKwlfX2FzbQorCXsKKwkJLyogQmFycmllciBpbnN0cnVjdGlvbnMgYXJlIG5vdCB1c2VkIGFzIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvCisJCWxvd2VyIHRoZSBCQVNFUFJJIHZhbHVlLiAqLworCQltc3IgYmFzZXByaSwgdWxCQVNFUFJJCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIHZvaWQgdlBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxOZXdCQVNFUFJJID0gY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZOworCisJX19hc20KKwl7CisJCS8qIFNldCBCQVNFUFJJIHRvIHRoZSBtYXggc3lzY2FsbCBwcmlvcml0eSB0byBlZmZlY3QgYSBjcml0aWNhbAorCQlzZWN0aW9uLiAqLworCQltc3IgYmFzZXByaSwgdWxOZXdCQVNFUFJJCisJCWRzYgorCQlpc2IKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHBvcnRGT1JDRV9JTkxJTkUgdm9pZCB2UG9ydENsZWFyQkFTRVBSSUZyb21JU1IoIHZvaWQgKQoreworCV9fYXNtCisJeworCQkvKiBTZXQgQkFTRVBSSSB0byAwIHNvIG5vIGludGVycnVwdHMgYXJlIG1hc2tlZC4gIFRoaXMgZnVuY3Rpb24gaXMgb25seQorCQl1c2VkIHRvIGxvd2VyIHRoZSBtYXNrIGluIGFuIGludGVycnVwdCwgc28gbWVtb3J5IGJhcnJpZXJzIGFyZSBub3QgCisJCXVzZWQuICovCisJCW1zciBiYXNlcHJpLCAjMAorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSB1aW50MzJfdCB1bFBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxSZXR1cm4sIHVsTmV3QkFTRVBSSSA9IGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWTsKKworCV9fYXNtCisJeworCQkvKiBTZXQgQkFTRVBSSSB0byB0aGUgbWF4IHN5c2NhbGwgcHJpb3JpdHkgdG8gZWZmZWN0IGEgY3JpdGljYWwKKwkJc2VjdGlvbi4gKi8KKwkJbXJzIHVsUmV0dXJuLCBiYXNlcHJpCisJCW1zciBiYXNlcHJpLCB1bE5ld0JBU0VQUkkKKwkJZHNiCisJCWlzYgorCX0KKworCXJldHVybiB1bFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSBCYXNlVHlwZV90IHhQb3J0SXNJbnNpZGVJbnRlcnJ1cHQoIHZvaWQgKQorewordWludDMyX3QgdWxDdXJyZW50SW50ZXJydXB0OworQmFzZVR5cGVfdCB4UmV0dXJuOworCisJLyogT2J0YWluIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW50ZXJydXB0LiAqLworCV9fYXNtCisJeworCQltcnMgdWxDdXJyZW50SW50ZXJydXB0LCBpcHNyCisJfQorCisJaWYoIHVsQ3VycmVudEludGVycnVwdCA9PSAwICkKKwl7CisJCXhSZXR1cm4gPSBwZEZBTFNFOworCX0KKwllbHNlCisJeworCQl4UmV0dXJuID0gcGRUUlVFOworCX0KKworCXJldHVybiB4UmV0dXJuOworfQorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ000X01QVS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ000X01QVS9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxYmMwNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRfTVBVL3BvcnQuYwpAQCAtMCwwICsxLDgzMyBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmggZm9yIHRoZSBBUk0gQ00zIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCithbGwgdGhlIEFQSSBmdW5jdGlvbnMgdG8gdXNlIHRoZSBNUFUgd3JhcHBlcnMuICBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgordGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisjaWZuZGVmIF9fVEFSR0VUX0ZQVV9WRlAKKwkjZXJyb3IgVGhpcyBwb3J0IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgcHJvamVjdCBvcHRpb25zIGFyZSBjb25maWd1cmVkIHRvIGVuYWJsZSBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0LgorI2VuZGlmCisKKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoZSBOVklDLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTAgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMl9SRUcJCQkJCSggKgkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjAgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDFjICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNfQ1RSTF9TVEFURV9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfTUVNX0ZBVUxUX0VOQUJMRQkJCQkoIDFVTCA8PCAxNlVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZSB0aGUgTVBVLiAqLworI2RlZmluZSBwb3J0TVBVX1RZUEVfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5MCApICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOUMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZEEwICkgKQorI2RlZmluZSBwb3J0TVBVX0NUUkxfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5NCApICkKKyNkZWZpbmUgcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFCQkJCSggOFVMIDw8IDhVTCApIC8qIDggcmVnaW9ucywgdW5pZmllZC4gKi8KKyNkZWZpbmUgcG9ydE1QVV9FTkFCTEUJCQkJCQkJKCAweDAxVUwgKQorI2RlZmluZSBwb3J0TVBVX0JBQ0tHUk9VTkRfRU5BQkxFCQkJCSggMVVMIDw8IDJVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX0VYRUNVVElPTl9TVEFSVF9BRERSRVNTCSggMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fVkFMSUQJCQkJCSggMHgxMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fRU5BQkxFCQkJCQkoIDB4MDFVTCApCisjZGVmaW5lIHBvcnRQRVJJUEhFUkFMU19TVEFSVF9BRERSRVNTCQkJMHg0MDAwMDAwMFVMCisjZGVmaW5lIHBvcnRQRVJJUEhFUkFMU19FTkRfQUREUkVTUwkJCQkweDVGRkZGRkZGVUwKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZSB0aGUgU3lzVGljay4gKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEsJCQkJCSggMHgwMDAwMDAwNFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlQJCQkJCSggMHgwMDAwMDAwMlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEUJCQkJCSggMHgwMDAwMDAwMVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMjRVTCApCisjZGVmaW5lIHBvcnROVklDX1NWQ19QUkkJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSAtIDFVTCApIDw8IDI0VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgVkZQLiAqLworI2RlZmluZSBwb3J0RlBDQ1IJCQkJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWYzNFVMICkgLyogRmxvYXRpbmcgcG9pbnQgY29udGV4dCBjb250cm9sIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0QVNQRU5fQU5EX0xTUEVOX0JJVFMJCQkJKCAweDNVTCA8PCAzMFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBzdGFjay4gKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJCSggMHgwMTAwMDAwMFVMICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCQkJKCAweGZmZmZmZmZkVUwgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRAkJKCAweDAzICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9QUklWSUxFR0VECQkoIDB4MDIgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFuIGludGVycnVwdCBwcmlvcml0eS4gKi8KKyNkZWZpbmUgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUgkJKCAxNiApCisjZGVmaW5lIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgCSggMHhFMDAwRTNGMCApCisjZGVmaW5lIHBvcnRBSVJDUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBFRDBDICkgKQorI2RlZmluZSBwb3J0TUFYXzhfQklUX1ZBTFVFCQkJCQkoICggdWludDhfdCApIDB4ZmYgKQorI2RlZmluZSBwb3J0VE9QX0JJVF9PRl9CWVRFCQkJCQkoICggdWludDhfdCApIDB4ODAgKQorI2RlZmluZSBwb3J0TUFYX1BSSUdST1VQX0JJVFMJCQkJKCAoIHVpbnQ4X3QgKSA3ICkKKyNkZWZpbmUgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sJCQkJKCAweDA3VUwgPDwgOFVMICkKKyNkZWZpbmUgcG9ydFBSSUdST1VQX1NISUZUCQkJCQkoIDhVTCApCisKKy8qIE9mZnNldHMgaW4gdGhlIHN0YWNrIHRvIHRoZSBwYXJhbWV0ZXJzIHdoZW4gaW5zaWRlIHRoZSBTVkMgaGFuZGxlci4gKi8KKyNkZWZpbmUgcG9ydE9GRlNFVF9UT19QQwkJCQkJCSggNiApCisKKy8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCitoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KKyNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZwordmFyaWFibGUuICBOb3RlIHRoaXMgaXMgbm90IHNhdmVkIGFzIHBhcnQgb2YgdGhlIHRhc2sgY29udGV4dCBhcyBjb250ZXh0Citzd2l0Y2hlcyBjYW4gb25seSBvY2N1ciB3aGVuIHV4Q3JpdGljYWxOZXN0aW5nIGlzIHplcm8uICovCitzdGF0aWMgVUJhc2VUeXBlX3QgdXhDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhOworCisvKgorICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIHBydlNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogQ29uZmlndXJlIGEgbnVtYmVyIG9mIHN0YW5kYXJkIE1QVSByZWdpb25zIHRoYXQgYXJlIHVzZWQgYnkgYWxsIHRhc2tzLgorICovCitzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlN0YXJ0Rmlyc3RUYXNrKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFJldHVybiB0aGUgc21hbGxlc3QgTVBVIHJlZ2lvbiBzaXplIHRoYXQgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgd2lsbCBmaXQKKyAqIGludG8uICBUaGUgcmVnaW9uIHNpemUgaXMgcmV0dXJuZWQgYXMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHByb2dyYW1tZWQKKyAqIGludG8gdGhlIHJlZ2lvbiBhdHRyaWJ1dGUgcmVnaXN0ZXIgZm9yIHRoYXQgcmVnaW9uLgorICovCitzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogQ2hlY2tzIHRvIHNlZSBpZiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBvZiBhbiB1bnByaXZpbGVnZWQgdGFzaywgYW5kCisgKiBpZiBzbyByYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBhbmQgcmV0dXJucyBmYWxzZSAtIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcKKyAqIG90aGVyIHRoYW4gcmV0dXJuIHRydWUuCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApOworCisvKgorICogU3RhbmRhcmQgRnJlZVJUT1MgZXhjZXB0aW9uIGhhbmRsZXJzLgorICovCit2b2lkIHhQb3J0UGVuZFNWSGFuZGxlciggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047Cit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwordm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogU3RhcnRzIHRoZSBzY2hlZHVsZXIgYnkgcmVzdG9yaW5nIHRoZSBjb250ZXh0IG9mIHRoZSBmaXJzdCB0YXNrIHRvIHJ1bi4KKyAqLworc3RhdGljIHZvaWQgcHJ2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzayggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBDIHBvcnRpb24gb2YgdGhlIFNWQyBoYW5kbGVyLiAgVGhlIFNWQyBoYW5kbGVyIGlzIHNwbGl0IGJldHdlZW4gYW4gYXNtIGVudHJ5CisgKiBhbmQgYSBDIHdyYXBwZXIgZm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nIGFuZCBtYWludGVuYW5jZS4KKyAqLwordm9pZCBwcnZTVkNIYW5kbGVyKCB1aW50MzJfdCAqcHVsUmVnaXN0ZXJzICkgX19hdHRyaWJ1dGVfXygodXNlZCkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBGdW5jdGlvbiB0byBlbmFibGUgdGhlIFZGUC4KKyAqLworc3RhdGljIHZvaWQgdlBvcnRFbmFibGVWRlAoIHZvaWQgKTsKKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB1aW50MzJfdCBwcnZQb3J0R2V0SVBTUiggdm9pZCApOworCisvKgorICogVXNlZCBieSB0aGUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIG1hY3JvIHRvIGVuc3VyZQorICogRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBhcmUgbm90IGNhbGxlZCBmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQKKyAqIGEgcHJpb3JpdHkgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorICovCisjaWYgKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwkgc3RhdGljIHVpbnQ4X3QgdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSAwOworCSBzdGF0aWMgdWludDMyX3QgdWxNYXhQUklHUk9VUFZhbHVlID0gMDsKKwkgc3RhdGljIGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QgKiBjb25zdCBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzID0gKCBjb25zdCB1aW50OF90ICogKSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2OworI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMsIEJhc2VUeXBlX3QgeFJ1blByaXZpbGVnZWQgKQoreworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwlpbnRlcnJ1cHQuICovCisJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkvKiB4UFNSICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggKCBTdGFja1R5cGVfdCApIHB4Q29kZSApICYgcG9ydFNUQVJUX0FERFJFU1NfTUFTSzsJLyogUEMgKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gMDsJLyogTFIgKi8KKwlweFRvcE9mU3RhY2sgLT0gNTsJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkvKiBSMCAqLworCisJLyogQSBzYXZlIG1ldGhvZCBpcyBiZWluZyB1c2VkIHRoYXQgcmVxdWlyZXMgZWFjaCB0YXNrIHRvIG1haW50YWluIGl0cworCW93biBleGVjIHJldHVybiB2YWx1ZS4gKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsKKworCXB4VG9wT2ZTdGFjayAtPSA5OwkvKiBSMTEsIFIxMCwgUjksIFI4LCBSNywgUjYsIFI1IGFuZCBSNC4gKi8KKworCWlmKCB4UnVuUHJpdmlsZWdlZCA9PSBwZFRSVUUgKQorCXsKKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfSUZfUFJJVklMRUdFRDsKKwl9CisJZWxzZQorCXsKKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfSUZfVU5QUklWSUxFR0VEOworCX0KKworCXJldHVybiBweFRvcE9mU3RhY2s7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBwcnZTVkNIYW5kbGVyKCB1aW50MzJfdCAqcHVsUGFyYW0gKQorewordWludDhfdCB1Y1NWQ051bWJlcjsKK3VpbnQzMl90IHVsUmVnOworCisJLyogVGhlIHN0YWNrIGNvbnRhaW5zOiByMCwgcjEsIHIyLCByMywgcjEyLCByMTQsIHRoZSByZXR1cm4gYWRkcmVzcyBhbmQKKwl4UFNSLiAgVGhlIGZpcnN0IGFyZ3VtZW50IChyMCkgaXMgcHVsUGFyYW1bIDAgXS4gKi8KKwl1Y1NWQ051bWJlciA9ICggKCB1aW50OF90ICogKSBwdWxQYXJhbVsgcG9ydE9GRlNFVF9UT19QQyBdIClbIC0yIF07CisJc3dpdGNoKCB1Y1NWQ051bWJlciApCisJeworCQljYXNlIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSCToJcG9ydE5WSUNfU1lTUFJJMV9SRUcgfD0gcG9ydE5WSUNfU1ZDX1BSSTsKKwkJCQkJCQkJCQkJcHJ2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzaygpOworCQkJCQkJCQkJCQlicmVhazsKKworCQljYXNlIHBvcnRTVkNfWUlFTEQJCQkJOglwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQkJCQkJCQkJCQkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkCisJCQkJCQkJCQkJCWJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMgY29tcGxldGVseQorCQkJCQkJCQkJCQl3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZQorCQkJCQkJCQkJCQlhcmNoaXRlY3R1cmUuICovCisJCQkJCQkJCQkJCV9fYXNtIHZvbGF0aWxlKCAiZHNiIiApOworCQkJCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKKworCQkJCQkJCQkJCQlicmVhazsKKworCQljYXNlIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCToJX19hc20KKwkJCQkJCQkJCQkJeworCQkJCQkJCQkJCQkJbXJzIHVsUmVnLCBjb250cm9sCS8qIE9idGFpbiBjdXJyZW50IGNvbnRyb2wgdmFsdWUuICovCisJCQkJCQkJCQkJCQliaWMgdWxSZWcsICMxCQkvKiBTZXQgcHJpdmlsZWdlIGJpdC4gKi8KKwkJCQkJCQkJCQkJCW1zciBjb250cm9sLCB1bFJlZwkvKiBXcml0ZSBiYWNrIG5ldyBjb250cm9sIHZhbHVlLiAqLworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCWJyZWFrOworCisJCWRlZmF1bHQJCQkJCQkJOgkvKiBVbmtub3duIFNWQyBjYWxsLiAqLworCQkJCQkJCQkJCQlicmVhazsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworX19hc20gdm9pZCB2UG9ydFNWQ0hhbmRsZXIoIHZvaWQgKQoreworCWV4dGVybiBwcnZTVkNIYW5kbGVyCisKKwlQUkVTRVJWRTgKKworCS8qIEFzc3VtZXMgcHNwIHdhcyBpbiB1c2UuICovCisJI2lmbmRlZiBVU0VfUFJPQ0VTU19TVEFDSwkvKiBDb2RlIHNob3VsZCBub3QgYmUgcmVxdWlyZWQgaWYgYSBtYWluKCkgaXMgdXNpbmcgdGhlIHByb2Nlc3Mgc3RhY2suICovCisJCXRzdCBsciwgIzQKKwkJaXRlIGVxCisJCW1yc2VxIHIwLCBtc3AKKwkJbXJzbmUgcjAsIHBzcAorCSNlbHNlCisJCW1ycyByMCwgcHNwCisJI2VuZGlmCisJCWIgcHJ2U1ZDSGFuZGxlcgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgcHJ2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzayggdm9pZCApCit7CisJUFJFU0VSVkU4CisKKwlsZHIgcjAsID0weEUwMDBFRDA4CQkJCS8qIFVzZSB0aGUgTlZJQyBvZmZzZXQgcmVnaXN0ZXIgdG8gbG9jYXRlIHRoZSBzdGFjay4gKi8KKwlsZHIgcjAsIFtyMF0KKwlsZHIgcjAsIFtyMF0KKwltc3IgbXNwLCByMAkJCQkJCS8qIFNldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IJCQkvKiBSZXN0b3JlIHRoZSBjb250ZXh0LiAqLworCWxkciByMSwgW3IzXQorCWxkciByMCwgW3IxXQkJCQkJLyogVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJYWRkIHIxLCByMSwgIzQJCQkJCS8qIE1vdmUgb250byB0aGUgc2Vjb25kIGl0ZW0gaW4gdGhlIFRDQi4uLiAqLworCWxkciByMiwgPTB4ZTAwMGVkOWMJCQkJLyogUmVnaW9uIEJhc2UgQWRkcmVzcyByZWdpc3Rlci4gKi8KKwlsZG1pYSByMSEsIHtyNC1yMTF9CQkJCS8qIFJlYWQgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJc3RtaWEgcjIhLCB7cjQtcjExfQkJCQkvKiBXcml0ZSA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwlsZG1pYSByMCEsIHtyMy1yMTEsIHIxNH0JLyogUG9wIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgc2F2ZWQgb24gZXhjZXB0aW9uIGVudHJ5LiAqLworCW1zciBjb250cm9sLCByMworCW1zciBwc3AsIHIwCQkJCQkJLyogUmVzdG9yZSB0aGUgdGFzayBzdGFjayBwb2ludGVyLiAqLworCW1vdiByMCwgIzAKKwltc3IJYmFzZXByaSwgcjAKKwlieCByMTQKKwlub3AKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgbXVzdCBub3QgYmUgc2V0IHRvIDAuICBTZWUKKwlodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCisJY29uZmlnQVNTRVJUKCAoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApICk7CisKKwkjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCXsKKwkJdm9sYXRpbGUgdWludDMyX3QgdWxPcmlnaW5hbFByaW9yaXR5OworCQl2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9ICggdm9sYXRpbGUgdWludDhfdCAqICkgKCBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2ICsgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApOworCQl2b2xhdGlsZSB1aW50OF90IHVjTWF4UHJpb3JpdHlWYWx1ZTsKKworCQkvKiBEZXRlcm1pbmUgdGhlIG1heGltdW0gcHJpb3JpdHkgZnJvbSB3aGljaCBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQuICBJU1Igc2FmZSBmdW5jdGlvbnMgYXJlIHRob3NlIHRoYXQgZW5kIGluCisJCSJGcm9tSVNSIi4gIEZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvCisJCWVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCVNhdmUgdGhlIGludGVycnVwdCBwcmlvcml0eSB2YWx1ZSB0aGF0IGlzIGFib3V0IHRvIGJlIGNsb2JiZXJlZC4gKi8KKwkJdWxPcmlnaW5hbFByaW9yaXR5ID0gKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXI7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhdmFpbGFibGUuICBGaXJzdCB3cml0ZSB0byBhbGwKKwkJcG9zc2libGUgYml0cy4gKi8KKwkJKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSBwb3J0TUFYXzhfQklUX1ZBTFVFOworCisJCS8qIFJlYWQgdGhlIHZhbHVlIGJhY2sgdG8gc2VlIGhvdyBtYW55IGJpdHMgc3R1Y2suICovCisJCXVjTWF4UHJpb3JpdHlWYWx1ZSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIFVzZSB0aGUgc2FtZSBtYXNrIG9uIHRoZSBtYXhpbXVtIHN5c3RlbSBjYWxsIHByaW9yaXR5LiAqLworCQl1Y01heFN5c0NhbGxQcmlvcml0eSA9IGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSAmIHVjTWF4UHJpb3JpdHlWYWx1ZTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBwcmlvcml0eSBncm91cCB2YWx1ZSBmb3IgdGhlIG51bWJlcgorCQlvZiBiaXRzIHJlYWQgYmFjay4gKi8KKwkJdWxNYXhQUklHUk9VUFZhbHVlID0gcG9ydE1BWF9QUklHUk9VUF9CSVRTOworCQl3aGlsZSggKCB1Y01heFByaW9yaXR5VmFsdWUgJiBwb3J0VE9QX0JJVF9PRl9CWVRFICkgPT0gcG9ydFRPUF9CSVRfT0ZfQllURSApCisJCXsKKwkJCXVsTWF4UFJJR1JPVVBWYWx1ZS0tOworCQkJdWNNYXhQcmlvcml0eVZhbHVlIDw8PSAoIHVpbnQ4X3QgKSAweDAxOworCQl9CisKKwkJI2lmZGVmIF9fTlZJQ19QUklPX0JJVFMKKwkJeworCQkJLyogQ2hlY2sgdGhlIENNU0lTIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSBudW1iZXIgb2YKKwkJCXByaW9yaXR5IGJpdHMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYWN0dWFsbHkgcXVlcmllZAorCQkJZnJvbSB0aGUgaGFyZHdhcmUuICovCisJCQljb25maWdBU1NFUlQoICggcG9ydE1BWF9QUklHUk9VUF9CSVRTIC0gdWxNYXhQUklHUk9VUFZhbHVlICkgPT0gX19OVklDX1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCSNpZmRlZiBjb25maWdQUklPX0JJVFMKKwkJeworCQkJLyogQ2hlY2sgdGhlIEZyZWVSVE9TIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSBudW1iZXIgb2YKKwkJCXByaW9yaXR5IGJpdHMgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYWN0dWFsbHkgcXVlcmllZAorCQkJZnJvbSB0aGUgaGFyZHdhcmUuICovCisJCQljb25maWdBU1NFUlQoICggcG9ydE1BWF9QUklHUk9VUF9CSVRTIC0gdWxNYXhQUklHUk9VUFZhbHVlICkgPT0gY29uZmlnUFJJT19CSVRTICk7CisJCX0KKwkJI2VuZGlmCisKKwkJLyogU2hpZnQgdGhlIHByaW9yaXR5IGdyb3VwIHZhbHVlIGJhY2sgdG8gaXRzIHBvc2l0aW9uIHdpdGhpbiB0aGUgQUlSQ1IKKwkJcmVnaXN0ZXIuICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA8PD0gcG9ydFBSSUdST1VQX1NISUZUOworCQl1bE1heFBSSUdST1VQVmFsdWUgJj0gcG9ydFBSSU9SSVRZX0dST1VQX01BU0s7CisKKwkJLyogUmVzdG9yZSB0aGUgY2xvYmJlcmVkIGludGVycnVwdCBwcmlvcml0eSByZWdpc3RlciB0byBpdHMgb3JpZ2luYWwKKwkJdmFsdWUuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gdWxPcmlnaW5hbFByaW9yaXR5OworCX0KKwkjZW5kaWYgLyogY29uaWZnQVNTRVJUX0RFRklORUQgKi8KKworCS8qIE1ha2UgUGVuZFNWIGFuZCBTeXNUaWNrIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBrZXJuZWwsIGFuZCB0aGUgU1ZDCisJaGFuZGxlciBoaWdoZXIgcHJpb3JpdHkgc28gaXQgY2FuIGJlIHVzZWQgdG8gZXhpdCBhIGNyaXRpY2FsIHNlY3Rpb24gKHdoZXJlCisJbG93ZXIgcHJpb3JpdGllcyBhcmUgbWFza2VkKS4gKi8KKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOworCXBvcnROVklDX1NZU1BSSTJfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfUFJJOworCisJLyogQ29uZmlndXJlIHRoZSByZWdpb25zIGluIHRoZSBNUFUgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCB0YXNrcy4gKi8KKwlwcnZTZXR1cE1QVSgpOworCisJLyogU3RhcnQgdGhlIHRpbWVyIHRoYXQgZ2VuZXJhdGVzIHRoZSB0aWNrIElTUi4gIEludGVycnVwdHMgYXJlIGRpc2FibGVkCisJaGVyZSBhbHJlYWR5LiAqLworCXBydlNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIEVuc3VyZSB0aGUgVkZQIGlzIGVuYWJsZWQgLSBpdCBzaG91bGQgYmUgYW55d2F5LiAqLworCXZQb3J0RW5hYmxlVkZQKCk7CisKKwkvKiBMYXp5IHNhdmUgYWx3YXlzLiAqLworCSooIHBvcnRGUENDUiApIHw9IHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUzsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCXBydlN0YXJ0Rmlyc3RUYXNrKCk7CisKKwkvKiBTaG91bGQgbm90IGdldCBoZXJlISAqLworCXJldHVybiAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgcHJ2U3RhcnRGaXJzdFRhc2soIHZvaWQgKQoreworCVBSRVNFUlZFOAorCisJLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCWxkciByMCwgPTB4RTAwMEVEMDgKKwlsZHIgcjAsIFtyMF0KKwlsZHIgcjAsIFtyMF0KKwkvKiBTZXQgdGhlIG1zcCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJbXNyIG1zcCwgcjAKKwkvKiBDbGVhciB0aGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoZSBGUFUgaXMgaW4gdXNlIGluIGNhc2UgdGhlIEZQVSB3YXMgdXNlZAorCWJlZm9yZSB0aGUgc2NoZWR1bGVyIHdhcyBzdGFydGVkIC0gd2hpY2ggd291bGQgb3RoZXJ3aXNlIHJlc3VsdCBpbiB0aGUKKwl1bm5lY2Vzc2FyeSBsZWF2aW5nIG9mIHNwYWNlIGluIHRoZSBTVkMgc3RhY2sgZm9yIGxhenkgc2F2aW5nIG9mIEZQVQorCXJlZ2lzdGVycy4gKi8KKwltb3YgcjAsICMwCisJbXNyIGNvbnRyb2wsIHIwCisJLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJY3BzaWUgaQorCWNwc2llIGYKKwlkc2IKKwlpc2IKKwlzdmMgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIJLyogU3lzdGVtIGNhbGwgdG8gc3RhcnQgZmlyc3QgdGFzay4gKi8KKwlub3AKKwlub3AKK30KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApCit7CisJLyogTm90IGltcGxlbWVudGVkIGluIHBvcnRzIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLgorCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxMDAwVUwgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApCit7CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl1eENyaXRpY2FsTmVzdGluZysrOworCisJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApCit7CitCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKKworCWNvbmZpZ0FTU0VSVCggdXhDcml0aWNhbE5lc3RpbmcgKTsKKwl1eENyaXRpY2FsTmVzdGluZy0tOworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSB2b2lkIHhQb3J0UGVuZFNWSGFuZGxlciggdm9pZCApCit7CisJZXh0ZXJuIHV4Q3JpdGljYWxOZXN0aW5nOworCWV4dGVybiBweEN1cnJlbnRUQ0I7CisJZXh0ZXJuIHZUYXNrU3dpdGNoQ29udGV4dDsKKworCVBSRVNFUlZFOAorCisJbXJzIHIwLCBwc3AKKworCWxkciByMywgPXB4Q3VycmVudFRDQgkJCS8qIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgVENCLiAqLworCWxkciByMiwgW3IzXQorCisJdHN0IHIxNCwgIzB4MTAJCQkJCS8qIElzIHRoZSB0YXNrIHVzaW5nIHRoZSBGUFUgY29udGV4dD8gIElmIHNvLCBwdXNoIGhpZ2ggdmZwIHJlZ2lzdGVycy4gKi8KKwlpdCBlcQorCXZzdG1kYmVxIHIwISwge3MxNi1zMzF9CisKKwltcnMgcjEsIGNvbnRyb2wKKwlzdG1kYiByMCEsIHtyMSwgcjQtcjExLCByMTR9CS8qIFNhdmUgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMuICovCisJc3RyIHIwLCBbcjJdCQkJCQkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGludG8gdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgVENCLiAqLworCisJc3RtZGIgc3AhLCB7cjAsIHIzfQorCW1vdiByMCwgI2NvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWQorCW1zciBiYXNlcHJpLCByMAorCWRzYgorCWlzYgorCWJsIHZUYXNrU3dpdGNoQ29udGV4dAorCW1vdiByMCwgIzAKKwltc3IgYmFzZXByaSwgcjAKKwlsZG1pYSBzcCEsIHtyMCwgcjN9CisJCQkJCQkJCQkvKiBSZXN0b3JlIHRoZSBjb250ZXh0LiAqLworCWxkciByMSwgW3IzXQorCWxkciByMCwgW3IxXQkJCQkJLyogVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJYWRkIHIxLCByMSwgIzQJCQkJCS8qIE1vdmUgb250byB0aGUgc2Vjb25kIGl0ZW0gaW4gdGhlIFRDQi4uLiAqLworCWxkciByMiwgPTB4ZTAwMGVkOWMJCQkJLyogUmVnaW9uIEJhc2UgQWRkcmVzcyByZWdpc3Rlci4gKi8KKwlsZG1pYSByMSEsIHtyNC1yMTF9CQkJCS8qIFJlYWQgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJc3RtaWEgcjIhLCB7cjQtcjExfQkJCQkvKiBXcml0ZSA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwlsZG1pYSByMCEsIHtyMy1yMTEsIHIxNH0JCS8qIFBvcCB0aGUgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNhdmVkIG9uIGV4Y2VwdGlvbiBlbnRyeS4gKi8KKwltc3IgY29udHJvbCwgcjMKKworCXRzdCByMTQsICMweDEwCQkJCQkvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcG9wIHRoZSBoaWdoIHZmcCByZWdpc3RlcnMgdG9vLiAqLworCWl0IGVxCisJdmxkbWlhZXEgcjAhLCB7czE2LXMzMX0KKworCW1zciBwc3AsIHIwCisJYnggcjE0CisJbm9wCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB4UG9ydFN5c1RpY2tIYW5kbGVyKCB2b2lkICkKK3sKK3VpbnQzMl90IHVsRHVtbXk7CisKKwl1bER1bW15ID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCXsKKwkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2suICovCisJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogUGVuZCBhIGNvbnRleHQgc3dpdGNoLiAqLworCQkJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsKKwkJfQorCX0KKwlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHVsRHVtbXkgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2V0dXAgdGhlIHN5c3RpY2sgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cyBhdCB0aGUgcmVxdWlyZWQKKyAqIGZyZXF1ZW5jeS4KKyAqLworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCit7CisJLyogUmVzZXQgdGhlIFN5c1RpY2suICovCisJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9IDBVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCisJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKSAtIDFVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gcG9ydE5WSUNfU1lTVElDS19DTEsgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgdlBvcnRTd2l0Y2hUb1VzZXJNb2RlKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKworCW1ycyByMCwgY29udHJvbAorCW9yciByMCwgIzEKKwltc3IgY29udHJvbCwgcjAKKwlieCByMTQKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSB2b2lkIHZQb3J0RW5hYmxlVkZQKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKworCWxkci53IHIwLCA9MHhFMDAwRUQ4OAkJLyogVGhlIEZQVSBlbmFibGUgYml0cyBhcmUgaW4gdGhlIENQQUNSLiAqLworCWxkciByMSwgW3IwXQorCisJb3JyIHIxLCByMSwgIyggMHhmIDw8IDIwICkJLyogRW5hYmxlIENQMTAgYW5kIENQMTEgY29wcm9jZXNzb3JzLCB0aGVuIHNhdmUgYmFjay4gKi8KKwlzdHIgcjEsIFtyMF0KKwlieCByMTQKKwlub3AKKwlub3AKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApCit7CitleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfXzsKK2V4dGVybiB1aW50MzJfdCBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXzsKK2V4dGVybiB1aW50MzJfdCBfX0ZMQVNIX3NlZ21lbnRfZW5kX187CitleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXzsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXzsKKworCS8qIENoZWNrIHRoZSBleHBlY3RlZCBNUFUgaXMgcHJlc2VudC4gKi8KKwlpZiggcG9ydE1QVV9UWVBFX1JFRyA9PSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUgKQorCXsKKwkJLyogRmlyc3Qgc2V0dXAgdGhlIGVudGlyZSBmbGFzaCBmb3IgdW5wcml2aWxlZ2VkIHJlYWQgb25seSBhY2Nlc3MuICovCisJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJCQkJCQkoIHBvcnRVTlBSSVZJTEVHRURfRkxBU0hfUkVHSU9OICk7CisKKwkJcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRyA9CSggcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCQkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9lbmRfXyAtICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogU2V0dXAgdGhlIGZpcnN0IDE2SyBmb3IgcHJpdmlsZWdlZCBvbmx5IGFjY2VzcyAoZXZlbiB0aG91Z2ggbGVzcworCQl0aGFuIDEwSyBpcyBhY3R1YWxseSBiZWluZyB1c2VkKS4gIFRoaXMgaXMgd2hlcmUgdGhlIGtlcm5lbCBjb2RlIGlzCisJCXBsYWNlZC4gKi8KKwkJcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRyA9CSggKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9zdGFydF9fICkgfCAvKiBCYXNlIGFkZHJlc3MuICovCisJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkJCQkJCSggcG9ydFBSSVZJTEVHRURfRkxBU0hfUkVHSU9OICk7CisKKwkJcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRyA9CSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQkJCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfXyAtICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApICkgfAorCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogU2V0dXAgdGhlIHByaXZpbGVnZWQgZGF0YSBSQU0gcmVnaW9uLiAgVGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGRhdGEKKwkJaXMgcGxhY2VkLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJCQkJCQkoIHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT04gKTsKKworCQlwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHID0JKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQkJCQkJCQlwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fIC0gKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBCeSBkZWZhdWx0IGFsbG93IGV2ZXJ5dGhpbmcgdG8gYWNjZXNzIHRoZSBnZW5lcmFsIHBlcmlwaGVyYWxzLiAgVGhlCisJCXN5c3RlbSBwZXJpcGhlcmFscyBhbmQgcmVnaXN0ZXJzIGFyZSBwcm90ZWN0ZWQuICovCisJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoIHBvcnRQRVJJUEhFUkFMU19TVEFSVF9BRERSRVNTICkgfAorCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJCQkJCQkoIHBvcnRHRU5FUkFMX1BFUklQSEVSQUxTX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgfCBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICkgfAorCQkJCQkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHBvcnRQRVJJUEhFUkFMU19FTkRfQUREUkVTUyAtIHBvcnRQRVJJUEhFUkFMU19TVEFSVF9BRERSRVNTICkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBFbmFibGUgdGhlIG1lbW9yeSBmYXVsdCBleGNlcHRpb24uICovCisJCXBvcnROVklDX1NZU19DVFJMX1NUQVRFX1JFRyB8PSBwb3J0TlZJQ19NRU1fRkFVTFRfRU5BQkxFOworCisJCS8qIEVuYWJsZSB0aGUgTVBVIHdpdGggdGhlIGJhY2tncm91bmQgcmVnaW9uIGNvbmZpZ3VyZWQuICovCisJCXBvcnRNUFVfQ1RSTF9SRUcgfD0gKCBwb3J0TVBVX0VOQUJMRSB8IHBvcnRNUFVfQkFDS0dST1VORF9FTkFCTEUgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVpbnQzMl90IHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1aW50MzJfdCB1bEFjdHVhbFNpemVJbkJ5dGVzICkKK3sKK3VpbnQzMl90IHVsUmVnaW9uU2l6ZSwgdWxSZXR1cm5WYWx1ZSA9IDQ7CisKKwkvKiAzMiBpcyB0aGUgc21hbGxlc3QgcmVnaW9uIHNpemUsIDMxIGlzIHRoZSBsYXJnZXN0IHZhbGlkIHZhbHVlIGZvcgorCXVsUmV0dXJuVmFsdWUuICovCisJZm9yKCB1bFJlZ2lvblNpemUgPSAzMlVMOyB1bFJldHVyblZhbHVlIDwgMzFVTDsgKCB1bFJlZ2lvblNpemUgPDw9IDFVTCApICkKKwl7CisJCWlmKCB1bEFjdHVhbFNpemVJbkJ5dGVzIDw9IHVsUmVnaW9uU2l6ZSApCisJCXsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJeworCQkJdWxSZXR1cm5WYWx1ZSsrOworCQl9CisJfQorCisJLyogU2hpZnQgdGhlIGNvZGUgYnkgb25lIGJlZm9yZSByZXR1cm5pbmcgc28gaXQgY2FuIGJlIHdyaXR0ZW4gZGlyZWN0bHkKKwlpbnRvIHRoZSB0aGUgY29ycmVjdCBiaXQgcG9zaXRpb24gb2YgdGhlIGF0dHJpYnV0ZSByZWdpc3Rlci4gKi8KKwlyZXR1cm4gKCB1bFJldHVyblZhbHVlIDw8IDFVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIEJhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApCit7CisJbXJzIHIwLCBjb250cm9sCisJdHN0IHIwLCAjMQkJCQkJCS8qIElzIHRoZSB0YXNrIHJ1bm5pbmcgcHJpdmlsZWdlZD8gKi8KKwlpdHRlIG5lCisJbW92bmUgcjAsICMwCQkJCQkvKiBDT05UUk9MWzBdIT0wLCByZXR1cm4gZmFsc2UuICovCisJc3ZjbmUgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UJLyogU3dpdGNoIHRvIHByaXZpbGVnZWQuICovCisJbW92ZXEgcjAsICMxCQkJCQkvKiBDT05UUk9MWzBdPT0wLCByZXR1cm4gdHJ1ZS4gKi8KKwlieCBscgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRTdG9yZVRhc2tNUFVTZXR0aW5ncyggeE1QVV9TRVRUSU5HUyAqeE1QVVNldHRpbmdzLCBjb25zdCBzdHJ1Y3QgeE1FTU9SWV9SRUdJT04gKiBjb25zdCB4UmVnaW9ucywgU3RhY2tUeXBlX3QgKnB4Qm90dG9tT2ZTdGFjaywgdWludDMyX3QgdWxTdGFja0RlcHRoICkKK3sKK2V4dGVybiB1aW50MzJfdCBfX1NSQU1fc2VnbWVudF9zdGFydF9fOworZXh0ZXJuIHVpbnQzMl90IF9fU1JBTV9zZWdtZW50X2VuZF9fOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X187CitleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfZW5kX187CisKKworaW50MzJfdCBsSW5kZXg7Cit1aW50MzJfdCB1bDsKKworCWlmKCB4UmVnaW9ucyA9PSBOVUxMICkKKwl7CisJCS8qIE5vIE1QVSByZWdpb25zIGFyZSBzcGVjaWZpZWQgc28gYWxsb3cgYWNjZXNzIHRvIGFsbCBSQU0uICovCisJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMCBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPQorCQkJCSggKCB1aW50MzJfdCApIF9fU1JBTV9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCSggcG9ydFNUQUNLX1JFR0lPTiApOworCisJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMCBdLnVsUmVnaW9uQXR0cmlidXRlID0KKwkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCAoIHVpbnQzMl90ICkgX19TUkFNX3NlZ21lbnRfZW5kX18gLSAoIHVpbnQzMl90ICkgX19TUkFNX3NlZ21lbnRfc3RhcnRfXyApICkgfAorCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogUmUtaW5zdGF0ZSB0aGUgcHJpdmlsZWdlZCBvbmx5IFJBTSByZWdpb24gYXMgeFJlZ2lvblsgMCBdIHdpbGwgaGF2ZQorCQlqdXN0IHJlbW92ZWQgdGhlIHByaXZpbGVnZWQgb25seSBwYXJhbWV0ZXJzLiAqLworCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDEgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0KKwkJCQkoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fICkgfCAvKiBCYXNlIGFkZHJlc3MuICovCisJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkoIHBvcnRTVEFDS19SRUdJT04gKyAxICk7CisKKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAxIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFICkgfAorCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXyAtICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fICkgfAorCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisKKwkJLyogSW52YWxpZGF0ZSBhbGwgb3RoZXIgcmVnaW9ucy4gKi8KKwkJZm9yKCB1bCA9IDI7IHVsIDw9IHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlM7IHVsKysgKQorCQl7CisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9ICggcG9ydFNUQUNLX1JFR0lPTiArIHVsICkgfCBwb3J0TVBVX1JFR0lPTl9WQUxJRDsKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9IDBVTDsKKwkJfQorCX0KKwllbHNlCisJeworCQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHRhc2sgaXMgY3JlYXRlZCAtIGluCisJCXdoaWNoIGNhc2UgdGhlIHN0YWNrIHJlZ2lvbiBwYXJhbWV0ZXJzIHdpbGwgYmUgdmFsaWQuICBBdCBhbGwgb3RoZXIKKwkJdGltZXMgdGhlIHN0YWNrIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgdmFsaWQgYW5kIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUKKwkJc3RhY2sgcmVnaW9uIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZC4gKi8KKwkJaWYoIHVsU3RhY2tEZXB0aCA+IDAgKQorCQl7CisJCQkvKiBEZWZpbmUgdGhlIHJlZ2lvbiB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIHN0YWNrLiAqLworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJCSggKCB1aW50MzJfdCApIHB4Qm90dG9tT2ZTdGFjayApIHwKKwkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJKCBwb3J0U1RBQ0tfUkVHSU9OICk7IC8qIFJlZ2lvbiBudW1iZXIuICovCisKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMCBdLnVsUmVnaW9uQXR0cmlidXRlID0KKwkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFICkgfCAvKiBSZWFkIGFuZCB3cml0ZS4gKi8KKwkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggdWxTdGFja0RlcHRoICogKCB1aW50MzJfdCApIHNpemVvZiggU3RhY2tUeXBlX3QgKSApICkgfAorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCQl9CisKKwkJbEluZGV4ID0gMDsKKworCQlmb3IoIHVsID0gMTsgdWwgPD0gcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUzsgdWwrKyApCisJCXsKKwkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXSApLnVsTGVuZ3RoSW5CeXRlcyA+IDBVTCApCisJCQl7CisJCQkJLyogVHJhbnNsYXRlIHRoZSBnZW5lcmljIHJlZ2lvbiBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbgorCQkJCXhSZWdpb25zIGludG8gdGhlIENNMyBzcGVjaWZpYyBNUFUgc2V0dGluZ3MgdGhhdCBhcmUgdGhlbgorCQkJCXN0b3JlZCBpbiB4TVBVU2V0dGluZ3MuICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPQorCQkJCQkJKCAoIHVpbnQzMl90ICkgeFJlZ2lvbnNbIGxJbmRleCBdLnB2QmFzZUFkZHJlc3MgKSB8CisJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkJKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKTsgLyogUmVnaW9uIG51bWJlci4gKi8KKworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9CisJCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB4UmVnaW9uc1sgbEluZGV4IF0udWxMZW5ndGhJbkJ5dGVzICkgKSB8CisJCQkJCQkoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgKSB8CisJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIEludmFsaWRhdGUgdGhlIHJlZ2lvbi4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9ICggcG9ydFNUQUNLX1JFR0lPTiArIHVsICkgfCBwb3J0TVBVX1JFR0lPTl9WQUxJRDsKKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25BdHRyaWJ1dGUgPSAwVUw7CisJCQl9CisKKwkJCWxJbmRleCsrOworCQl9CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHVpbnQzMl90IHBydlBvcnRHZXRJUFNSKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKworCW1ycyByMCwgaXBzcgorCWJ4IHIxNAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApCisJeworCXVpbnQzMl90IHVsQ3VycmVudEludGVycnVwdDsKKwl1aW50OF90IHVjQ3VycmVudFByaW9yaXR5OworCisJCS8qIE9idGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGludGVycnVwdC4gKi8KKwkJdWxDdXJyZW50SW50ZXJydXB0ID0gcHJ2UG9ydEdldElQU1IoKTsKKworCQkvKiBJcyB0aGUgaW50ZXJydXB0IG51bWJlciBhIHVzZXIgZGVmaW5lZCBpbnRlcnJ1cHQ/ICovCisJCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPj0gcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApCisJCXsKKwkJCS8qIExvb2sgdXAgdGhlIGludGVycnVwdCdzIHByaW9yaXR5LiAqLworCQkJdWNDdXJyZW50UHJpb3JpdHkgPSBwY0ludGVycnVwdFByaW9yaXR5UmVnaXN0ZXJzWyB1bEN1cnJlbnRJbnRlcnJ1cHQgXTsKKworCQkJLyogVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmIGEgc2VydmljZSByb3V0aW5lIChJU1IpIGZvcgorCQkJYW4gaW50ZXJydXB0IHRoYXQgaGFzIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhYm92ZQorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIGNhbGxzIGFuIElTUiBzYWZlIEZyZWVSVE9TIEFQSQorCQkJZnVuY3Rpb24uICBJU1Igc2FmZSBGcmVlUlRPUyBBUEkgZnVuY3Rpb25zIG11c3QgKm9ubHkqIGJlIGNhbGxlZAorCQkJZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgYmVsb3cKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJTnVtZXJpY2FsbHkgbG93IGludGVycnVwdCBwcmlvcml0eSBudW1iZXJzIHJlcHJlc2VudCBsb2dpY2FsbHkgaGlnaAorCQkJaW50ZXJydXB0IHByaW9yaXRpZXMsIHRoZXJlZm9yZSB0aGUgcHJpb3JpdHkgb2YgdGhlIGludGVycnVwdCBtdXN0CisJCQliZSBzZXQgdG8gYSB2YWx1ZSBlcXVhbCB0byBvciBudW1lcmljYWxseSAqaGlnaGVyKiB0aGFuCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCUludGVycnVwdHMgdGhhdAl1c2UgdGhlIEZyZWVSVE9TIEFQSSBtdXN0IG5vdCBiZSBsZWZ0IGF0IHRoZWlyCisJCQlkZWZhdWx0IHByaW9yaXR5IG9mCXplcm8gYXMgdGhhdCBpcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBwcmlvcml0eSwKKwkJCXdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLAorCQkJYW5kCXRoZXJlZm9yZSBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgaW52YWxpZC4KKworCQkJRnJlZVJUT1MgbWFpbnRhaW5zIHNlcGFyYXRlIHRocmVhZCBhbmQgSVNSIEFQSSBmdW5jdGlvbnMgdG8gZW5zdXJlCisJCQlpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCQlUaGUgZm9sbG93aW5nIGxpbmtzIHByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb246CisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCisJCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9GQVFIZWxwLmh0bWwgKi8KKwkJCWNvbmZpZ0FTU0VSVCggdWNDdXJyZW50UHJpb3JpdHkgPj0gdWNNYXhTeXNDYWxsUHJpb3JpdHkgKTsKKwkJfQorCisJCS8qIFByaW9yaXR5IGdyb3VwaW5nOiAgVGhlIGludGVycnVwdCBjb250cm9sbGVyIChOVklDKSBhbGxvd3MgdGhlIGJpdHMKKwkJdGhhdCBkZWZpbmUgZWFjaCBpbnRlcnJ1cHQncyBwcmlvcml0eSB0byBiZSBzcGxpdCBiZXR3ZWVuIGJpdHMgdGhhdAorCQlkZWZpbmUgdGhlIGludGVycnVwdCdzIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMgYW5kIGJpdHMgdGhhdCBkZWZpbmUKKwkJdGhlIGludGVycnVwdCdzIHN1Yi1wcmlvcml0eS4gIEZvciBzaW1wbGljaXR5IGFsbCBiaXRzIG11c3QgYmUgZGVmaW5lZAorCQl0byBiZSBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzLiAgVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmCisJCXRoaXMgaXMgbm90IHRoZSBjYXNlIChpZiBzb21lIGJpdHMgcmVwcmVzZW50IGEgc3ViLXByaW9yaXR5KS4KKworCQlJZiB0aGUgYXBwbGljYXRpb24gb25seSB1c2VzIENNU0lTIGxpYnJhcmllcyBmb3IgaW50ZXJydXB0CisJCWNvbmZpZ3VyYXRpb24gdGhlbiB0aGUgY29ycmVjdCBzZXR0aW5nIGNhbiBiZSBhY2hpZXZlZCBvbiBhbGwgQ29ydGV4LU0KKwkJZGV2aWNlcyBieSBjYWxsaW5nIE5WSUNfU2V0UHJpb3JpdHlHcm91cGluZyggMCApOyBiZWZvcmUgc3RhcnRpbmcgdGhlCisJCXNjaGVkdWxlci4gIE5vdGUgaG93ZXZlciB0aGF0IHNvbWUgdmVuZG9yIHNwZWNpZmljIHBlcmlwaGVyYWwgbGlicmFyaWVzCisJCWFzc3VtZSBhIG5vbi16ZXJvIHByaW9yaXR5IGdyb3VwIHNldHRpbmcsIGluIHdoaWNoIGNhc2VzIHVzaW5nIGEgdmFsdWUKKwkJb2YgemVybyB3aWxsIHJlc3VsdCBpbiB1bnByZWRpY2FibGUgYmVoYXZpb3VyLiAqLworCQljb25maWdBU1NFUlQoICggcG9ydEFJUkNSX1JFRyAmIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLICkgPD0gdWxNYXhQUklHUk9VUFZhbHVlICk7CisJfQorCisjZW5kaWYgLyogY29uZmlnQVNTRVJUX0RFRklORUQgKi8KKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ000X01QVS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMWFkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ000X01QVS9wb3J0bWFjcm8uaApAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKworI2lmbmRlZiBQT1JUTUFDUk9fSAorI2RlZmluZSBQT1JUTUFDUk9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnQgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgKgorICogVGhlIHNldHRpbmdzIGluIHRoaXMgZmlsZSBjb25maWd1cmUgRnJlZVJUT1MgY29ycmVjdGx5IGZvciB0aGUKKyAqIGdpdmVuIGhhcmR3YXJlIGFuZCBjb21waWxlci4KKyAqCisgKiBUaGVzZSBzZXR0aW5ncyBzaG91bGQgbm90IGJlIGFsdGVyZWQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogVHlwZSBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydENIQVIJCWNoYXIKKyNkZWZpbmUgcG9ydEZMT0FUCQlmbG9hdAorI2RlZmluZSBwb3J0RE9VQkxFCQlkb3VibGUKKyNkZWZpbmUgcG9ydExPTkcJCWxvbmcKKyNkZWZpbmUgcG9ydFNIT1JUCQlzaG9ydAorI2RlZmluZSBwb3J0U1RBQ0tfVFlQRQl1aW50MzJfdAorI2RlZmluZSBwb3J0QkFTRV9UWVBFCWxvbmcKKwordHlwZWRlZiBwb3J0U1RBQ0tfVFlQRSBTdGFja1R5cGVfdDsKK3R5cGVkZWYgbG9uZyBCYXNlVHlwZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVCYXNlVHlwZV90OworCisjaWYoIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMSApCisJdHlwZWRlZiB1aW50MTZfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmYKKyNlbHNlCisJdHlwZWRlZiB1aW50MzJfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKSAweGZmZmZmZmZmVUwKKworCS8qIDMyLWJpdCB0aWNrIHR5cGUgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyByZWFkcyBvZiB0aGUgdGljayBjb3VudCBkbworCW5vdCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQyAxCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBNUFUgc3BlY2lmaWMgY29uc3RhbnRzLiAqLworI2RlZmluZSBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTCQkxCisjZGVmaW5lIHBvcnRQUklWSUxFR0VfQklUCQkJKCAweDgwMDAwMDAwVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUJCQkJKCAweDAzVUwgPDwgMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9PTkxZCQkoIDB4MDVVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZCQkJCSggMHgwNlVMIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUJKCAweDAxVUwgPDwgMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFCQkoIDB4MDdVTCA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUgkJCSggMHgwMVVMIDw8IDI4VUwgKQorCisjZGVmaW5lIHBvcnRVTlBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkoIDBVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJCSggMVVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTgkJCSggMlVMICkKKyNkZWZpbmUgcG9ydEdFTkVSQUxfUEVSSVBIRVJBTFNfUkVHSU9OCQkoIDNVTCApCisjZGVmaW5lIHBvcnRTVEFDS19SRUdJT04JCQkJCSggNFVMICkKKyNkZWZpbmUgcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04JICAgICggNVVMICkKKyNkZWZpbmUgcG9ydExBU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkJKCA3VUwgKQorI2RlZmluZSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TCQkoICggcG9ydExBU1RfQ09ORklHVVJBQkxFX1JFR0lPTiAtIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OICkgKyAxICkKKyNkZWZpbmUgcG9ydFRPVEFMX05VTV9SRUdJT05TCQkJCSggcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUyArIDEgKSAvKiBQbHVzIG9uZSB0byBtYWtlIHNwYWNlIGZvciB0aGUgc3RhY2sgcmVnaW9uLiAqLworCit2b2lkIHZQb3J0U3dpdGNoVG9Vc2VyTW9kZSggdm9pZCApOworI2RlZmluZSBwb3J0U1dJVENIX1RPX1VTRVJfTU9ERSgpCXZQb3J0U3dpdGNoVG9Vc2VyTW9kZSgpCisKK3R5cGVkZWYgc3RydWN0IE1QVV9SRUdJT05fUkVHSVNURVJTCit7CisJdWludDMyX3QgdWxSZWdpb25CYXNlQWRkcmVzczsKKwl1aW50MzJfdCB1bFJlZ2lvbkF0dHJpYnV0ZTsKK30geE1QVV9SRUdJT05fUkVHSVNURVJTOworCisvKiBQbHVzIDEgdG8gY3JlYXRlIHNwYWNlIGZvciB0aGUgc3RhY2sgcmVnaW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgTVBVX1NFVFRJTkdTCit7CisJeE1QVV9SRUdJT05fUkVHSVNURVJTIHhSZWdpb25bIHBvcnRUT1RBTF9OVU1fUkVHSU9OUyBdOworfSB4TVBVX1NFVFRJTkdTOworCisvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWNzLiAqLworI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCTgKKworLyogQ29uc3RhbnRzIHVzZWQgd2l0aCBtZW1vcnkgYmFycmllciBpbnRyaW5zaWNzLiAqLworI2RlZmluZSBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFCQkoIDE1ICkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNWQyBudW1iZXJzIGZvciB2YXJpb3VzIHNlcnZpY2VzLiAqLworI2RlZmluZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgkJCQkwCisjZGVmaW5lIHBvcnRTVkNfWUlFTEQJCQkJCQkxCisjZGVmaW5lIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCQkJCTIKKworLyogU2NoZWR1bGVyIHV0aWxpdGllcy4gKi8KKworI2RlZmluZSBwb3J0WUlFTEQoKQkJCQlfX2FzbXsgU1ZDIHBvcnRTVkNfWUlFTEQgfQorI2RlZmluZSBwb3J0WUlFTERfV0lUSElOX0FQSSgpIAkJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8JCQkJCQkJCVwKKwlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOwkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzIGNvbXBsZXRlbHkJXAorCXdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8JCQkJCQlcCisJX19kc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsJCQkJCQkJCQkJCVwKKwlfX2lzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOwkJCQkJCQkJCQkJXAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkxfUkVHCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCQkoIDFVTCA8PCAyOFVMICkKKyNkZWZpbmUgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4U3dpdGNoUmVxdWlyZWQgKSBpZiggeFN3aXRjaFJlcXVpcmVkICkgcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVAorI2RlZmluZSBwb3J0WUlFTERfRlJPTV9JU1IoIHggKSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHggKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENyaXRpY2FsIHNlY3Rpb24gbWFuYWdlbWVudC4gKi8KK2V4dGVybiB2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApOworZXh0ZXJuIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKTsKKworI2RlZmluZSBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkJCQkJdlBvcnRSYWlzZUJBU0VQUkkoKQorI2RlZmluZSBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQkJCQkJdlBvcnRTZXRCQVNFUFJJKDApCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQkJCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCXVsUG9ydFJhaXNlQkFTRVBSSSgpCisjZGVmaW5lIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUih4KQl2UG9ydFNldEJBU0VQUkkoeCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBvcHRpbWlzYXRpb25zLiAqLworI2lmbmRlZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04KKwkjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAxCisjZW5kaWYKKworI2lmIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiA9PSAxCisKKwkvKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KKwkjaWYoIGNvbmZpZ01BWF9QUklPUklUSUVTID4gMzIgKQorCQkjZXJyb3IgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIGNhbiBvbmx5IGJlIHNldCB0byAxIHdoZW4gY29uZmlnTUFYX1BSSU9SSVRJRVMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMyLiAgSXQgaXMgdmVyeSByYXJlIHRoYXQgYSBzeXN0ZW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEwIHRvIDE1IGRpZmZlcmVuY2UgcHJpb3JpdGllcyBhcyB0YXNrcyB0aGF0IHNoYXJlIGEgcHJpb3JpdHkgd2lsbCB0aW1lIHNsaWNlLgorCSNlbmRpZgorCisJLyogU3RvcmUvY2xlYXIgdGhlIHJlYWR5IHByaW9yaXRpZXMgaW4gYSBiaXQgbWFwLiAqLworCSNkZWZpbmUgcG9ydFJFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgfD0gKCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCSNkZWZpbmUgcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSAmPSB+KCAxVUwgPDwgKCB1eFByaW9yaXR5ICkgKQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkjZGVmaW5lIHBvcnRHRVRfSElHSEVTVF9QUklPUklUWSggdXhUb3BQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSB1eFRvcFByaW9yaXR5ID0gKCAzMVVMIC0gKCB1aW50MzJfdCApIF9fY2x6KCAoIHV4UmVhZHlQcmlvcml0aWVzICkgKSApCisKKyNlbmRpZiAvKiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4gIFRoZXNlIGFyZQorbm90IG5lY2Vzc2FyeSBmb3IgdG8gdXNlIHRoaXMgcG9ydC4gIFRoZXkgYXJlIGRlZmluZWQgc28gdGhlIGNvbW1vbiBkZW1vIGZpbGVzCisod2hpY2ggYnVpbGQgd2l0aCBhbGwgdGhlIHBvcnRzKSB3aWxsIGJ1aWxkLiAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkgdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIGNvbmZpZ0FTU0VSVAorCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICk7CisJI2RlZmluZSBwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCkgCXZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSgpCisjZW5kaWYKKworLyogcG9ydE5PUCgpIGlzIG5vdCByZXF1aXJlZCBieSB0aGlzIHBvcnQuICovCisjZGVmaW5lIHBvcnROT1AoKQorCisjZGVmaW5lIHBvcnRJTkxJTkUgX19pbmxpbmUKKworI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCisJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FIF9fZm9yY2VpbmxpbmUKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHBvcnRGT1JDRV9JTkxJTkUgdm9pZCB2UG9ydFNldEJBU0VQUkkoIHVpbnQzMl90IHVsQkFTRVBSSSApCit7CisJX19hc20KKwl7CisJCS8qIEJhcnJpZXIgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgdXNlZCBhcyB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB0bworCQlsb3dlciB0aGUgQkFTRVBSSSB2YWx1ZS4gKi8KKwkJbXNyIGJhc2VwcmksIHVsQkFTRVBSSQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSB2b2lkIHZQb3J0UmFpc2VCQVNFUFJJKCB2b2lkICkKK3sKK3VpbnQzMl90IHVsTmV3QkFTRVBSSSA9IGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWTsKKworCV9fYXNtCisJeworCQkvKiBTZXQgQkFTRVBSSSB0byB0aGUgbWF4IHN5c2NhbGwgcHJpb3JpdHkgdG8gZWZmZWN0IGEgY3JpdGljYWwKKwkJc2VjdGlvbi4gKi8KKwkJbXNyIGJhc2VwcmksIHVsTmV3QkFTRVBSSQorCQlkc2IKKwkJaXNiCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIHZvaWQgdlBvcnRDbGVhckJBU0VQUklGcm9tSVNSKCB2b2lkICkKK3sKKwlfX2FzbQorCXsKKwkJLyogU2V0IEJBU0VQUkkgdG8gMCBzbyBubyBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQuICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkKKwkJdXNlZCB0byBsb3dlciB0aGUgbWFzayBpbiBhbiBpbnRlcnJ1cHQsIHNvIG1lbW9yeSBiYXJyaWVycyBhcmUgbm90CisJCXVzZWQuICovCisJCW1zciBiYXNlcHJpLCAjMAorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSB1aW50MzJfdCB1bFBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxSZXR1cm4sIHVsTmV3QkFTRVBSSSA9IGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWTsKKworCV9fYXNtCisJeworCQkvKiBTZXQgQkFTRVBSSSB0byB0aGUgbWF4IHN5c2NhbGwgcHJpb3JpdHkgdG8gZWZmZWN0IGEgY3JpdGljYWwKKwkJc2VjdGlvbi4gKi8KKwkJbXJzIHVsUmV0dXJuLCBiYXNlcHJpCisJCW1zciBiYXNlcHJpLCB1bE5ld0JBU0VQUkkKKwkJZHNiCisJCWlzYgorCX0KKworCXJldHVybiB1bFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSBCYXNlVHlwZV90IHhQb3J0SXNJbnNpZGVJbnRlcnJ1cHQoIHZvaWQgKQorewordWludDMyX3QgdWxDdXJyZW50SW50ZXJydXB0OworQmFzZVR5cGVfdCB4UmV0dXJuOworCisJLyogT2J0YWluIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW50ZXJydXB0LiAqLworCV9fYXNtCisJeworCQltcnMgdWxDdXJyZW50SW50ZXJydXB0LCBpcHNyCisJfQorCisJaWYoIHVsQ3VycmVudEludGVycnVwdCA9PSAwICkKKwl7CisJCXhSZXR1cm4gPSBwZEZBTFNFOworCX0KKwllbHNlCisJeworCQl4UmV0dXJuID0gcGRUUlVFOworCX0KKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNldCB0aGUgcHJpdmlsZWdlIGxldmVsIHRvIHVzZXIgbW9kZSBpZiB4UnVubmluZ1ByaXZpbGVnZWQgaXMgZmFsc2UuICovCitwb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyB2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICkKK3sKK3VpbnQzMl90IHVsUmVnOworCisJaWYoIHhSdW5uaW5nUHJpdmlsZWdlZCAhPSBwZFRSVUUgKQorCXsKKwkJX19hc20KKwkJeworCQkJbXJzIHVsUmVnLCBjb250cm9sCisJCQlvcnIgdWxSZWcsICMxCisJCQltc3IgY29udHJvbCwgdWxSZWcKKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003L1JlYWRNZS50eHQgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003L1JlYWRNZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyZTdmZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTcvUmVhZE1lLnR4dApAQCAtMCwwICsxLDE4IEBACitUaGVyZSBhcmUgdHdvIG9wdGlvbnMgZm9yIHJ1bm5pbmcgRnJlZVJUT1Mgb24gQVJNIENvcnRleC1NNyBtaWNyb2NvbnRyb2xsZXJzLgorVGhlIGJlc3Qgb3B0aW9uIGRlcGVuZHMgb24gdGhlIHJldmlzaW9uIG9mIHRoZSBBUk0gQ29ydGV4LU03IGNvcmUgaW4gdXNlLiAgVGhlCityZXZpc2lvbiBpcyBzcGVjaWZpZWQgYnkgYW4gJ3InIG51bWJlciwgYW5kIGEgJ3AnIG51bWJlciwgc28gd2lsbCBsb29rIHNvbWV0aGluZworbGlrZSAncjBwMScuICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG1pY3JvY29udHJvbGxlciBpbiB1c2UgdG8gZmluZCB0aGUgCityZXZpc2lvbiBvZiB0aGUgQ29ydGV4LU03IGNvcmUgdXNlZCBpbiB0aGF0IG1pY3JvY29udHJvbGxlci4gIElmIGluIGRvdWJ0LCB1c2UgCit0aGUgRnJlZVJUT1MgcG9ydCBwcm92aWRlZCBzcGVjaWZpY2FsbHkgZm9yIHIwcDEgcmV2aXNpb25zLCBhcyB0aGF0IGNhbiBiZSB1c2VkCit3aXRoIGFsbCBjb3JlIHJldmlzaW9ucy4KKworVGhlIGZpcnN0IG9wdGlvbiBpcyB0byB1c2UgdGhlIEFSTSBDb3J0ZXgtTTRGIHBvcnQsIGFuZCB0aGUgc2Vjb25kIG9wdGlvbiBpcyB0bwordXNlIHRoZSBDb3J0ZXgtTTcgcjBwMSBwb3J0IC0gdGhlIGxhdHRlciBjb250YWluaW5nIGEgbWlub3IgZXJyYXRhIHdvcmthcm91bmQuCisKK0lmIHRoZSByZXZpc2lvbiBvZiB0aGUgQVJNIENvcnRleC1NNyBjb3JlIGlzIG5vdCByMHAxIHRoZW4gZWl0aGVyIG9wdGlvbiBjYW4gYmUKK3VzZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIEZyZWVSVE9TIEFSTSBDb3J0ZXgtTTRGIHBvcnQgbG9jYXRlZCBpbiAKK3RoZSAvRnJlZVJUT1MvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNEYgZGlyZWN0b3J5LgorCitJZiB0aGUgcmV2aXNpb24gb2YgdGhlIEFSTSBDb3J0ZXgtTTcgY29yZSBpcyByMHAxIHRoZW4gdXNlIHRoZSBGcmVlUlRPUyBBUk0KK0NvcnRleC1NNyByMHAxIHBvcnQgbG9jYXRlZCBpbiB0aGUgL0ZyZWVSVE9TL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTcvcjBwMQorZGlyZWN0b3J5LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTcvcjBwMS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003L3IwcDEvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTM0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003L3IwcDEvcG9ydC5jCkBAIC0wLDAgKzEsNzc0IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gcG9ydGFibGUuaCBmb3IgdGhlIEFSTSBDTTRGIHBvcnQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyNpZm5kZWYgX19UQVJHRVRfRlBVX1ZGUAorCSNlcnJvciBUaGlzIHBvcnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgdG8gZW5hYmxlIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQuCisjZW5kaWYKKworI2lmIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSA9PSAwCisJI2Vycm9yIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBtdXN0IG5vdCBiZSBzZXQgdG8gMC4gIFNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCisjZW5kaWYKKworI2lmbmRlZiBjb25maWdTWVNUSUNLX0NMT0NLX0haCisJI2RlZmluZSBjb25maWdTWVNUSUNLX0NMT0NLX0haIGNvbmZpZ0NQVV9DTE9DS19IWgorCS8qIEVuc3VyZSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGF0IHRoZSBzYW1lIGZyZXF1ZW5jeSBhcyB0aGUgY29yZS4gKi8KKwkjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVAkoIDFVTCA8PCAyVUwgKQorI2Vsc2UKKwkvKiBUaGUgd2F5IHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgaXMgbm90IG1vZGlmaWVkIGluIGNhc2UgaXQgaXMgbm90IHRoZSBzYW1lCisJYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQJKCAwICkKKyNlbmRpZgorCisvKiBUaGUgX193ZWFrIGF0dHJpYnV0ZSBkb2VzIG5vdCB3b3JrIGFzIHlvdSBtaWdodCBleHBlY3Qgd2l0aCB0aGUgS2VpbCB0b29scworc28gdGhlIGNvbmZpZ09WRVJSSURFX0RFRkFVTFRfVElDS19DT05GSUdVUkFUSU9OIGNvbnN0YW50IG11c3QgYmUgc2V0IHRvIDEgaWYKK3RoZSBhcHBsaWNhdGlvbiB3cml0ZXIgd2FudHMgdG8gcHJvdmlkZSB0aGVpciBvd24gaW1wbGVtZW50YXRpb24gb2YKK3ZQb3J0U2V0dXBUaW1lckludGVycnVwdCgpLiAgRW5zdXJlIGNvbmZpZ09WRVJSSURFX0RFRkFVTFRfVElDS19DT05GSUdVUkFUSU9OCitpcyBkZWZpbmVkLiAqLworI2lmbmRlZiBjb25maWdPVkVSUklERV9ERUZBVUxUX1RJQ0tfQ09ORklHVVJBVElPTgorCSNkZWZpbmUgY29uZmlnT1ZFUlJJREVfREVGQVVMVF9USUNLX0NPTkZJR1VSQVRJT04gMAorI2VuZGlmCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBjb3JlLiAgUmVnaXN0ZXJzIGZpcnN0Li4uICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRwkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkgKQorLyogLi4udGhlbiBiaXRzIGluIHRoZSByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVAkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVAkJCSggMVVMIDw8IDBVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQJCSggMVVMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZDTEVBUl9CSVQgCQkJKCAxVUwgPDwgMjdVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRfU1lTVElDS19DTEVBUl9CSVQJCSggMVVMIDw8IDI1VUwgKQorCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVl9QUkkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAyNFVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBhbiBpbnRlcnJ1cHQgcHJpb3JpdHkuICovCisjZGVmaW5lIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIJCSggMTYgKQorI2RlZmluZSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2IAkoIDB4RTAwMEUzRjAgKQorI2RlZmluZSBwb3J0QUlSQ1JfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhFMDAwRUQwQyApICkKKyNkZWZpbmUgcG9ydE1BWF84X0JJVF9WQUxVRQkJCQkJKCAoIHVpbnQ4X3QgKSAweGZmICkKKyNkZWZpbmUgcG9ydFRPUF9CSVRfT0ZfQllURQkJCQkJKCAoIHVpbnQ4X3QgKSAweDgwICkKKyNkZWZpbmUgcG9ydE1BWF9QUklHUk9VUF9CSVRTCQkJCSggKCB1aW50OF90ICkgNyApCisjZGVmaW5lIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLCQkJCSggMHgwN1VMIDw8IDhVTCApCisjZGVmaW5lIHBvcnRQUklHUk9VUF9TSElGVAkJCQkJKCA4VUwgKQorCisvKiBNYXNrcyBvZmYgYWxsIGJpdHMgYnV0IHRoZSBWRUNUQUNUSVZFIGJpdHMgaW4gdGhlIElDU1IgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRWRUNUQUNUSVZFX01BU0sJCQkJCSggMHhGRlVMICkKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIFZGUC4gKi8KKyNkZWZpbmUgcG9ydEZQQ0NSCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVmMzQgKSAvKiBGbG9hdGluZyBwb2ludCBjb250ZXh0IGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUwkoIDB4M1VMIDw8IDMwVUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJKCAweDAxMDAwMDAwICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJKCAweGZmZmZmZmZkICkKKworLyogVGhlIHN5c3RpY2sgaXMgYSAyNC1iaXQgY291bnRlci4gKi8KKyNkZWZpbmUgcG9ydE1BWF8yNF9CSVRfTlVNQkVSCQkoIDB4ZmZmZmZmVUwgKQorCisvKiBBIGZpZGRsZSBmYWN0b3IgdG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBTeXNUaWNrIGNvdW50cyB0aGF0IHdvdWxkIGhhdmUKK29jY3VycmVkIHdoaWxlIHRoZSBTeXNUaWNrIGNvdW50ZXIgaXMgc3RvcHBlZCBkdXJpbmcgdGlja2xlc3MgaWRsZQorY2FsY3VsYXRpb25zLiAqLworI2RlZmluZSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IJKCA0NVVMICkKKworLyogRm9yIHN0cmljdCBjb21wbGlhbmNlIHdpdGggdGhlIENvcnRleC1NIHNwZWMgdGhlIHRhc2sgc3RhcnQgYWRkcmVzcyBzaG91bGQKK2hhdmUgYml0LTAgY2xlYXIsIGFzIGl0IGlzIGxvYWRlZCBpbnRvIHRoZSBQQyBvbiBleGl0IGZyb20gYW4gSVNSLiAqLworI2RlZmluZSBwb3J0U1RBUlRfQUREUkVTU19NQVNLCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKgorICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuICBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcworICogZmlsZSBpcyB3ZWFrIHRvIGFsbG93IGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gY2hhbmdlIHRoZSB0aW1lciB1c2VkIHRvCisgKiBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CisKKy8qCisgKiBFeGNlcHRpb24gaGFuZGxlcnMuCisgKi8KK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICk7Cit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKTsKK3ZvaWQgdlBvcnRTVkNIYW5kbGVyKCB2b2lkICk7CisKKy8qCisgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlN0YXJ0Rmlyc3RUYXNrKCB2b2lkICk7CisKKy8qCisgKiBGdW5jdGlvbnMgZGVmaW5lZCBpbiBwb3J0YXNtLnMgdG8gZW5hYmxlIHRoZSBWRlAuCisgKi8KK3N0YXRpYyB2b2lkIHBydkVuYWJsZVZGUCggdm9pZCApOworCisvKgorICogVXNlZCB0byBjYXRjaCB0YXNrcyB0aGF0IGF0dGVtcHQgdG8gcmV0dXJuIGZyb20gdGhlaXIgaW1wbGVtZW50aW5nIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZwordmFyaWFibGUuICovCitzdGF0aWMgVUJhc2VUeXBlX3QgdXhDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhOworCisvKgorICogVGhlIG51bWJlciBvZiBTeXNUaWNrIGluY3JlbWVudHMgdGhhdCBtYWtlIHVwIG9uZSB0aWNrIHBlcmlvZC4KKyAqLworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKwlzdGF0aWMgdWludDMyX3QgdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGljayBwZXJpb2RzIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgaXMgbGltaXRlZCBieSB0aGUKKyAqIDI0IGJpdCByZXNvbHV0aW9uIG9mIHRoZSBTeXNUaWNrIHRpbWVyLgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKgorICogQ29tcGVuc2F0ZSBmb3IgdGhlIENQVSBjeWNsZXMgdGhhdCBwYXNzIHdoaWxlIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgKGxvdworICogcG93ZXIgZnVuY3Rpb25hbGl0eSBvbmx5LgorICovCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCXN0YXRpYyB1aW50MzJfdCB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFVzZWQgYnkgdGhlIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSBtYWNybyB0byBlbnN1cmUKKyAqIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgYXJlIG5vdCBjYWxsZWQgZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkCisgKiBhIHByaW9yaXR5IGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKyAqLworI2lmICggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJIHN0YXRpYyB1aW50OF90IHVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gMDsKKwkgc3RhdGljIHVpbnQzMl90IHVsTWF4UFJJR1JPVVBWYWx1ZSA9IDA7CisJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggdWludDhfdCAqICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK1N0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkKK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJaW50ZXJydXB0LiAqLworCisJLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0CisJb2YgaW50ZXJydXB0cywgYW5kIHRvIGVuc3VyZSBhbGlnbm1lbnQuICovCisJcHhUb3BPZlN0YWNrLS07CisKKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJLyogeFBTUiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoICggU3RhY2tUeXBlX3QgKSBweENvZGUgKSAmIHBvcnRTVEFSVF9BRERSRVNTX01BU0s7CS8qIFBDICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwcnZUYXNrRXhpdEVycm9yOwkvKiBMUiAqLworCisJLyogU2F2ZSBjb2RlIHNwYWNlIGJ5IHNraXBwaW5nIHJlZ2lzdGVyIGluaXRpYWxpc2F0aW9uLiAqLworCXB4VG9wT2ZTdGFjayAtPSA1OwkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CS8qIFIwICovCisKKwkvKiBBIHNhdmUgbWV0aG9kIGlzIGJlaW5nIHVzZWQgdGhhdCByZXF1aXJlcyBlYWNoIHRhc2sgdG8gbWFpbnRhaW4gaXRzCisJb3duIGV4ZWMgcmV0dXJuIHZhbHVlLiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCisJcHhUb3BPZlN0YWNrIC09IDg7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCWl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uICBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCXNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4KKworCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQoKSB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMKKwlkZWZpbmVkLCB0aGVuIHN0b3AgaGVyZSBzbyBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCWZvciggOzsgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSB2b2lkIHZQb3J0U1ZDSGFuZGxlciggdm9pZCApCit7CisJUFJFU0VSVkU4CisKKwkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IKKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0KKwkvKiBQb3AgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIwISwge3I0LXIxMSwgcjE0fQorCW1zciBwc3AsIHIwCisJaXNiCisJbW92IHIwLCAjMAorCW1zcgliYXNlcHJpLCByMAorCWJ4IHIxNAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgcHJ2U3RhcnRGaXJzdFRhc2soIHZvaWQgKQoreworCVBSRVNFUlZFOAorCisJLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCWxkciByMCwgPTB4RTAwMEVEMDgKKwlsZHIgcjAsIFtyMF0KKwlsZHIgcjAsIFtyMF0KKwkvKiBTZXQgdGhlIG1zcCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJbXNyIG1zcCwgcjAKKwkvKiBDbGVhciB0aGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoZSBGUFUgaXMgaW4gdXNlIGluIGNhc2UgdGhlIEZQVSB3YXMgdXNlZAorCWJlZm9yZSB0aGUgc2NoZWR1bGVyIHdhcyBzdGFydGVkIC0gd2hpY2ggd291bGQgb3RoZXJ3aXNlIHJlc3VsdCBpbiB0aGUKKwl1bm5lY2Vzc2FyeSBsZWF2aW5nIG9mIHNwYWNlIGluIHRoZSBTVkMgc3RhY2sgZm9yIGxhenkgc2F2aW5nIG9mIEZQVQorCXJlZ2lzdGVycy4gKi8KKwltb3YgcjAsICMwCisJbXNyIGNvbnRyb2wsIHIwCisJLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJY3BzaWUgaQorCWNwc2llIGYKKwlkc2IKKwlpc2IKKwkvKiBDYWxsIFNWQyB0byBzdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwlzdmMgMAorCW5vcAorCW5vcAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgcHJ2RW5hYmxlVkZQKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKworCS8qIFRoZSBGUFUgZW5hYmxlIGJpdHMgYXJlIGluIHRoZSBDUEFDUi4gKi8KKwlsZHIudyByMCwgPTB4RTAwMEVEODgKKwlsZHIJcjEsIFtyMF0KKworCS8qIEVuYWJsZSBDUDEwIGFuZCBDUDExIGNvcHJvY2Vzc29ycywgdGhlbiBzYXZlIGJhY2suICovCisJb3JyCXIxLCByMSwgIyggMHhmIDw8IDIwICkKKwlzdHIgcjEsIFtyMF0KKwlieAlyMTQKKwlub3AKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2VlIGhlYWRlciBmaWxlIGZvciBkZXNjcmlwdGlvbi4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKKwkjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCXsKKwkJdm9sYXRpbGUgdWludDMyX3QgdWxPcmlnaW5hbFByaW9yaXR5OworCQl2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9ICggdWludDhfdCAqICkgKCBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2ICsgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUiApOworCQl2b2xhdGlsZSB1aW50OF90IHVjTWF4UHJpb3JpdHlWYWx1ZTsKKworCQkvKiBEZXRlcm1pbmUgdGhlIG1heGltdW0gcHJpb3JpdHkgZnJvbSB3aGljaCBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQuICBJU1Igc2FmZSBmdW5jdGlvbnMgYXJlIHRob3NlIHRoYXQgZW5kIGluCisJCSJGcm9tSVNSIi4gIEZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvCisJCWVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgc2ltcGxlIGFzIHBvc3NpYmxlLgorCisJCVNhdmUgdGhlIGludGVycnVwdCBwcmlvcml0eSB2YWx1ZSB0aGF0IGlzIGFib3V0IHRvIGJlIGNsb2JiZXJlZC4gKi8KKwkJdWxPcmlnaW5hbFByaW9yaXR5ID0gKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXI7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhdmFpbGFibGUuICBGaXJzdCB3cml0ZSB0byBhbGwKKwkJcG9zc2libGUgYml0cy4gKi8KKwkJKnB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSBwb3J0TUFYXzhfQklUX1ZBTFVFOworCisJCS8qIFJlYWQgdGhlIHZhbHVlIGJhY2sgdG8gc2VlIGhvdyBtYW55IGJpdHMgc3R1Y2suICovCisJCXVjTWF4UHJpb3JpdHlWYWx1ZSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIFRoZSBrZXJuZWwgaW50ZXJydXB0IHByaW9yaXR5IHNob3VsZCBiZSBzZXQgdG8gdGhlIGxvd2VzdAorCQlwcmlvcml0eS4gKi8KKwkJY29uZmlnQVNTRVJUKCB1Y01heFByaW9yaXR5VmFsdWUgPT0gKCBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICYgdWNNYXhQcmlvcml0eVZhbHVlICkgKTsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCSNpZmRlZiBfX05WSUNfUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBDTVNJUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IF9fTlZJQ19QUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkjaWZkZWYgY29uZmlnUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBGcmVlUlRPUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IGNvbmZpZ1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIEVuc3VyZSB0aGUgVkZQIGlzIGVuYWJsZWQgLSBpdCBzaG91bGQgYmUgYW55d2F5LiAqLworCXBydkVuYWJsZVZGUCgpOworCisJLyogTGF6eSBzYXZlIGFsd2F5cy4gKi8KKwkqKCBwb3J0RlBDQ1IgKSB8PSBwb3J0QVNQRU5fQU5EX0xTUEVOX0JJVFM7CisKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwlwcnZTdGFydEZpcnN0VGFzaygpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSEgKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkKK3sKKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJdXhDcml0aWNhbE5lc3RpbmcrKzsKKworCS8qIFRoaXMgaXMgbm90IHRoZSBpbnRlcnJ1cHQgc2FmZSB2ZXJzaW9uIG9mIHRoZSBlbnRlciBjcml0aWNhbCBmdW5jdGlvbiBzbworCWFzc2VydCgpIGlmIGl0IGlzIGJlaW5nIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LiAgT25seSBBUEkKKwlmdW5jdGlvbnMgdGhhdCBlbmQgaW4gIkZyb21JU1IiIGNhbiBiZSB1c2VkIGluIGFuIGludGVycnVwdC4gIE9ubHkgYXNzZXJ0IGlmCisJdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgaXMgMSB0byBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaXZlIGNhbGxzIGlmIHRoZQorCWFzc2VydCBmdW5jdGlvbiBhbHNvIHVzZXMgYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAxICkKKwl7CisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgJiBwb3J0VkVDVEFDVElWRV9NQVNLICkgPT0gMCApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkKK3sKKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nICk7CisJdXhDcml0aWNhbE5lc3RpbmctLTsKKwlpZiggdXhDcml0aWNhbE5lc3RpbmcgPT0gMCApCisJeworCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworX19hc20gdm9pZCB4UG9ydFBlbmRTVkhhbmRsZXIoIHZvaWQgKQoreworCWV4dGVybiB1eENyaXRpY2FsTmVzdGluZzsKKwlleHRlcm4gcHhDdXJyZW50VENCOworCWV4dGVybiB2VGFza1N3aXRjaENvbnRleHQ7CisKKwlQUkVTRVJWRTgKKworCW1ycyByMCwgcHNwCisJaXNiCisJLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJbGRyCXIzLCA9cHhDdXJyZW50VENCCisJbGRyCXIyLCBbcjNdCisKKwkvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcHVzaCBoaWdoIHZmcCByZWdpc3RlcnMuICovCisJdHN0IHIxNCwgIzB4MTAKKwlpdCBlcQorCXZzdG1kYmVxIHIwISwge3MxNi1zMzF9CisKKwkvKiBTYXZlIHRoZSBjb3JlIHJlZ2lzdGVycy4gKi8KKwlzdG1kYiByMCEsIHtyNC1yMTEsIHIxNH0KKworCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW50byB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBUQ0IuICovCisJc3RyIHIwLCBbcjJdCisKKwlzdG1kYiBzcCEsIHtyMCwgcjN9CisJbW92IHIwLCAjY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZCisJY3BzaWQgaQorCW1zciBiYXNlcHJpLCByMAorCWRzYgorCWlzYgorCWNwc2llIGkKKwlibCB2VGFza1N3aXRjaENvbnRleHQKKwltb3YgcjAsICMwCisJbXNyIGJhc2VwcmksIHIwCisJbGRtaWEgc3AhLCB7cjAsIHIzfQorCisJLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0KKworCS8qIFBvcCB0aGUgY29yZSByZWdpc3RlcnMuICovCisJbGRtaWEgcjAhLCB7cjQtcjExLCByMTR9CisKKwkvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcG9wIHRoZSBoaWdoIHZmcCByZWdpc3RlcnMKKwl0b28uICovCisJdHN0IHIxNCwgIzB4MTAKKwlpdCBlcQorCXZsZG1pYWVxIHIwISwge3MxNi1zMzF9CisKKwltc3IgcHNwLCByMAorCWlzYgorCSNpZmRlZiBXT1JLQVJPVU5EX1BNVV9DTTAwMSAvKiBYTUM0MDAwIHNwZWNpZmljIGVycmF0YSAqLworCQkjaWYgV09SS0FST1VORF9QTVVfQ00wMDEgPT0gMQorCQkJcHVzaCB7IHIxNCB9CisJCQlwb3AgeyBwYyB9CisJCQlub3AKKwkJI2VuZGlmCisJI2VuZGlmCisKKwlieCByMTQKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKQoreworCS8qIFRoZSBTeXNUaWNrIHJ1bnMgYXQgdGhlIGxvd2VzdCBpbnRlcnJ1cHQgcHJpb3JpdHksIHNvIHdoZW4gdGhpcyBpbnRlcnJ1cHQKKwlleGVjdXRlcyBhbGwgaW50ZXJydXB0cyBtdXN0IGJlIHVubWFza2VkLiAgVGhlcmUgaXMgdGhlcmVmb3JlIG5vIG5lZWQgdG8KKwlzYXZlIGFuZCB0aGVuIHJlc3RvcmUgdGhlIGludGVycnVwdCBtYXNrIHZhbHVlIGFzIGl0cyB2YWx1ZSBpcyBhbHJlYWR5CisJa25vd24gLSB0aGVyZWZvcmUgdGhlIHNsaWdodGx5IGZhc3RlciB2UG9ydFJhaXNlQkFTRVBSSSgpIGZ1bmN0aW9uIGlzIHVzZWQKKwlpbiBwbGFjZSBvZiBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkuICovCisJdlBvcnRSYWlzZUJBU0VQUkkoKTsKKwl7CisJCS8qIEluY3JlbWVudCB0aGUgUlRPUyB0aWNrLiAqLworCQlpZiggeFRhc2tJbmNyZW1lbnRUaWNrKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIEEgY29udGV4dCBzd2l0Y2ggaXMgcmVxdWlyZWQuICBDb250ZXh0IHN3aXRjaGluZyBpcyBwZXJmb3JtZWQgaW4KKwkJCXRoZSBQZW5kU1YgaW50ZXJydXB0LiAgUGVuZCB0aGUgUGVuZFNWIGludGVycnVwdC4gKi8KKwkJCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCX0KKwl9CisJdlBvcnRDbGVhckJBU0VQUklGcm9tSVNSKCk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKKworCV9fd2VhayB2b2lkIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCBUaWNrVHlwZV90IHhFeHBlY3RlZElkbGVUaW1lICkKKwl7CisJdWludDMyX3QgdWxSZWxvYWRWYWx1ZSwgdWxDb21wbGV0ZVRpY2tQZXJpb2RzLCB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzOworCVRpY2tUeXBlX3QgeE1vZGlmaWFibGVJZGxlVGltZTsKKworCQkvKiBNYWtlIHN1cmUgdGhlIFN5c1RpY2sgcmVsb2FkIHZhbHVlIGRvZXMgbm90IG92ZXJmbG93IHRoZSBjb3VudGVyLiAqLworCQlpZiggeEV4cGVjdGVkSWRsZVRpbWUgPiB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzICkKKwkJeworCQkJeEV4cGVjdGVkSWRsZVRpbWUgPSB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzOworCQl9CisKKwkJLyogU3RvcCB0aGUgU3lzVGljayBtb21lbnRhcmlseS4gIFRoZSB0aW1lIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgZm9yCisJCWlzIGFjY291bnRlZCBmb3IgYXMgYmVzdCBpdCBjYW4gYmUsIGJ1dCB1c2luZyB0aGUgdGlja2xlc3MgbW9kZSB3aWxsCisJCWluZXZpdGFibHkgcmVzdWx0IGluIHNvbWUgdGlueSBkcmlmdCBvZiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZQorCQlrZXJuZWwgd2l0aCByZXNwZWN0IHRvIGNhbGVuZGFyIHRpbWUuICovCisJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgJj0gfnBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKworCQkvKiBDYWxjdWxhdGUgdGhlIHJlbG9hZCB2YWx1ZSByZXF1aXJlZCB0byB3YWl0IHhFeHBlY3RlZElkbGVUaW1lCisJCXRpY2sgcGVyaW9kcy4gIC0xIGlzIHVzZWQgYmVjYXVzZSB0aGlzIGNvZGUgd2lsbCBleGVjdXRlIHBhcnQgd2F5CisJCXRocm91Z2ggb25lIG9mIHRoZSB0aWNrIHBlcmlvZHMuICovCisJCXVsUmVsb2FkVmFsdWUgPSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHICsgKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAqICggeEV4cGVjdGVkSWRsZVRpbWUgLSAxVUwgKSApOworCQlpZiggdWxSZWxvYWRWYWx1ZSA+IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uICkKKwkJeworCQkJdWxSZWxvYWRWYWx1ZSAtPSB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbjsKKwkJfQorCisJCS8qIEVudGVyIGEgY3JpdGljYWwgc2VjdGlvbiBidXQgZG9uJ3QgdXNlIHRoZSB0YXNrRU5URVJfQ1JJVElDQUwoKQorCQltZXRob2QgYXMgdGhhdCB3aWxsIG1hc2sgaW50ZXJydXB0cyB0aGF0IHNob3VsZCBleGl0IHNsZWVwIG1vZGUuICovCisJCV9fZGlzYWJsZV9pcnEoKTsKKwkJX19kc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKwkJX19pc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKworCQkvKiBJZiBhIGNvbnRleHQgc3dpdGNoIGlzIHBlbmRpbmcgb3IgYSB0YXNrIGlzIHdhaXRpbmcgZm9yIHRoZSBzY2hlZHVsZXIKKwkJdG8gYmUgdW5zdXNwZW5kZWQgdGhlbiBhYmFuZG9uIHRoZSBsb3cgcG93ZXIgZW50cnkuICovCisJCWlmKCBlVGFza0NvbmZpcm1TbGVlcE1vZGVTdGF0dXMoKSA9PSBlQWJvcnRTbGVlcCApCisJCXsKKwkJCS8qIFJlc3RhcnQgZnJvbSB3aGF0ZXZlciBpcyBsZWZ0IGluIHRoZSBjb3VudCByZWdpc3RlciB0byBjb21wbGV0ZQorCQkJdGhpcyB0aWNrIHBlcmlvZC4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKworCQkJLyogUmVzZXQgdGhlIHJlbG9hZCByZWdpc3RlciB0byB0aGUgdmFsdWUgcmVxdWlyZWQgZm9yIG5vcm1hbCB0aWNrCisJCQlwZXJpb2RzLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAtIHNlZSBjb21tZW50cyBhYm92ZSBfX2Rpc2FibGVfaXJxKCkgY2FsbAorCQkJYWJvdmUuICovCisJCQlfX2VuYWJsZV9pcnEoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFNldCB0aGUgbmV3IHJlbG9hZCB2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFJlbG9hZFZhbHVlOworCisJCQkvKiBDbGVhciB0aGUgU3lzVGljayBjb3VudCBmbGFnIGFuZCBzZXQgdGhlIGNvdW50IHZhbHVlIGJhY2sgdG8KKwkJCXplcm8uICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKworCQkJLyogU2xlZXAgdW50aWwgc29tZXRoaW5nIGhhcHBlbnMuICBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORygpIGNhbgorCQkJc2V0IGl0cyBwYXJhbWV0ZXIgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IGl0cyBpbXBsZW1lbnRhdGlvbiBjb250YWlucworCQkJaXRzIG93biB3YWl0IGZvciBpbnRlcnJ1cHQgb3Igd2FpdCBmb3IgZXZlbnQgaW5zdHJ1Y3Rpb24sIGFuZCBzbyB3ZmkKKwkJCXNob3VsZCBub3QgYmUgZXhlY3V0ZWQgYWdhaW4uICBIb3dldmVyLCB0aGUgb3JpZ2luYWwgZXhwZWN0ZWQgaWRsZQorCQkJdGltZSB2YXJpYWJsZSBtdXN0IHJlbWFpbiB1bm1vZGlmaWVkLCBzbyBhIGNvcHkgaXMgdGFrZW4uICovCisJCQl4TW9kaWZpYWJsZUlkbGVUaW1lID0geEV4cGVjdGVkSWRsZVRpbWU7CisJCQljb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyggJnhNb2RpZmlhYmxlSWRsZVRpbWUgKTsKKwkJCWlmKCB4TW9kaWZpYWJsZUlkbGVUaW1lID4gMCApCisJCQl7CisJCQkJX19kc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKwkJCQlfX3dmaSgpOworCQkJCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCQl9CisJCQljb25maWdQT1NUX1NMRUVQX1BST0NFU1NJTkcoICZ4RXhwZWN0ZWRJZGxlVGltZSApOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyB0byBhbGxvdyB0aGUgaW50ZXJydXB0IHRoYXQgYnJvdWdodCB0aGUgTUNVCisJCQlvdXQgb2Ygc2xlZXAgbW9kZSB0byBleGVjdXRlIGltbWVkaWF0ZWx5LiAgc2VlIGNvbW1lbnRzIGFib3ZlCisJCQlfX2Rpc2FibGVfaW50ZXJydXB0KCkgY2FsbCBhYm92ZS4gKi8KKwkJCV9fZW5hYmxlX2lycSgpOworCQkJX19kc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKwkJCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisKKwkJCS8qIERpc2FibGUgaW50ZXJydXB0cyBhZ2FpbiBiZWNhdXNlIHRoZSBjbG9jayBpcyBhYm91dCB0byBiZSBzdG9wcGVkCisJCQlhbmQgaW50ZXJydXB0cyB0aGF0IGV4ZWN1dGUgd2hpbGUgdGhlIGNsb2NrIGlzIHN0b3BwZWQgd2lsbCBpbmNyZWFzZQorCQkJYW55IHNsaXBwYWdlIGJldHdlZW4gdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUgUlRPUyBhbmQgY2FsZW5kYXIKKwkJCXRpbWUuICovCisJCQlfX2Rpc2FibGVfaXJxKCk7CisJCQlfX2RzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOworCQkJX19pc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKworCQkJLyogRGlzYWJsZSB0aGUgU3lzVGljayBjbG9jayB3aXRob3V0IHJlYWRpbmcgdGhlCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHJlZ2lzdGVyIHRvIGVuc3VyZSB0aGUKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQgaXMgbm90IGNsZWFyZWQgaWYgaXQgaXMgc2V0LiAgQWdhaW4sCisJCQl0aGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvciBpcyBhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuCisJCQliZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwgaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55CisJCQlkcmlmdCBvZiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZSBrZXJuZWwgd2l0aCByZXNwZWN0IHRvIGNhbGVuZGFyCisJCQl0aW1lKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCApOworCisJCQkvKiBEZXRlcm1pbmUgaWYgdGhlIFN5c1RpY2sgY2xvY2sgaGFzIGFscmVhZHkgY291bnRlZCB0byB6ZXJvIGFuZAorCQkJYmVlbiBzZXQgYmFjayB0byB0aGUgY3VycmVudCByZWxvYWQgdmFsdWUgKHRoZSByZWxvYWQgYmFjayBiZWluZworCQkJY29ycmVjdCBmb3IgdGhlIGVudGlyZSBleHBlY3RlZCBpZGxlIHRpbWUpIG9yIGlmIHRoZSBTeXNUaWNrIGlzIHlldAorCQkJdG8gY291bnQgdG8gemVybyAoaW4gd2hpY2ggY2FzZSBhbiBpbnRlcnJ1cHQgb3RoZXIgdGhhbiB0aGUgU3lzVGljaworCQkJbXVzdCBoYXZlIGJyb3VnaHQgdGhlIHN5c3RlbSBvdXQgb2Ygc2xlZXAgbW9kZSkuICovCisJCQlpZiggKCBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHICYgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVCApICE9IDAgKQorCQkJeworCQkJCXVpbnQzMl90IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBpcyBhbHJlYWR5IHBlbmRpbmcsIGFuZCB0aGUgU3lzVGljayBjb3VudAorCQkJCXJlbG9hZGVkIHdpdGggdWxSZWxvYWRWYWx1ZS4gIFJlc2V0IHRoZQorCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgd2l0aCB3aGF0ZXZlciByZW1haW5zIG9mIHRoaXMgdGljaworCQkJCXBlcmlvZC4gKi8KKwkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICkgLSAoIHVsUmVsb2FkVmFsdWUgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHICk7CisKKwkJCQkvKiBEb24ndCBhbGxvdyBhIHRpbnkgdmFsdWUsIG9yIHZhbHVlcyB0aGF0IGhhdmUgc29tZWhvdworCQkJCXVuZGVyZmxvd2VkIGJlY2F1c2UgdGhlIHBvc3Qgc2xlZXAgaG9vayBkaWQgc29tZXRoaW5nCisJCQkJdGhhdCB0b29rIHRvbyBsb25nLiAqLworCQkJCWlmKCAoIHVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA8IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uICkgfHwgKCB1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPiB1bFRpbWVyQ291bnRzRm9yT25lVGljayApICkKKwkJCQl7CisJCQkJCXVsQ2FsY3VsYXRlZExvYWRWYWx1ZSA9ICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgLSAxVUwgKTsKKwkJCQl9CisKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogQXMgdGhlIHBlbmRpbmcgdGljayB3aWxsIGJlIHByb2Nlc3NlZCBhcyBzb29uIGFzIHRoaXMKKwkJCQlmdW5jdGlvbiBleGl0cywgdGhlIHRpY2sgdmFsdWUgbWFpbnRhaW5lZCBieSB0aGUgdGljayBpcyBzdGVwcGVkCisJCQkJZm9yd2FyZCBieSBvbmUgbGVzcyB0aGFuIHRoZSB0aW1lIHNwZW50IHdhaXRpbmcuICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0geEV4cGVjdGVkSWRsZVRpbWUgLSAxVUw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogU29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHRpY2sgaW50ZXJydXB0IGVuZGVkIHRoZSBzbGVlcC4KKwkJCQlXb3JrIG91dCBob3cgbG9uZyB0aGUgc2xlZXAgbGFzdGVkIHJvdW5kZWQgdG8gY29tcGxldGUgdGljaworCQkJCXBlcmlvZHMgKG5vdCB0aGUgdWxSZWxvYWQgdmFsdWUgd2hpY2ggYWNjb3VudGVkIGZvciBwYXJ0CisJCQkJdGlja3MpLiAqLworCQkJCXVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgPSAoIHhFeHBlY3RlZElkbGVUaW1lICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUc7CisKKwkJCQkvKiBIb3cgbWFueSBjb21wbGV0ZSB0aWNrIHBlcmlvZHMgcGFzc2VkIHdoaWxlIHRoZSBwcm9jZXNzb3IKKwkJCQl3YXMgd2FpdGluZz8gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzIC8gdWxUaW1lckNvdW50c0Zvck9uZVRpY2s7CisKKwkJCQkvKiBUaGUgcmVsb2FkIHZhbHVlIGlzIHNldCB0byB3aGF0ZXZlciBmcmFjdGlvbiBvZiBhIHNpbmdsZSB0aWNrCisJCQkJcGVyaW9kIHJlbWFpbnMuICovCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKyAxVUwgKSAqIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgLSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzOworCQkJfQorCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2sgc28gaXQgcnVucyBmcm9tIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcKKwkJCWFnYWluLCB0aGVuIHNldCBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHIGJhY2sgdG8gaXRzIHN0YW5kYXJkCisJCQl2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKwkJCXZUYXNrU3RlcFRpY2soIHVsQ29tcGxldGVUaWNrUGVyaW9kcyApOworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBFeGl0IHdpdGggaW50ZXJycHRzIGVuYWJsZWQuICovCisJCQlfX2VuYWJsZV9pcnEoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qICNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNldHVwIHRoZSBTeXNUaWNrIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMgYXQgdGhlIHJlcXVpcmVkCisgKiBmcmVxdWVuY3kuCisgKi8KKyNpZiggY29uZmlnT1ZFUlJJREVfREVGQVVMVF9USUNLX0NPTkZJR1VSQVRJT04gPT0gMCApCisKKwl2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCisJeworCQkvKiBDYWxjdWxhdGUgdGhlIGNvbnN0YW50cyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlIHRpY2sgaW50ZXJydXB0LiAqLworCQkjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorCQl7CisJCQl1bFRpbWVyQ291bnRzRm9yT25lVGljayA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApOworCQkJeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IHBvcnRNQVhfMjRfQklUX05VTUJFUiAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOworCQkJdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKKwkJfQorCQkjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworCQkvKiBTdG9wIGFuZCBjbGVhciB0aGUgU3lzVGljay4gKi8KKwkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9IDBVTDsKKwkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKworCQkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHBvcnROVklDX1NZU1RJQ0tfQ0xLX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfSU5UX0JJVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVCApOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ09WRVJSSURFX0RFRkFVTFRfVElDS19DT05GSUdVUkFUSU9OICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworX19hc20gdWludDMyX3QgdlBvcnRHZXRJUFNSKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKworCW1ycyByMCwgaXBzcgorCWJ4IHIxNAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisKKwl2b2lkIHZQb3J0VmFsaWRhdGVJbnRlcnJ1cHRQcmlvcml0eSggdm9pZCApCisJeworCXVpbnQzMl90IHVsQ3VycmVudEludGVycnVwdDsKKwl1aW50OF90IHVjQ3VycmVudFByaW9yaXR5OworCisJCS8qIE9idGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGludGVycnVwdC4gKi8KKwkJdWxDdXJyZW50SW50ZXJydXB0ID0gdlBvcnRHZXRJUFNSKCk7CisKKwkJLyogSXMgdGhlIGludGVycnVwdCBudW1iZXIgYSB1c2VyIGRlZmluZWQgaW50ZXJydXB0PyAqLworCQlpZiggdWxDdXJyZW50SW50ZXJydXB0ID49IHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKQorCQl7CisJCQkvKiBMb29rIHVwIHRoZSBpbnRlcnJ1cHQncyBwcmlvcml0eS4gKi8KKwkJCXVjQ3VycmVudFByaW9yaXR5ID0gcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVyc1sgdWxDdXJyZW50SW50ZXJydXB0IF07CisKKwkJCS8qIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZiBhIHNlcnZpY2Ugcm91dGluZSAoSVNSKSBmb3IKKwkJCWFuIGludGVycnVwdCB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYWJvdmUKKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBjYWxscyBhbiBJU1Igc2FmZSBGcmVlUlRPUyBBUEkKKwkJCWZ1bmN0aW9uLiAgSVNSIHNhZmUgRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBtdXN0ICpvbmx5KiBiZSBjYWxsZWQKKwkJCWZyb20gaW50ZXJydXB0cyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGF0IG9yIGJlbG93CisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuCisKKwkJCU51bWVyaWNhbGx5IGxvdyBpbnRlcnJ1cHQgcHJpb3JpdHkgbnVtYmVycyByZXByZXNlbnQgbG9naWNhbGx5IGhpZ2gKKwkJCWludGVycnVwdCBwcmlvcml0aWVzLCB0aGVyZWZvcmUgdGhlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQgbXVzdAorCQkJYmUgc2V0IHRvIGEgdmFsdWUgZXF1YWwgdG8gb3IgbnVtZXJpY2FsbHkgKmhpZ2hlciogdGhhbgorCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlJbnRlcnJ1cHRzIHRoYXQJdXNlIHRoZSBGcmVlUlRPUyBBUEkgbXVzdCBub3QgYmUgbGVmdCBhdCB0aGVpcgorCQkJZGVmYXVsdCBwcmlvcml0eSBvZgl6ZXJvIGFzIHRoYXQgaXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgcHJpb3JpdHksCisJCQl3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSwKKwkJCWFuZAl0aGVyZWZvcmUgYWxzbyBndWFyYW50ZWVkIHRvIGJlIGludmFsaWQuCisKKwkJCUZyZWVSVE9TIG1haW50YWlucyBzZXBhcmF0ZSB0aHJlYWQgYW5kIElTUiBBUEkgZnVuY3Rpb25zIHRvIGVuc3VyZQorCQkJaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQkJVGhlIGZvbGxvd2luZyBsaW5rcyBwcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uOgorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbAorCQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvRkFRSGVscC5odG1sICovCisJCQljb25maWdBU1NFUlQoIHVjQ3VycmVudFByaW9yaXR5ID49IHVjTWF4U3lzQ2FsbFByaW9yaXR5ICk7CisJCX0KKworCQkvKiBQcmlvcml0eSBncm91cGluZzogIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykgYWxsb3dzIHRoZSBiaXRzCisJCXRoYXQgZGVmaW5lIGVhY2ggaW50ZXJydXB0J3MgcHJpb3JpdHkgdG8gYmUgc3BsaXQgYmV0d2VlbiBiaXRzIHRoYXQKKwkJZGVmaW5lIHRoZSBpbnRlcnJ1cHQncyBwcmUtZW1wdGlvbiBwcmlvcml0eSBiaXRzIGFuZCBiaXRzIHRoYXQgZGVmaW5lCisJCXRoZSBpbnRlcnJ1cHQncyBzdWItcHJpb3JpdHkuICBGb3Igc2ltcGxpY2l0eSBhbGwgYml0cyBtdXN0IGJlIGRlZmluZWQKKwkJdG8gYmUgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cy4gIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZgorCQl0aGlzIGlzIG5vdCB0aGUgY2FzZSAoaWYgc29tZSBiaXRzIHJlcHJlc2VudCBhIHN1Yi1wcmlvcml0eSkuCisKKwkJSWYgdGhlIGFwcGxpY2F0aW9uIG9ubHkgdXNlcyBDTVNJUyBsaWJyYXJpZXMgZm9yIGludGVycnVwdAorCQljb25maWd1cmF0aW9uIHRoZW4gdGhlIGNvcnJlY3Qgc2V0dGluZyBjYW4gYmUgYWNoaWV2ZWQgb24gYWxsIENvcnRleC1NCisJCWRldmljZXMgYnkgY2FsbGluZyBOVklDX1NldFByaW9yaXR5R3JvdXBpbmcoIDAgKTsgYmVmb3JlIHN0YXJ0aW5nIHRoZQorCQlzY2hlZHVsZXIuICBOb3RlIGhvd2V2ZXIgdGhhdCBzb21lIHZlbmRvciBzcGVjaWZpYyBwZXJpcGhlcmFsIGxpYnJhcmllcworCQlhc3N1bWUgYSBub24temVybyBwcmlvcml0eSBncm91cCBzZXR0aW5nLCBpbiB3aGljaCBjYXNlcyB1c2luZyBhIHZhbHVlCisJCW9mIHplcm8gd2lsbCByZXN1bHQgaW4gdW5wcmVkaWN0YWJsZSBiZWhhdmlvdXIuICovCisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0QUlSQ1JfUkVHICYgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sgKSA8PSB1bE1heFBSSUdST1VQVmFsdWUgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTcvcjBwMS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTcvcjBwMS9wb3J0bWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTkzNGVjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNy9yMHAxL3BvcnRtYWNyby5oCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorCisvKiBDb25zdGFudHMgdXNlZCB3aXRoIG1lbW9yeSBiYXJyaWVyIGludHJpbnNpY3MuICovCisjZGVmaW5lIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUJCSggMTUgKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU2NoZWR1bGVyIHV0aWxpdGllcy4gKi8KKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCS8qIFNldCBhIFBlbmRTViB0byByZXF1ZXN0IGEgY29udGV4dCBzd2l0Y2guICovCQkJCQkJCQlcCisJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQgYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CVwKKwl3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCQkJCQkJXAorCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CQkJCQkJCQkJCQlcCisJX19pc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsJCQkJCQkJCQkJCVwKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMX1JFRwkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUX0JJVAkJKCAxVUwgPDwgMjhVTCApCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkgaWYoIHhTd2l0Y2hSZXF1aXJlZCAhPSBwZEZBTFNFICkgcG9ydFlJRUxEKCkKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuICovCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICk7CisKKyNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCXZQb3J0UmFpc2VCQVNFUFJJKCkKKyNkZWZpbmUgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCkJCQkJCXZQb3J0U2V0QkFTRVBSSSggMCApCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQkJCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCXVsUG9ydFJhaXNlQkFTRVBSSSgpCisjZGVmaW5lIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggeCApCXZQb3J0U2V0QkFTRVBSSSggeCApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaWNrbGVzcyBpZGxlL2xvdyBwb3dlciBmdW5jdGlvbmFsaXR5LiAqLworI2lmbmRlZiBwb3J0U1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQCisJZXh0ZXJuIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKTsKKwkjZGVmaW5lIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAoIHhFeHBlY3RlZElkbGVUaW1lICkgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIHhFeHBlY3RlZElkbGVUaW1lICkKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFBvcnQgc3BlY2lmaWMgb3B0aW1pc2F0aW9ucy4gKi8KKyNpZm5kZWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OCisJI2RlZmluZSBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gMQorI2VuZGlmCisKKyNpZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gPT0gMQorCisJLyogQ2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24uICovCisJI2lmKCBjb25maWdNQVhfUFJJT1JJVElFUyA+IDMyICkKKwkJI2Vycm9yIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiBjYW4gb25seSBiZSBzZXQgdG8gMSB3aGVuIGNvbmZpZ01BWF9QUklPUklUSUVTIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzMi4gIEl0IGlzIHZlcnkgcmFyZSB0aGF0IGEgc3lzdGVtIHJlcXVpcmVzIG1vcmUgdGhhbiAxMCB0byAxNSBkaWZmZXJlbmNlIHByaW9yaXRpZXMgYXMgdGFza3MgdGhhdCBzaGFyZSBhIHByaW9yaXR5IHdpbGwgdGltZSBzbGljZS4KKwkjZW5kaWYKKworCS8qIFN0b3JlL2NsZWFyIHRoZSByZWFkeSBwcmlvcml0aWVzIGluIGEgYml0IG1hcC4gKi8KKwkjZGVmaW5lIHBvcnRSRUNPUkRfUkVBRFlfUFJJT1JJVFkoIHV4UHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgKCB1eFJlYWR5UHJpb3JpdGllcyApIHw9ICggMVVMIDw8ICggdXhQcmlvcml0eSApICkKKwkjZGVmaW5lIHBvcnRSRVNFVF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhSZWFkeVByaW9yaXRpZXMgKSAoIHV4UmVhZHlQcmlvcml0aWVzICkgJj0gfiggMVVMIDw8ICggdXhQcmlvcml0eSApICkKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJI2RlZmluZSBwb3J0R0VUX0hJR0hFU1RfUFJJT1JJVFkoIHV4VG9wUHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgdXhUb3BQcmlvcml0eSA9ICggMzFVTCAtICggdWludDMyX3QgKSBfX2NseiggKCB1eFJlYWR5UHJpb3JpdGllcyApICkgKQorCisjZW5kaWYgLyogdGFza1JFQ09SRF9SRUFEWV9QUklPUklUWSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRhc2sgZnVuY3Rpb24gbWFjcm9zIGFzIGRlc2NyaWJlZCBvbiB0aGUgRnJlZVJUT1Mub3JnIFdFQiBzaXRlLiAgVGhlc2UgYXJlCitub3QgbmVjZXNzYXJ5IGZvciB0byB1c2UgdGhpcyBwb3J0LiAgVGhleSBhcmUgZGVmaW5lZCBzbyB0aGUgY29tbW9uIGRlbW8gZmlsZXMKKyh3aGljaCBidWlsZCB3aXRoIGFsbCB0aGUgcG9ydHMpIHdpbGwgYnVpbGQuICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgY29uZmlnQVNTRVJUCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKTsKKwkjZGVmaW5lIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSAJdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCkKKyNlbmRpZgorCisvKiBwb3J0Tk9QKCkgaXMgbm90IHJlcXVpcmVkIGJ5IHRoaXMgcG9ydC4gKi8KKyNkZWZpbmUgcG9ydE5PUCgpCisKKyNkZWZpbmUgcG9ydElOTElORSBfX2lubGluZQorCisjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKKwkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUgX19mb3JjZWlubGluZQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSB2b2lkIHZQb3J0U2V0QkFTRVBSSSggdWludDMyX3QgdWxCQVNFUFJJICkKK3sKKwlfX2FzbQorCXsKKwkJLyogQmFycmllciBpbnN0cnVjdGlvbnMgYXJlIG5vdCB1c2VkIGFzIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvCisJCWxvd2VyIHRoZSBCQVNFUFJJIHZhbHVlLiAqLworCQltc3IgYmFzZXByaSwgdWxCQVNFUFJJCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIHZvaWQgdlBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxOZXdCQVNFUFJJID0gY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZOworCisJX19hc20KKwl7CisJCS8qIFNldCBCQVNFUFJJIHRvIHRoZSBtYXggc3lzY2FsbCBwcmlvcml0eSB0byBlZmZlY3QgYSBjcml0aWNhbAorCQlzZWN0aW9uLiAqLworCQljcHNpZCBpCisJCW1zciBiYXNlcHJpLCB1bE5ld0JBU0VQUkkKKwkJZHNiCisJCWlzYgorCQljcHNpZSBpCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIHZvaWQgdlBvcnRDbGVhckJBU0VQUklGcm9tSVNSKCB2b2lkICkKK3sKKwlfX2FzbQorCXsKKwkJLyogU2V0IEJBU0VQUkkgdG8gMCBzbyBubyBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQuICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkKKwkJdXNlZCB0byBsb3dlciB0aGUgbWFzayBpbiBhbiBpbnRlcnJ1cHQsIHNvIG1lbW9yeSBiYXJyaWVycyBhcmUgbm90IAorCQl1c2VkLiAqLworCQltc3IgYmFzZXByaSwgIzAKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHBvcnRGT1JDRV9JTkxJTkUgdWludDMyX3QgdWxQb3J0UmFpc2VCQVNFUFJJKCB2b2lkICkKK3sKK3VpbnQzMl90IHVsUmV0dXJuLCB1bE5ld0JBU0VQUkkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFk7CisKKwlfX2FzbQorCXsKKwkJLyogU2V0IEJBU0VQUkkgdG8gdGhlIG1heCBzeXNjYWxsIHByaW9yaXR5IHRvIGVmZmVjdCBhIGNyaXRpY2FsCisJCXNlY3Rpb24uICovCisJCW1ycyB1bFJldHVybiwgYmFzZXByaQorCQljcHNpZCBpCisJCW1zciBiYXNlcHJpLCB1bE5ld0JBU0VQUkkKKwkJZHNiCisJCWlzYgorCQljcHNpZSBpCisJfQorCisJcmV0dXJuIHVsUmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIEJhc2VUeXBlX3QgeFBvcnRJc0luc2lkZUludGVycnVwdCggdm9pZCApCit7Cit1aW50MzJfdCB1bEN1cnJlbnRJbnRlcnJ1cHQ7CitCYXNlVHlwZV90IHhSZXR1cm47CisKKwkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCisJX19hc20KKwl7CisJCW1ycyB1bEN1cnJlbnRJbnRlcnJ1cHQsIGlwc3IKKwl9CisKKwlpZiggdWxDdXJyZW50SW50ZXJydXB0ID09IDAgKQorCXsKKwkJeFJldHVybiA9IHBkRkFMU0U7CisJfQorCWVsc2UKKwl7CisJCXhSZXR1cm4gPSBwZFRSVUU7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTdfTVBVL1JlYWRNZS50eHQgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003X01QVS9SZWFkTWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDRjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003X01QVS9SZWFkTWUudHh0CkBAIC0wLDAgKzEsMTggQEAKK1RoZXJlIGFyZSB0d28gb3B0aW9ucyBmb3IgcnVubmluZyBGcmVlUlRPUyBvbiBBUk0gQ29ydGV4LU03IG1pY3JvY29udHJvbGxlcnMuCitUaGUgYmVzdCBvcHRpb24gZGVwZW5kcyBvbiB0aGUgcmV2aXNpb24gb2YgdGhlIEFSTSBDb3J0ZXgtTTcgY29yZSBpbiB1c2UuICBUaGUKK3JldmlzaW9uIGlzIHNwZWNpZmllZCBieSBhbiAncicgbnVtYmVyLCBhbmQgYSAncCcgbnVtYmVyLCBzbyB3aWxsIGxvb2sgc29tZXRoaW5nCitsaWtlICdyMHAxJy4gIENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbWljcm9jb250cm9sbGVyIGluIHVzZSB0byBmaW5kIHRoZSAKK3JldmlzaW9uIG9mIHRoZSBDb3J0ZXgtTTcgY29yZSB1c2VkIGluIHRoYXQgbWljcm9jb250cm9sbGVyLiAgSWYgaW4gZG91YnQsIHVzZSAKK3RoZSBGcmVlUlRPUyBwb3J0IHByb3ZpZGVkIHNwZWNpZmljYWxseSBmb3IgcjBwMSByZXZpc2lvbnMsIGFzIHRoYXQgY2FuIGJlIHVzZWQKK3dpdGggYWxsIGNvcmUgcmV2aXNpb25zLgorCitUaGUgZmlyc3Qgb3B0aW9uIGlzIHRvIHVzZSB0aGUgQVJNIENvcnRleC1NNEYgcG9ydCwgYW5kIHRoZSBzZWNvbmQgb3B0aW9uIGlzIHRvCit1c2UgdGhlIENvcnRleC1NNyByMHAxIHBvcnQgLSB0aGUgbGF0dGVyIGNvbnRhaW5pbmcgYSBtaW5vciBlcnJhdGEgd29ya2Fyb3VuZC4KKworSWYgdGhlIHJldmlzaW9uIG9mIHRoZSBBUk0gQ29ydGV4LU03IGNvcmUgaXMgbm90IHIwcDEgdGhlbiBlaXRoZXIgb3B0aW9uIGNhbiBiZQordXNlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgRnJlZVJUT1MgQVJNIENvcnRleC1NNEYgcG9ydCBsb2NhdGVkIGluIAordGhlIC9GcmVlUlRPUy9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ000RiBkaXJlY3RvcnkuCisKK0lmIHRoZSByZXZpc2lvbiBvZiB0aGUgQVJNIENvcnRleC1NNyBjb3JlIGlzIHIwcDEgdGhlbiB1c2UgdGhlIEZyZWVSVE9TIEFSTQorQ29ydGV4LU03IHIwcDEgcG9ydCBsb2NhdGVkIGluIHRoZSAvRnJlZVJUT1MvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNN19NUFUvcjBwMQorZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE3MjljCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKQEAgLTAsMCArMSw5OTkgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiBwb3J0YWJsZS5oIGZvciB0aGUgQVJNIENNNEYgcG9ydC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIERlZmluaW5nIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHByZXZlbnRzIHRhc2suaCBmcm9tIHJlZGVmaW5pbmcKK2FsbCB0aGUgQVBJIGZ1bmN0aW9ucyB0byB1c2UgdGhlIE1QVSB3cmFwcGVycy4gIFRoYXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuCit0YXNrLmggaXMgaW5jbHVkZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKyNpZm5kZWYgX19UQVJHRVRfRlBVX1ZGUAorCSNlcnJvciBUaGlzIHBvcnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IG9wdGlvbnMgYXJlIGNvbmZpZ3VyZWQgdG8gZW5hYmxlIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQuCisjZW5kaWYKKworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgdGhlIE5WSUMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHCSAgICAoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyX1JFRwkJCQkJKCAqCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMWMgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU19DVFJMX1NUQVRFX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDI0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19NRU1fRkFVTFRfRU5BQkxFCQkJCSggMVVMIDw8IDE2VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoZSBNUFUuICovCisjZGVmaW5lIHBvcnRNUFVfVFlQRV9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDkwICkgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5QyApICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkQTAgKSApCisjZGVmaW5lIHBvcnRNUFVfQ1RSTF9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk0ICkgKQorI2RlZmluZSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUJCQkJKCA4VUwgPDwgOFVMICkgLyogOCByZWdpb25zLCB1bmlmaWVkLiAqLworI2RlZmluZSBwb3J0TVBVX0VOQUJMRQkJCQkJCQkoIDB4MDFVTCApCisjZGVmaW5lIHBvcnRNUFVfQkFDS0dST1VORF9FTkFCTEUJCQkJKCAxVUwgPDwgMlVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfRVhFQ1VUSU9OX1NUQVJUX0FERFJFU1MJKCAwVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9WQUxJRAkJCQkJKCAweDEwVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FTkFCTEUJCQkJCSggMHgwMVVMICkKKyNkZWZpbmUgcG9ydFBFUklQSEVSQUxTX1NUQVJUX0FERFJFU1MJCQkweDQwMDAwMDAwVUwKKyNkZWZpbmUgcG9ydFBFUklQSEVSQUxTX0VORF9BRERSRVNTCQkJCTB4NUZGRkZGRkZVTAorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoZSBTeXNUaWNrLiAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMSwkJCQkJKCAweDAwMDAwMDA0VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0lOVAkJCQkJKCAweDAwMDAwMDAyVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRQkJCQkJKCAweDAwMDAwMDAxVUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUcJCSggMVVMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZfUFJJCQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1ZDX1BSSQkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIC0gMVVMICkgPDwgMjRVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBWRlAuICovCisjZGVmaW5lIHBvcnRGUENDUgkJCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0VUwgKSAvKiBGbG9hdGluZyBwb2ludCBjb250ZXh0IGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUwkJCQkoIDB4M1VMIDw8IDMwVUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJCQkJKCAweDAxMDAwMDAwVUwgKQorI2RlZmluZSBwb3J0SU5JVElBTF9FWEVDX1JFVFVSTgkJCQkJKCAweGZmZmZmZmZkVUwgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRAkJKCAweDAzICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9QUklWSUxFR0VECQkoIDB4MDIgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFuIGludGVycnVwdCBwcmlvcml0eS4gKi8KKyNkZWZpbmUgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUgkJKCAxNiApCisjZGVmaW5lIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgCSggMHhFMDAwRTNGMCApCisjZGVmaW5lIHBvcnRBSVJDUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBFRDBDICkgKQorI2RlZmluZSBwb3J0TUFYXzhfQklUX1ZBTFVFCQkJCQkoICggdWludDhfdCApIDB4ZmYgKQorI2RlZmluZSBwb3J0VE9QX0JJVF9PRl9CWVRFCQkJCQkoICggdWludDhfdCApIDB4ODAgKQorI2RlZmluZSBwb3J0TUFYX1BSSUdST1VQX0JJVFMJCQkJKCAoIHVpbnQ4X3QgKSA3ICkKKyNkZWZpbmUgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sJCQkJKCAweDA3VUwgPDwgOFVMICkKKyNkZWZpbmUgcG9ydFBSSUdST1VQX1NISUZUCQkJCQkoIDhVTCApCisKKy8qIE9mZnNldHMgaW4gdGhlIHN0YWNrIHRvIHRoZSBwYXJhbWV0ZXJzIHdoZW4gaW5zaWRlIHRoZSBTVkMgaGFuZGxlci4gKi8KKyNkZWZpbmUgcG9ydE9GRlNFVF9UT19QQwkJCQkJCSggNiApCisKKy8qIFRoZSBzeXN0aWNrIGlzIGEgMjQtYml0IGNvdW50ZXIuICovCisjZGVmaW5lIHBvcnRNQVhfMjRfQklUX05VTUJFUgkJKCAweGZmZmZmZlVMICkKKworLyogQSBmaWRkbGUgZmFjdG9yIHRvIGVzdGltYXRlIHRoZSBudW1iZXIgb2YgU3lzVGljayBjb3VudHMgdGhhdCB3b3VsZCBoYXZlCitvY2N1cnJlZCB3aGlsZSB0aGUgU3lzVGljayBjb3VudGVyIGlzIHN0b3BwZWQgZHVyaW5nIHRpY2tsZXNzIGlkbGUKK2NhbGN1bGF0aW9ucy4gKi8KKyNkZWZpbmUgcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SCSggNDVVTCApCisKKy8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCitoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KKyNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQorCisvKiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZwordmFyaWFibGUuICBOb3RlIHRoaXMgaXMgbm90IHNhdmVkIGFzIHBhcnQgb2YgdGhlIHRhc2sgY29udGV4dCBhcyBjb250ZXh0Citzd2l0Y2hlcyBjYW4gb25seSBvY2N1ciB3aGVuIHV4Q3JpdGljYWxOZXN0aW5nIGlzIHplcm8uICovCitzdGF0aWMgVUJhc2VUeXBlX3QgdXhDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhOworCisvKgorICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuICBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcworICogZmlsZSBpcyB3ZWFrIHRvIGFsbG93IGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gY2hhbmdlIHRoZSB0aW1lciB1c2VkIHRvCisgKiBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CisKKy8qCisgKiBDb25maWd1cmUgYSBudW1iZXIgb2Ygc3RhbmRhcmQgTVBVIHJlZ2lvbnMgdGhhdCBhcmUgdXNlZCBieSBhbGwgdGFza3MuCisgKi8KK3N0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFN0YXJ0IGZpcnN0IHRhc2sgaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgdGVzdGVkIGluIGlzb2xhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcHJ2U3RhcnRGaXJzdFRhc2soIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogUmV0dXJuIHRoZSBzbWFsbGVzdCBNUFUgcmVnaW9uIHNpemUgdGhhdCBhIGdpdmVuIG51bWJlciBvZiBieXRlcyB3aWxsIGZpdAorICogaW50by4gIFRoZSByZWdpb24gc2l6ZSBpcyByZXR1cm5lZCBhcyB0aGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgcHJvZ3JhbW1lZAorICogaW50byB0aGUgcmVnaW9uIGF0dHJpYnV0ZSByZWdpc3RlciBmb3IgdGhhdCByZWdpb24uCisgKi8KK3N0YXRpYyB1aW50MzJfdCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggdWludDMyX3QgdWxBY3R1YWxTaXplSW5CeXRlcyApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBDaGVja3MgdG8gc2VlIGlmIGJlaW5nIGNhbGxlZCBmcm9tIHRoZSBjb250ZXh0IG9mIGFuIHVucHJpdmlsZWdlZCB0YXNrLCBhbmQKKyAqIGlmIHNvIHJhaXNlcyB0aGUgcHJpdmlsZWdlIGxldmVsIGFuZCByZXR1cm5zIGZhbHNlIC0gb3RoZXJ3aXNlIGRvZXMgbm90aGluZworICogb3RoZXIgdGhhbiByZXR1cm4gdHJ1ZS4KKyAqLworQmFzZVR5cGVfdCB4UG9ydFJhaXNlUHJpdmlsZWdlKCB2b2lkICk7CisKKy8qCisgKiBTdGFuZGFyZCBGcmVlUlRPUyBleGNlcHRpb24gaGFuZGxlcnMuCisgKi8KK3ZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047Cit2b2lkIHZQb3J0U1ZDSGFuZGxlciggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBTdGFydHMgdGhlIHNjaGVkdWxlciBieSByZXN0b3JpbmcgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgdG8gcnVuLgorICovCitzdGF0aWMgdm9pZCBwcnZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIEMgcG9ydGlvbiBvZiB0aGUgU1ZDIGhhbmRsZXIuICBUaGUgU1ZDIGhhbmRsZXIgaXMgc3BsaXQgYmV0d2VlbiBhbiBhc20gZW50cnkKKyAqIGFuZCBhIEMgd3JhcHBlciBmb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcgYW5kIG1haW50ZW5hbmNlLgorICovCit2b2lkIHBydlNWQ0hhbmRsZXIoIHVpbnQzMl90ICpwdWxSZWdpc3RlcnMgKSBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIEZ1bmN0aW9uIHRvIGVuYWJsZSB0aGUgVkZQLgorICovCitzdGF0aWMgdm9pZCB2UG9ydEVuYWJsZVZGUCggdm9pZCApOworCisvKgorICogVXRpbGl0eSBmdW5jdGlvbi4KKyAqLworc3RhdGljIHVpbnQzMl90IHBydlBvcnRHZXRJUFNSKCB2b2lkICk7CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIFN5c1RpY2sgaW5jcmVtZW50cyB0aGF0IG1ha2UgdXAgb25lIHRpY2sgcGVyaW9kLgorICovCisjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCXN0YXRpYyB1aW50MzJfdCB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9IDA7CisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKworLyoKKyAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrIHBlcmlvZHMgdGhhdCBjYW4gYmUgc3VwcHJlc3NlZCBpcyBsaW1pdGVkIGJ5IHRoZQorICogMjQgYml0IHJlc29sdXRpb24gb2YgdGhlIFN5c1RpY2sgdGltZXIuCisgKi8KKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisJc3RhdGljIHVpbnQzMl90IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSAwOworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisKKy8qCisgKiBDb21wZW5zYXRlIGZvciB0aGUgQ1BVIGN5Y2xlcyB0aGF0IHBhc3Mgd2hpbGUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCAobG93CisgKiBwb3dlciBmdW5jdGlvbmFsaXR5IG9ubHkuCisgKi8KKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisJc3RhdGljIHVpbnQzMl90IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCQorLyoKKyAqIFVzZWQgYnkgdGhlIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSBtYWNybyB0byBlbnN1cmUKKyAqIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgYXJlIG5vdCBjYWxsZWQgZnJvbSBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkCisgKiBhIHByaW9yaXR5IGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKyAqLworI2lmICggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJIHN0YXRpYyB1aW50OF90IHVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gMDsKKwkgc3RhdGljIHVpbnQzMl90IHVsTWF4UFJJR1JPVVBWYWx1ZSA9IDA7CisJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggY29uc3QgdWludDhfdCAqICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK1N0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzLCBCYXNlVHlwZV90IHhSdW5Qcml2aWxlZ2VkICkKK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJaW50ZXJydXB0LiAqLworCXB4VG9wT2ZTdGFjay0tOyAvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQgb2YgaW50ZXJydXB0cy4gKi8KKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJLyogeFBTUiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoICggU3RhY2tUeXBlX3QgKSBweENvZGUgKSAmIHBvcnRTVEFSVF9BRERSRVNTX01BU0s7CS8qIFBDICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9IDA7CS8qIExSICovCisJcHhUb3BPZlN0YWNrIC09IDU7CS8qIFIxMiwgUjMsIFIyIGFuZCBSMS4gKi8KKwkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJLyogUjAgKi8KKworCS8qIEEgc2F2ZSBtZXRob2QgaXMgYmVpbmcgdXNlZCB0aGF0IHJlcXVpcmVzIGVhY2ggdGFzayB0byBtYWludGFpbiBpdHMKKwlvd24gZXhlYyByZXR1cm4gdmFsdWUuICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0VYRUNfUkVUVVJOOworCisJcHhUb3BPZlN0YWNrIC09IDk7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLworCisJaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCisJeworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9QUklWSUxFR0VEOworCX0KKwllbHNlCisJeworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9VTlBSSVZJTEVHRUQ7CisJfQorCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHBydlNWQ0hhbmRsZXIoIHVpbnQzMl90ICpwdWxQYXJhbSApCit7Cit1aW50OF90IHVjU1ZDTnVtYmVyOwordWludDMyX3QgdWxSZWc7CisKKwkvKiBUaGUgc3RhY2sgY29udGFpbnM6IHIwLCByMSwgcjIsIHIzLCByMTIsIHIxNCwgdGhlIHJldHVybiBhZGRyZXNzIGFuZAorCXhQU1IuICBUaGUgZmlyc3QgYXJndW1lbnQgKHIwKSBpcyBwdWxQYXJhbVsgMCBdLiAqLworCXVjU1ZDTnVtYmVyID0gKCAoIHVpbnQ4X3QgKiApIHB1bFBhcmFtWyBwb3J0T0ZGU0VUX1RPX1BDIF0gKVsgLTIgXTsKKwlzd2l0Y2goIHVjU1ZDTnVtYmVyICkKKwl7CisJCWNhc2UgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIJOglwb3J0TlZJQ19TWVNQUkkxX1JFRyB8PSBwb3J0TlZJQ19TVkNfUFJJOworCQkJCQkJCQkJCQlwcnZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCk7CisJCQkJCQkJCQkJCWJyZWFrOworCisJCWNhc2UgcG9ydFNWQ19ZSUVMRAkJCQk6CXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCQkJCQkJCQkJCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQKKwkJCQkJCQkJCQkJYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CisJCQkJCQkJCQkJCXdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlCisJCQkJCQkJCQkJCWFyY2hpdGVjdHVyZS4gKi8KKwkJCQkJCQkJCQkJX19hc20gdm9sYXRpbGUoICJkc2IiICk7CisJCQkJCQkJCQkJCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworCisJCQkJCQkJCQkJCWJyZWFrOworCisJCWNhc2UgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UJOglfX2FzbQorCQkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCQltcnMgdWxSZWcsIGNvbnRyb2wJLyogT2J0YWluIGN1cnJlbnQgY29udHJvbCB2YWx1ZS4gKi8KKwkJCQkJCQkJCQkJCWJpYyB1bFJlZywgIzEJCS8qIFNldCBwcml2aWxlZ2UgYml0LiAqLworCQkJCQkJCQkJCQkJbXNyIGNvbnRyb2wsIHVsUmVnCS8qIFdyaXRlIGJhY2sgbmV3IGNvbnRyb2wgdmFsdWUuICovCisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJYnJlYWs7CisKKwkJZGVmYXVsdAkJCQkJCQk6CS8qIFVua25vd24gU1ZDIGNhbGwuICovCisJCQkJCQkJCQkJCWJyZWFrOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSB2b2lkIHZQb3J0U1ZDSGFuZGxlciggdm9pZCApCit7CisJZXh0ZXJuIHBydlNWQ0hhbmRsZXIKKwkJCisJUFJFU0VSVkU4CisKKwkvKiBBc3N1bWVzIHBzcCB3YXMgaW4gdXNlLiAqLworCSNpZm5kZWYgVVNFX1BST0NFU1NfU1RBQ0sJLyogQ29kZSBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGlmIGEgbWFpbigpIGlzIHVzaW5nIHRoZSBwcm9jZXNzIHN0YWNrLiAqLworCQl0c3QgbHIsICM0CisJCWl0ZSBlcQorCQltcnNlcSByMCwgbXNwCisJCW1yc25lIHIwLCBwc3AKKwkjZWxzZQorCQltcnMgcjAsIHBzcAorCSNlbmRpZgorCQliIHBydlNWQ0hhbmRsZXIKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSB2b2lkIHBydlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soIHZvaWQgKQoreworCVBSRVNFUlZFOAorCisJbGRyIHIwLCA9MHhFMDAwRUQwOAkJCQkvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJbGRyIHIwLCBbcjBdCisJbGRyIHIwLCBbcjBdCisJbXNyIG1zcCwgcjAJCQkJCQkvKiBTZXQgdGhlIG1zcCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJbGRyCXIzLCA9cHhDdXJyZW50VENCCQkJLyogUmVzdG9yZSB0aGUgY29udGV4dC4gKi8KKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0JCQkJCS8qIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCWFkZCByMSwgcjEsICM0CQkJCQkvKiBNb3ZlIG9udG8gdGhlIHNlY29uZCBpdGVtIGluIHRoZSBUQ0IuLi4gKi8KKwlsZHIgcjIsID0weGUwMDBlZDljCQkJCS8qIFJlZ2lvbiBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIuICovCisJbGRtaWEgcjEhLCB7cjQtcjExfQkJCQkvKiBSZWFkIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCXN0bWlhIHIyISwge3I0LXIxMX0JCQkJLyogV3JpdGUgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJbGRtaWEgcjAhLCB7cjMtcjExLCByMTR9CS8qIFBvcCB0aGUgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNhdmVkIG9uIGV4Y2VwdGlvbiBlbnRyeS4gKi8KKwltc3IgY29udHJvbCwgcjMKKwltc3IgcHNwLCByMAkJCQkJCS8qIFJlc3RvcmUgdGhlIHRhc2sgc3RhY2sgcG9pbnRlci4gKi8KKwltb3YgcjAsICMwCisJbXNyCWJhc2VwcmksIHIwCisJYnggcjE0CisJbm9wCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApCit7CisJLyogY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLiAgU2VlCisJaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCAqLworCWNvbmZpZ0FTU0VSVCggKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSApOworCisJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwl7CisJCXZvbGF0aWxlIHVpbnQzMl90IHVsT3JpZ2luYWxQcmlvcml0eTsKKwkJdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHB1Y0ZpcnN0VXNlclByaW9yaXR5UmVnaXN0ZXIgPSAoIHZvbGF0aWxlIHVpbnQ4X3QgKiApICggcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNiArIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKTsKKwkJdm9sYXRpbGUgdWludDhfdCB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHByaW9yaXR5IGZyb20gd2hpY2ggSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCWZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiAgSVNSIHNhZmUgZnVuY3Rpb25zIGFyZSB0aG9zZSB0aGF0IGVuZCBpbgorCQkiRnJvbUlTUiIuICBGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0bworCQllbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworCQlTYXZlIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkgdmFsdWUgdGhhdCBpcyBhYm91dCB0byBiZSBjbG9iYmVyZWQuICovCisJCXVsT3JpZ2luYWxQcmlvcml0eSA9ICpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyOworCisJCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHByaW9yaXR5IGJpdHMgYXZhaWxhYmxlLiAgRmlyc3Qgd3JpdGUgdG8gYWxsCisJCXBvc3NpYmxlIGJpdHMuICovCisJCSpwdWNGaXJzdFVzZXJQcmlvcml0eVJlZ2lzdGVyID0gcG9ydE1BWF84X0JJVF9WQUxVRTsKKworCQkvKiBSZWFkIHRoZSB2YWx1ZSBiYWNrIHRvIHNlZSBob3cgbWFueSBiaXRzIHN0dWNrLiAqLworCQl1Y01heFByaW9yaXR5VmFsdWUgPSAqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlcjsKKworCQkvKiBVc2UgdGhlIHNhbWUgbWFzayBvbiB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4gKi8KKwkJdWNNYXhTeXNDYWxsUHJpb3JpdHkgPSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgJiB1Y01heFByaW9yaXR5VmFsdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgZm9yIHRoZSBudW1iZXIKKwkJb2YgYml0cyByZWFkIGJhY2suICovCisJCXVsTWF4UFJJR1JPVVBWYWx1ZSA9IHBvcnRNQVhfUFJJR1JPVVBfQklUUzsKKwkJd2hpbGUoICggdWNNYXhQcmlvcml0eVZhbHVlICYgcG9ydFRPUF9CSVRfT0ZfQllURSApID09IHBvcnRUT1BfQklUX09GX0JZVEUgKQorCQl7CisJCQl1bE1heFBSSUdST1VQVmFsdWUtLTsKKwkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKKwkJfQorCisJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCisJCXJlZ2lzdGVyLiAqLworCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKKwkJdWxNYXhQUklHUk9VUFZhbHVlICY9IHBvcnRQUklPUklUWV9HUk9VUF9NQVNLOworCisJCS8qIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBpbnRlcnJ1cHQgcHJpb3JpdHkgcmVnaXN0ZXIgdG8gaXRzIG9yaWdpbmFsCisJCXZhbHVlLiAqLworCQkqcHVjRmlyc3RVc2VyUHJpb3JpdHlSZWdpc3RlciA9IHVsT3JpZ2luYWxQcmlvcml0eTsKKwl9CisJI2VuZGlmIC8qIGNvbmlmZ0FTU0VSVF9ERUZJTkVEICovCisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUga2VybmVsLCBhbmQgdGhlIFNWQworCWhhbmRsZXIgaGlnaGVyIHByaW9yaXR5IHNvIGl0IGNhbiBiZSB1c2VkIHRvIGV4aXQgYSBjcml0aWNhbCBzZWN0aW9uICh3aGVyZQorCWxvd2VyIHByaW9yaXRpZXMgYXJlIG1hc2tlZCkuICovCisJcG9ydE5WSUNfU1lTUFJJMl9SRUcgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCS8qIENvbmZpZ3VyZSB0aGUgcmVnaW9ucyBpbiB0aGUgTVBVIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgdGFza3MuICovCisJcHJ2U2V0dXBNUFUoKTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCWhlcmUgYWxyZWFkeS4gKi8KKwl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXV4Q3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIEVuc3VyZSB0aGUgVkZQIGlzIGVuYWJsZWQgLSBpdCBzaG91bGQgYmUgYW55d2F5LiAqLworCXZQb3J0RW5hYmxlVkZQKCk7CisKKwkvKiBMYXp5IHNhdmUgYWx3YXlzLiAqLworCSooIHBvcnRGUENDUiApIHw9IHBvcnRBU1BFTl9BTkRfTFNQRU5fQklUUzsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCXBydlN0YXJ0Rmlyc3RUYXNrKCk7CisKKwkvKiBTaG91bGQgbm90IGdldCBoZXJlISAqLworCXJldHVybiAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgcHJ2U3RhcnRGaXJzdFRhc2soIHZvaWQgKQoreworCVBSRVNFUlZFOAorCQorCWxkciByMCwgPTB4RTAwMEVEMDgJLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCWxkciByMCwgW3IwXQorCWxkciByMCwgW3IwXQorCW1zciBtc3AsIHIwCQkJLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCWNwc2llIGkJCQkJLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJY3BzaWUgZgorCWRzYgorCWlzYgorCXN2YyBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgkvKiBTeXN0ZW0gY2FsbCB0byBzdGFydCBmaXJzdCB0YXNrLiAqLworCW5vcAorCW5vcAorfQorCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXV4Q3JpdGljYWxOZXN0aW5nKys7CisKKwl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkKK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJY29uZmlnQVNTRVJUKCB1eENyaXRpY2FsTmVzdGluZyApOworCXV4Q3JpdGljYWxOZXN0aW5nLS07CisJaWYoIHV4Q3JpdGljYWxOZXN0aW5nID09IDAgKQorCXsKKwkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisJfQorCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgeFBvcnRQZW5kU1ZIYW5kbGVyKCB2b2lkICkKK3sKKwlleHRlcm4gdXhDcml0aWNhbE5lc3Rpbmc7CisJZXh0ZXJuIHB4Q3VycmVudFRDQjsKKwlleHRlcm4gdlRhc2tTd2l0Y2hDb250ZXh0OworCisJUFJFU0VSVkU4CisKKwltcnMgcjAsIHBzcAorCisJbGRyCXIzLCA9cHhDdXJyZW50VENCCQkJLyogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBUQ0IuICovCisJbGRyCXIyLCBbcjNdCisKKwl0c3QgcjE0LCAjMHgxMAkJCQkJLyogSXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHB1c2ggaGlnaCB2ZnAgcmVnaXN0ZXJzLiAqLworCWl0IGVxCisJdnN0bWRiZXEgcjAhLCB7czE2LXMzMX0KKworCW1ycyByMSwgY29udHJvbAorCXN0bWRiIHIwISwge3IxLCByNC1yMTEsIHIxNH0JLyogU2F2ZSB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycy4gKi8KKwlzdHIgcjAsIFtyMl0JCQkJCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW50byB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBUQ0IuICovCisKKwlzdG1kYiBzcCEsIHtyM30KKwltb3YgcjAsICNjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkKKyAgY3BzaWQgaQorCW1zciBiYXNlcHJpLCByMAorCWRzYgorCWlzYgorICBjcHNpZSBpCisJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CisJbW92IHIwLCAjMAorCW1zciBiYXNlcHJpLCByMAorCWxkbWlhIHNwISwge3IzfQorCQkJCQkJCQkJLyogUmVzdG9yZSB0aGUgY29udGV4dC4gKi8KKwlsZHIgcjEsIFtyM10KKwlsZHIgcjAsIFtyMV0JCQkJCS8qIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCWFkZCByMSwgcjEsICM0CQkJCQkvKiBNb3ZlIG9udG8gdGhlIHNlY29uZCBpdGVtIGluIHRoZSBUQ0IuLi4gKi8KKwlsZHIgcjIsID0weGUwMDBlZDljCQkJCS8qIFJlZ2lvbiBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIuICovCisJbGRtaWEgcjEhLCB7cjQtcjExfQkJCQkvKiBSZWFkIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCXN0bWlhIHIyISwge3I0LXIxMX0JCQkJLyogV3JpdGUgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJbGRtaWEgcjAhLCB7cjMtcjExLCByMTR9CQkvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCBvbiBleGNlcHRpb24gZW50cnkuICovCisJbXNyIGNvbnRyb2wsIHIzCisKKwl0c3QgcjE0LCAjMHgxMAkJCQkJLyogSXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHBvcCB0aGUgaGlnaCB2ZnAgcmVnaXN0ZXJzIHRvby4gKi8KKwlpdCBlcQorCXZsZG1pYWVxIHIwISwge3MxNi1zMzF9CisKKwltc3IgcHNwLCByMAorCWJ4IHIxNAorCW5vcAorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApCit7Cit1aW50MzJfdCB1bER1bW15OworCisJdWxEdW1teSA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCS8qIEluY3JlbWVudCB0aGUgUlRPUyB0aWNrLiAqLworCQlpZiggeFRhc2tJbmNyZW1lbnRUaWNrKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIFBlbmQgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkJCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCX0KKwl9CisJcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCB1bER1bW15ICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCisJX193ZWFrIHZvaWQgdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAoIFRpY2tUeXBlX3QgeEV4cGVjdGVkSWRsZVRpbWUgKQorCXsKKwl1aW50MzJfdCB1bFJlbG9hZFZhbHVlLCB1bENvbXBsZXRlVGlja1BlcmlvZHMsIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMsIHVsU3lzVGlja0NUUkw7CisJVGlja1R5cGVfdCB4TW9kaWZpYWJsZUlkbGVUaW1lOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgU3lzVGljayByZWxvYWQgdmFsdWUgZG9lcyBub3Qgb3ZlcmZsb3cgdGhlIGNvdW50ZXIuICovCisJCWlmKCB4RXhwZWN0ZWRJZGxlVGltZSA+IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgKQorCQl7CisJCQl4RXhwZWN0ZWRJZGxlVGltZSA9IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3M7CisJCX0KKworCQkvKiBTdG9wIHRoZSBTeXNUaWNrIG1vbWVudGFyaWx5LiAgVGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IKKwkJaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiBiZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwKKwkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCisJCWtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgdGltZS4gKi8KKwkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyAmPSB+cG9ydE5WSUNfU1lTVElDS19FTkFCTEU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSByZWxvYWQgdmFsdWUgcmVxdWlyZWQgdG8gd2FpdCB4RXhwZWN0ZWRJZGxlVGltZQorCQl0aWNrIHBlcmlvZHMuICAtMSBpcyB1c2VkIGJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgZXhlY3V0ZSBwYXJ0IHdheQorCQl0aHJvdWdoIG9uZSBvZiB0aGUgdGljayBwZXJpb2RzLiAqLworCQl1bFJlbG9hZFZhbHVlID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyArICggdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKiAoIHhFeHBlY3RlZElkbGVUaW1lIC0gMVVMICkgKTsKKwkJaWYoIHVsUmVsb2FkVmFsdWUgPiB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApCisJCXsKKwkJCXVsUmVsb2FkVmFsdWUgLT0gdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb247CisJCX0KKworCQkvKiBFbnRlciBhIGNyaXRpY2FsIHNlY3Rpb24gYnV0IGRvbid0IHVzZSB0aGUgdGFza0VOVEVSX0NSSVRJQ0FMKCkKKwkJbWV0aG9kIGFzIHRoYXQgd2lsbCBtYXNrIGludGVycnVwdHMgdGhhdCBzaG91bGQgZXhpdCBzbGVlcCBtb2RlLiAqLworCQlfX2Rpc2FibGVfaXJxKCk7CisJCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisKKwkJLyogSWYgYSBjb250ZXh0IHN3aXRjaCBpcyBwZW5kaW5nIG9yIGEgdGFzayBpcyB3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGVyCisJCXRvIGJlIHVuc3VzcGVuZGVkIHRoZW4gYWJhbmRvbiB0aGUgbG93IHBvd2VyIGVudHJ5LiAqLworCQlpZiggZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkgPT0gZUFib3J0U2xlZXAgKQorCQl7CisJCQkvKiBSZXN0YXJ0IGZyb20gd2hhdGV2ZXIgaXMgbGVmdCBpbiB0aGUgY291bnQgcmVnaXN0ZXIgdG8gY29tcGxldGUKKwkJCXRoaXMgdGljayBwZXJpb2QuICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRzsKKworCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKworCQkJLyogUmVzZXQgdGhlIHJlbG9hZCByZWdpc3RlciB0byB0aGUgdmFsdWUgcmVxdWlyZWQgZm9yIG5vcm1hbCB0aWNrCisJCQlwZXJpb2RzLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAtIHNlZSBjb21tZW50cyBhYm92ZSBfX2Rpc2FibGVfaXJxKCkgY2FsbAorCQkJYWJvdmUuICovCisJCQlfX2VuYWJsZV9pcnEoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFNldCB0aGUgbmV3IHJlbG9hZCB2YWx1ZS4gKi8KKwkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFJlbG9hZFZhbHVlOworCisJCQkvKiBDbGVhciB0aGUgU3lzVGljayBjb3VudCBmbGFnIGFuZCBzZXQgdGhlIGNvdW50IHZhbHVlIGJhY2sgdG8KKwkJCXplcm8uICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworCisJCQkvKiBTbGVlcCB1bnRpbCBzb21ldGhpbmcgaGFwcGVucy4gIGNvbmZpZ1BSRV9TTEVFUF9QUk9DRVNTSU5HKCkgY2FuCisJCQlzZXQgaXRzIHBhcmFtZXRlciB0byAwIHRvIGluZGljYXRlIHRoYXQgaXRzIGltcGxlbWVudGF0aW9uIGNvbnRhaW5zCisJCQlpdHMgb3duIHdhaXQgZm9yIGludGVycnVwdCBvciB3YWl0IGZvciBldmVudCBpbnN0cnVjdGlvbiwgYW5kIHNvIHdmaQorCQkJc2hvdWxkIG5vdCBiZSBleGVjdXRlZCBhZ2Fpbi4gIEhvd2V2ZXIsIHRoZSBvcmlnaW5hbCBleHBlY3RlZCBpZGxlCisJCQl0aW1lIHZhcmlhYmxlIG11c3QgcmVtYWluIHVubW9kaWZpZWQsIHNvIGEgY29weSBpcyB0YWtlbi4gKi8KKwkJCXhNb2RpZmlhYmxlSWRsZVRpbWUgPSB4RXhwZWN0ZWRJZGxlVGltZTsKKwkJCWNvbmZpZ1BSRV9TTEVFUF9QUk9DRVNTSU5HKCAmeE1vZGlmaWFibGVJZGxlVGltZSApOworCQkJaWYoIHhNb2RpZmlhYmxlSWRsZVRpbWUgPiAwICkKKwkJCXsKKwkJCQlfX2RzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOworCQkJCV9fd2ZpKCk7CisJCQkJX19pc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKwkJCX0KKwkJCWNvbmZpZ1BPU1RfU0xFRVBfUFJPQ0VTU0lORyggJnhFeHBlY3RlZElkbGVUaW1lICk7CisKKwkJCS8qIFN0b3AgU3lzVGljay4gIEFnYWluLCB0aGUgdGltZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIGZvciBpcworCQkJYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiBiZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwKKwkJCWluZXZpdGFibHkgcmVzdWx0IGluIHNvbWUgdGlueSBkcmlmdCBvZiB0aGUgdGltZSBtYWludGFpbmVkIGJ5IHRoZQorCQkJa2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhciB0aW1lLiAqLworCQkJdWxTeXNUaWNrQ1RSTCA9IHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUc7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gKCB1bFN5c1RpY2tDVFJMICYgfnBvcnROVklDX1NZU1RJQ0tfRU5BQkxFICk7CisKKwkJCS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIC0gc2VlIGNvbW1lbnRzIGFib3ZlIF9fZGlzYWJsZV9pcnEoKSBjYWxsCisJCQlhYm92ZS4gKi8KKwkJCV9fZW5hYmxlX2lycSgpOworCisJCQlpZiggKCB1bFN5c1RpY2tDVFJMICYgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHICkgIT0gMCApCisJCQl7CisJCQkJdWludDMyX3QgdWxDYWxjdWxhdGVkTG9hZFZhbHVlOworCisJCQkJLyogVGhlIHRpY2sgaW50ZXJydXB0IGhhcyBhbHJlYWR5IGV4ZWN1dGVkLCBhbmQgdGhlIFN5c1RpY2sKKwkJCQljb3VudCByZWxvYWRlZCB3aXRoIHVsUmVsb2FkVmFsdWUuICBSZXNldCB0aGUKKwkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHIHdpdGggd2hhdGV2ZXIgcmVtYWlucyBvZiB0aGlzIHRpY2sKKwkJCQlwZXJpb2QuICovCisJCQkJdWxDYWxjdWxhdGVkTG9hZFZhbHVlID0gKCB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTCApIC0gKCB1bFJlbG9hZFZhbHVlIC0gcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyApOworCisJCQkJLyogRG9uJ3QgYWxsb3cgYSB0aW55IHZhbHVlLCBvciB2YWx1ZXMgdGhhdCBoYXZlIHNvbWVob3cKKwkJCQl1bmRlcmZsb3dlZCBiZWNhdXNlIHRoZSBwb3N0IHNsZWVwIGhvb2sgZGlkIHNvbWV0aGluZworCQkJCXRoYXQgdG9vayB0b28gbG9uZy4gKi8KKwkJCQlpZiggKCB1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPCB1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiApIHx8ICggdWxDYWxjdWxhdGVkTG9hZFZhbHVlID4gdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSApCisJCQkJeworCQkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICk7CisJCQkJfQorCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsQ2FsY3VsYXRlZExvYWRWYWx1ZTsKKworCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBoYW5kbGVyIHdpbGwgYWxyZWFkeSBoYXZlIHBlbmRlZCB0aGUgdGljaworCQkJCXByb2Nlc3NpbmcgaW4gdGhlIGtlcm5lbC4gIEFzIHRoZSBwZW5kaW5nIHRpY2sgd2lsbCBiZQorCQkJCXByb2Nlc3NlZCBhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gZXhpdHMsIHRoZSB0aWNrIHZhbHVlCisJCQkJbWFpbnRhaW5lZCBieSB0aGUgdGljayBpcyBzdGVwcGVkIGZvcndhcmQgYnkgb25lIGxlc3MgdGhhbiB0aGUKKwkJCQl0aW1lIHNwZW50IHdhaXRpbmcuICovCisJCQkJdWxDb21wbGV0ZVRpY2tQZXJpb2RzID0geEV4cGVjdGVkSWRsZVRpbWUgLSAxVUw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogU29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHRpY2sgaW50ZXJydXB0IGVuZGVkIHRoZSBzbGVlcC4KKwkJCQlXb3JrIG91dCBob3cgbG9uZyB0aGUgc2xlZXAgbGFzdGVkIHJvdW5kZWQgdG8gY29tcGxldGUgdGljaworCQkJCXBlcmlvZHMgKG5vdCB0aGUgdWxSZWxvYWQgdmFsdWUgd2hpY2ggYWNjb3VudGVkIGZvciBwYXJ0CisJCQkJdGlja3MpLiAqLworCQkJCXVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHMgPSAoIHhFeHBlY3RlZElkbGVUaW1lICogdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgKSAtIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUc7CisKKwkJCQkvKiBIb3cgbWFueSBjb21wbGV0ZSB0aWNrIHBlcmlvZHMgcGFzc2VkIHdoaWxlIHRoZSBwcm9jZXNzb3IKKwkJCQl3YXMgd2FpdGluZz8gKi8KKwkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzIC8gdWxUaW1lckNvdW50c0Zvck9uZVRpY2s7CisKKwkJCQkvKiBUaGUgcmVsb2FkIHZhbHVlIGlzIHNldCB0byB3aGF0ZXZlciBmcmFjdGlvbiBvZiBhIHNpbmdsZSB0aWNrCisJCQkJcGVyaW9kIHJlbWFpbnMuICovCisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggKCB1bENvbXBsZXRlVGlja1BlcmlvZHMgKyAxVUwgKSAqIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrICkgLSB1bENvbXBsZXRlZFN5c1RpY2tEZWNyZW1lbnRzOworCQkJfQorCisJCQkvKiBSZXN0YXJ0IFN5c1RpY2sgc28gaXQgcnVucyBmcm9tIHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcKKwkJCWFnYWluLCB0aGVuIHNldCBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHIGJhY2sgdG8gaXRzIHN0YW5kYXJkCisJCQl2YWx1ZS4gIFRoZSBjcml0aWNhbCBzZWN0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHRoZSB0aWNrIGludGVycnVwdAorCQkJY2FuIG9ubHkgZXhlY3V0ZSBvbmNlIGluIHRoZSBjYXNlIHRoYXQgdGhlIHJlbG9hZCByZWdpc3RlciBpcyBuZWFyCisJCQl6ZXJvLiAqLworCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKKwkJCXBvcnRFTlRFUl9DUklUSUNBTCgpOworCQkJeworCQkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7CisJCQkJdlRhc2tTdGVwVGljayggdWxDb21wbGV0ZVRpY2tQZXJpb2RzICk7CisJCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCQkJfQorCQkJcG9ydEVYSVRfQ1JJVElDQUwoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qICNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNldHVwIHRoZSBzeXN0aWNrIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMgYXQgdGhlIHJlcXVpcmVkCisgKiBmcmVxdWVuY3kuCisgKi8KKyNpZiBjb25maWdPVkVSUklERV9ERUZBVUxUX1RJQ0tfQ09ORklHVVJBVElPTiA9PSAwCisKKwl2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCisJeworCQkvKiBDYWxjdWxhdGUgdGhlIGNvbnN0YW50cyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlIHRpY2sgaW50ZXJydXB0LiAqLworCQkjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorCQl7CisJCQl1bFRpbWVyQ291bnRzRm9yT25lVGljayA9ICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICk7CisJCQl4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzID0gcG9ydE1BWF8yNF9CSVRfTlVNQkVSIC8gdWxUaW1lckNvdW50c0Zvck9uZVRpY2s7CisJCQl1bFN0b3BwZWRUaW1lckNvbXBlbnNhdGlvbiA9IHBvcnRNSVNTRURfQ09VTlRTX0ZBQ1RPUiAvICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnU1lTVElDS19DTE9DS19IWiApOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCQkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKSAtIDFVTDsKKwkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9IHBvcnROVklDX1NZU1RJQ0tfQ0xLIHwgcG9ydE5WSUNfU1lTVElDS19JTlQgfCBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKwl9CisjZW5kaWYgLyogY29uZmlnT1ZFUlJJREVfREVGQVVMVF9USUNLX0NPTkZJR1VSQVRJT04gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgdlBvcnRTd2l0Y2hUb1VzZXJNb2RlKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKwkKKwltcnMgcjAsIGNvbnRyb2wKKwlvcnIgcjAsICMxCisJbXNyIGNvbnRyb2wsIHIwCisJYnggcjE0Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkKK19fYXNtIHZvaWQgdlBvcnRFbmFibGVWRlAoIHZvaWQgKQoreworCVBSRVNFUlZFOAorCQorCWxkci53IHIwLCA9MHhFMDAwRUQ4OAkJLyogVGhlIEZQVSBlbmFibGUgYml0cyBhcmUgaW4gdGhlIENQQUNSLiAqLworCWxkciByMSwgW3IwXQorCisJb3JyIHIxLCByMSwgIyggMHhmIDw8IDIwICkJLyogRW5hYmxlIENQMTAgYW5kIENQMTEgY29wcm9jZXNzb3JzLCB0aGVuIHNhdmUgYmFjay4gKi8KKwlzdHIgcjEsIFtyMF0KKwlieCByMTQKKwlub3AKKwlub3AKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApCit7CitleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfXzsKK2V4dGVybiB1aW50MzJfdCBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXzsKK2V4dGVybiB1aW50MzJfdCBfX0ZMQVNIX3NlZ21lbnRfZW5kX187CitleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXzsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXzsKKworCQkvKiBGaXJzdCBzZXR1cCB0aGUgZW50aXJlIGZsYXNoIGZvciB1bnByaXZpbGVnZWQgcmVhZCBvbmx5IGFjY2Vzcy4gKi8KKwkJcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRyA9CSggKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9zdGFydF9fICkgfCAvKiBCYXNlIGFkZHJlc3MuICovCisJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkJCQkJCSggcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT04gKTsKKworCQlwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHID0JKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQkJCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X2VuZF9fIC0gKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9zdGFydF9fICkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBTZXR1cCB0aGUgZmlyc3QgMTZLIGZvciBwcml2aWxlZ2VkIG9ubHkgYWNjZXNzIChldmVuIHRob3VnaCBsZXNzCisJCXRoYW4gMTBLIGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQpLiAgVGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGNvZGUgaXMKKwkJcGxhY2VkLiAqLworCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKKwkJCQkJCQkJCQkJKCBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT04gKTsKKworCQlwb3J0TVBVX1JFR0lPTl9BVFRSSUJVVEVfUkVHID0JKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCQkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fIC0gKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9zdGFydF9fICkgKSB8CisJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBTZXR1cCB0aGUgcHJpdmlsZWdlZCBkYXRhIFJBTSByZWdpb24uICBUaGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgZGF0YQorCQlpcyBwbGFjZWQuICovCisJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fICkgfCAvKiBCYXNlIGFkZHJlc3MuICovCisJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkJCQkJCSggcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTiApOworCisJCXBvcnRNUFVfUkVHSU9OX0FUVFJJQlVURV9SRUcgPQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCQkJCQkJCXBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2RhdGFfZW5kX18gLSAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXyApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIEJ5IGRlZmF1bHQgYWxsb3cgZXZlcnl0aGluZyB0byBhY2Nlc3MgdGhlIGdlbmVyYWwgcGVyaXBoZXJhbHMuICBUaGUKKwkJc3lzdGVtIHBlcmlwaGVyYWxzIGFuZCByZWdpc3RlcnMgYXJlIHByb3RlY3RlZC4gKi8KKwkJcG9ydE1QVV9SRUdJT05fQkFTRV9BRERSRVNTX1JFRyA9CSggcG9ydFBFUklQSEVSQUxTX1NUQVJUX0FERFJFU1MgKSB8CisJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkJCQkJCSggcG9ydEdFTkVSQUxfUEVSSVBIRVJBTFNfUkVHSU9OICk7CisKKwkJcG9ydE1QVV9SRUdJT05fQVRUUklCVVRFX1JFRyA9CSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSB8IHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKSB8CisJCQkJCQkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggcG9ydFBFUklQSEVSQUxTX0VORF9BRERSRVNTIC0gcG9ydFBFUklQSEVSQUxTX1NUQVJUX0FERFJFU1MgKSApIHwKKwkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOworCisJCS8qIEVuYWJsZSB0aGUgbWVtb3J5IGZhdWx0IGV4Y2VwdGlvbi4gKi8KKwkJcG9ydE5WSUNfU1lTX0NUUkxfU1RBVEVfUkVHIHw9IHBvcnROVklDX01FTV9GQVVMVF9FTkFCTEU7CisKKwkJLyogRW5hYmxlIHRoZSBNUFUgd2l0aCB0aGUgYmFja2dyb3VuZCByZWdpb24gY29uZmlndXJlZC4gKi8KKwkJcG9ydE1QVV9DVFJMX1JFRyB8PSAoIHBvcnRNUFVfRU5BQkxFIHwgcG9ydE1QVV9CQUNLR1JPVU5EX0VOQUJMRSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1aW50MzJfdCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggdWludDMyX3QgdWxBY3R1YWxTaXplSW5CeXRlcyApCit7Cit1aW50MzJfdCB1bFJlZ2lvblNpemUsIHVsUmV0dXJuVmFsdWUgPSA0OworCisJLyogMzIgaXMgdGhlIHNtYWxsZXN0IHJlZ2lvbiBzaXplLCAzMSBpcyB0aGUgbGFyZ2VzdCB2YWxpZCB2YWx1ZSBmb3IKKwl1bFJldHVyblZhbHVlLiAqLworCWZvciggdWxSZWdpb25TaXplID0gMzJVTDsgdWxSZXR1cm5WYWx1ZSA8IDMxVUw7ICggdWxSZWdpb25TaXplIDw8PSAxVUwgKSApCisJeworCQlpZiggdWxBY3R1YWxTaXplSW5CeXRlcyA8PSB1bFJlZ2lvblNpemUgKQorCQl7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCXsKKwkJCXVsUmV0dXJuVmFsdWUrKzsKKwkJfQorCX0KKworCS8qIFNoaWZ0IHRoZSBjb2RlIGJ5IG9uZSBiZWZvcmUgcmV0dXJuaW5nIHNvIGl0IGNhbiBiZSB3cml0dGVuIGRpcmVjdGx5CisJaW50byB0aGUgdGhlIGNvcnJlY3QgYml0IHBvc2l0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgcmVnaXN0ZXIuICovCisJcmV0dXJuICggdWxSZXR1cm5WYWx1ZSA8PCAxVUwgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfX2FzbSBCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKQoreworCW1ycyByMCwgY29udHJvbAorCXRzdCByMCwgIzEJCQkJCQkvKiBJcyB0aGUgdGFzayBydW5uaW5nIHByaXZpbGVnZWQ/ICovCisJaXR0ZSBuZQorCW1vdm5lIHIwLCAjMAkJCQkJLyogQ09OVFJPTFswXSE9MCwgcmV0dXJuIGZhbHNlLiAqLworCXN2Y25lIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCS8qIFN3aXRjaCB0byBwcml2aWxlZ2VkLiAqLworCW1vdmVxIHIwLCAjMQkJCQkJLyogQ09OVFJPTFswXT09MCwgcmV0dXJuIHRydWUuICovCisJYnggbHIKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0U3RvcmVUYXNrTVBVU2V0dGluZ3MoIHhNUFVfU0VUVElOR1MgKnhNUFVTZXR0aW5ncywgY29uc3Qgc3RydWN0IHhNRU1PUllfUkVHSU9OICogY29uc3QgeFJlZ2lvbnMsIFN0YWNrVHlwZV90ICpweEJvdHRvbU9mU3RhY2ssIHVpbnQzMl90IHVsU3RhY2tEZXB0aCApCit7CitleHRlcm4gdWludDMyX3QgX19TUkFNX3NlZ21lbnRfc3RhcnRfXzsKK2V4dGVybiB1aW50MzJfdCBfX1NSQU1fc2VnbWVudF9lbmRfXzsKK2V4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fOworZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fOworCisJCitpbnQzMl90IGxJbmRleDsKK3VpbnQzMl90IHVsOworCisJaWYoIHhSZWdpb25zID09IE5VTEwgKQorCXsKKwkJLyogTm8gTVBVIHJlZ2lvbnMgYXJlIHNwZWNpZmllZCBzbyBhbGxvdyBhY2Nlc3MgdG8gYWxsIFJBTS4gKi8KKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJKCAoIHVpbnQzMl90ICkgX19TUkFNX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLworCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJKCBwb3J0U1RBQ0tfUkVHSU9OICk7CisKKwkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApIHwKKwkJCQkoIHBvcnRNUFVfUkVHSU9OX0NBQ0hFQUJMRV9CVUZGRVJBQkxFICkgfAorCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX1NSQU1fc2VnbWVudF9lbmRfXyAtICggdWludDMyX3QgKSBfX1NSQU1fc2VnbWVudF9zdGFydF9fICkgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBSZS1pbnN0YXRlIHRoZSBwcml2aWxlZ2VkIG9ubHkgUkFNIHJlZ2lvbiBhcyB4UmVnaW9uWyAwIF0gd2lsbCBoYXZlCisJCWp1c3QgcmVtb3ZlZCB0aGUgcHJpdmlsZWdlZCBvbmx5IHBhcmFtZXRlcnMuICovCisJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgMSBdLnVsUmVnaW9uQmFzZUFkZHJlc3MgPQorCQkJCSggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KKwkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCSggcG9ydFNUQUNLX1JFR0lPTiArIDEgKTsKKworCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDEgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUgKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9DQUNIRUFCTEVfQlVGRkVSQUJMRSApIHwKKwkJCQlwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX2VuZF9fIC0gKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X18gKSB8CisJCQkJKCBwb3J0TVBVX1JFR0lPTl9FTkFCTEUgKTsKKworCQkvKiBJbnZhbGlkYXRlIGFsbCBvdGhlciByZWdpb25zLiAqLworCQlmb3IoIHVsID0gMjsgdWwgPD0gcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUzsgdWwrKyApCisJCXsKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0gKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKSB8IHBvcnRNUFVfUkVHSU9OX1ZBTElEOworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQXR0cmlidXRlID0gMFVMOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdGFzayBpcyBjcmVhdGVkIC0gaW4KKwkJd2hpY2ggY2FzZSB0aGUgc3RhY2sgcmVnaW9uIHBhcmFtZXRlcnMgd2lsbCBiZSB2YWxpZC4gIEF0IGFsbCBvdGhlcgorCQl0aW1lcyB0aGUgc3RhY2sgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSB2YWxpZCBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZQorCQlzdGFjayByZWdpb24gaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLiAqLworCQlpZiggdWxTdGFja0RlcHRoID4gMCApCisJCXsKKwkJCS8qIERlZmluZSB0aGUgcmVnaW9uIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgc3RhY2suICovCisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIDAgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0KKwkJCQkJKCAoIHVpbnQzMl90ICkgcHhCb3R0b21PZlN0YWNrICkgfAorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfAorCQkJCQkoIHBvcnRTVEFDS19SRUdJT04gKTsgLyogUmVnaW9uIG51bWJlci4gKi8KKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyAwIF0udWxSZWdpb25BdHRyaWJ1dGUgPQorCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8IC8qIFJlYWQgYW5kIHdyaXRlLiAqLworCQkJCQkoIHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1bFN0YWNrRGVwdGggKiAoIHVpbnQzMl90ICkgc2l6ZW9mKCBTdGFja1R5cGVfdCApICkgKSB8CisJCQkJCSggcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUgKSB8CisJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisJCX0KKworCQlsSW5kZXggPSAwOworCisJCWZvciggdWwgPSAxOyB1bCA8PSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TOyB1bCsrICkKKwkJeworCQkJaWYoICggeFJlZ2lvbnNbIGxJbmRleCBdICkudWxMZW5ndGhJbkJ5dGVzID4gMFVMICkKKwkJCXsKKwkJCQkvKiBUcmFuc2xhdGUgdGhlIGdlbmVyaWMgcmVnaW9uIGRlZmluaXRpb24gY29udGFpbmVkIGluCisJCQkJeFJlZ2lvbnMgaW50byB0aGUgQ00zIHNwZWNpZmljIE1QVSBzZXR0aW5ncyB0aGF0IGFyZSB0aGVuCisJCQkJc3RvcmVkIGluIHhNUFVTZXR0aW5ncy4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25bIHVsIF0udWxSZWdpb25CYXNlQWRkcmVzcyA9CisJCQkJCQkoICggdWludDMyX3QgKSB4UmVnaW9uc1sgbEluZGV4IF0ucHZCYXNlQWRkcmVzcyApIHwKKwkJCQkJCSggcG9ydE1QVV9SRUdJT05fVkFMSUQgKSB8CisJCQkJCQkoIHBvcnRTVEFDS19SRUdJT04gKyB1bCApOyAvKiBSZWdpb24gbnVtYmVyLiAqLworCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uWyB1bCBdLnVsUmVnaW9uQXR0cmlidXRlID0KKwkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgKSApIHwKKwkJCQkJCSggeFJlZ2lvbnNbIGxJbmRleCBdLnVsUGFyYW1ldGVycyApIHwKKwkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogSW52YWxpZGF0ZSB0aGUgcmVnaW9uLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkJhc2VBZGRyZXNzID0gKCBwb3J0U1RBQ0tfUkVHSU9OICsgdWwgKSB8IHBvcnRNUFVfUkVHSU9OX1ZBTElEOworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvblsgdWwgXS51bFJlZ2lvbkF0dHJpYnV0ZSA9IDBVTDsKKwkJCX0KKworCQkJbEluZGV4Kys7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworX19hc20gdWludDMyX3QgcHJ2UG9ydEdldElQU1IoIHZvaWQgKQoreworCVBSRVNFUlZFOAorCisJbXJzIHIwLCBpcHNyCisJYnggcjE0Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKworCXZvaWQgdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCB2b2lkICkKKwl7CisJdWludDMyX3QgdWxDdXJyZW50SW50ZXJydXB0OworCXVpbnQ4X3QgdWNDdXJyZW50UHJpb3JpdHk7CisKKwkJLyogT2J0YWluIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW50ZXJydXB0LiAqLworCQl1bEN1cnJlbnRJbnRlcnJ1cHQgPSBwcnZQb3J0R2V0SVBTUigpOworCisJCS8qIElzIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGEgdXNlciBkZWZpbmVkIGludGVycnVwdD8gKi8KKwkJaWYoIHVsQ3VycmVudEludGVycnVwdCA+PSBwb3J0RklSU1RfVVNFUl9JTlRFUlJVUFRfTlVNQkVSICkKKwkJeworCQkJLyogTG9vayB1cCB0aGUgaW50ZXJydXB0J3MgcHJpb3JpdHkuICovCisJCQl1Y0N1cnJlbnRQcmlvcml0eSA9IHBjSW50ZXJydXB0UHJpb3JpdHlSZWdpc3RlcnNbIHVsQ3VycmVudEludGVycnVwdCBdOworCisJCQkvKiBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYgYSBzZXJ2aWNlIHJvdXRpbmUgKElTUikgZm9yCisJCQlhbiBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlCisJCQljb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgY2FsbHMgYW4gSVNSIHNhZmUgRnJlZVJUT1MgQVBJCisJCQlmdW5jdGlvbi4gIElTUiBzYWZlIEZyZWVSVE9TIEFQSSBmdW5jdGlvbnMgbXVzdCAqb25seSogYmUgY2FsbGVkCisJCQlmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhdCBvciBiZWxvdworCQkJY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorCisJCQlOdW1lcmljYWxseSBsb3cgaW50ZXJydXB0IHByaW9yaXR5IG51bWJlcnMgcmVwcmVzZW50IGxvZ2ljYWxseSBoaWdoCisJCQlpbnRlcnJ1cHQgcHJpb3JpdGllcywgdGhlcmVmb3JlIHRoZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0IG11c3QKKwkJCWJlIHNldCB0byBhIHZhbHVlIGVxdWFsIHRvIG9yIG51bWVyaWNhbGx5ICpoaWdoZXIqIHRoYW4KKwkJCWNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4KKworCQkJSW50ZXJydXB0cyB0aGF0CXVzZSB0aGUgRnJlZVJUT1MgQVBJIG11c3Qgbm90IGJlIGxlZnQgYXQgdGhlaXIKKwkJCWRlZmF1bHQgcHJpb3JpdHkgb2YJemVybyBhcyB0aGF0IGlzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHByaW9yaXR5LAorCQkJd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBhYm92ZSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFksCisJCQlhbmQJdGhlcmVmb3JlIGFsc28gZ3VhcmFudGVlZCB0byBiZSBpbnZhbGlkLgorCisJCQlGcmVlUlRPUyBtYWludGFpbnMgc2VwYXJhdGUgdGhyZWFkIGFuZCBJU1IgQVBJIGZ1bmN0aW9ucyB0byBlbnN1cmUKKwkJCWludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBzaW1wbGUgYXMgcG9zc2libGUuCisKKwkJCVRoZSBmb2xsb3dpbmcgbGlua3MgcHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbjoKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwKKwkJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL0ZBUUhlbHAuaHRtbCAqLworCQkJY29uZmlnQVNTRVJUKCB1Y0N1cnJlbnRQcmlvcml0eSA+PSB1Y01heFN5c0NhbGxQcmlvcml0eSApOworCQl9CisKKwkJLyogUHJpb3JpdHkgZ3JvdXBpbmc6ICBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKE5WSUMpIGFsbG93cyB0aGUgYml0cworCQl0aGF0IGRlZmluZSBlYWNoIGludGVycnVwdCdzIHByaW9yaXR5IHRvIGJlIHNwbGl0IGJldHdlZW4gYml0cyB0aGF0CisJCWRlZmluZSB0aGUgaW50ZXJydXB0J3MgcHJlLWVtcHRpb24gcHJpb3JpdHkgYml0cyBhbmQgYml0cyB0aGF0IGRlZmluZQorCQl0aGUgaW50ZXJydXB0J3Mgc3ViLXByaW9yaXR5LiAgRm9yIHNpbXBsaWNpdHkgYWxsIGJpdHMgbXVzdCBiZSBkZWZpbmVkCisJCXRvIGJlIHByZS1lbXB0aW9uIHByaW9yaXR5IGJpdHMuICBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiB3aWxsIGZhaWwgaWYKKwkJdGhpcyBpcyBub3QgdGhlIGNhc2UgKGlmIHNvbWUgYml0cyByZXByZXNlbnQgYSBzdWItcHJpb3JpdHkpLgorCisJCUlmIHRoZSBhcHBsaWNhdGlvbiBvbmx5IHVzZXMgQ01TSVMgbGlicmFyaWVzIGZvciBpbnRlcnJ1cHQKKwkJY29uZmlndXJhdGlvbiB0aGVuIHRoZSBjb3JyZWN0IHNldHRpbmcgY2FuIGJlIGFjaGlldmVkIG9uIGFsbCBDb3J0ZXgtTQorCQlkZXZpY2VzIGJ5IGNhbGxpbmcgTlZJQ19TZXRQcmlvcml0eUdyb3VwaW5nKCAwICk7IGJlZm9yZSBzdGFydGluZyB0aGUKKwkJc2NoZWR1bGVyLiAgTm90ZSBob3dldmVyIHRoYXQgc29tZSB2ZW5kb3Igc3BlY2lmaWMgcGVyaXBoZXJhbCBsaWJyYXJpZXMKKwkJYXNzdW1lIGEgbm9uLXplcm8gcHJpb3JpdHkgZ3JvdXAgc2V0dGluZywgaW4gd2hpY2ggY2FzZXMgdXNpbmcgYSB2YWx1ZQorCQlvZiB6ZXJvIHdpbGwgcmVzdWx0IGluIHVucHJlZGljYWJsZSBiZWhhdmlvdXIuICovCisJCWNvbmZpZ0FTU0VSVCggKCBwb3J0QUlSQ1JfUkVHICYgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sgKSA8PSB1bE1heFBSSUdST1VQVmFsdWUgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTdkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCkBAIC0wLDAgKzEsMzEwIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApIDB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDIDEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1QVSBzcGVjaWZpYyBjb25zdGFudHMuICovCisjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMJCTEKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkoIDB4ODAwMDAwMDBVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURQkJCQkoIDB4MDNVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkJCSggMHgwNVVMIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkJCQkJKCAweDA2VUwgPDwgMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURQkoIDB4MDFVTCA8PCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUJCSggMHgwN1VMIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSCQkJKCAweDAxVUwgPDwgMjhVTCApCisKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCSggMFVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkJKCAxVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OCQkJKCAyVUwgKQorI2RlZmluZSBwb3J0R0VORVJBTF9QRVJJUEhFUkFMU19SRUdJT04JCSggM1VMICkKKyNkZWZpbmUgcG9ydFNUQUNLX1JFR0lPTgkJCQkJKCA0VUwgKQorI2RlZmluZSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkgICAgKCA1VUwgKQorI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkoIDdVTCApCisjZGVmaW5lIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMJCSggKCBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OIC0gcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04gKSArIDEgKQorI2RlZmluZSBwb3J0VE9UQUxfTlVNX1JFR0lPTlMJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCisKK3ZvaWQgdlBvcnRTd2l0Y2hUb1VzZXJNb2RlKCB2b2lkICk7CisjZGVmaW5lIHBvcnRTV0lUQ0hfVE9fVVNFUl9NT0RFKCkJdlBvcnRTd2l0Y2hUb1VzZXJNb2RlKCkKKwordHlwZWRlZiBzdHJ1Y3QgTVBVX1JFR0lPTl9SRUdJU1RFUlMKK3sKKwl1aW50MzJfdCB1bFJlZ2lvbkJhc2VBZGRyZXNzOworCXVpbnQzMl90IHVsUmVnaW9uQXR0cmlidXRlOworfSB4TVBVX1JFR0lPTl9SRUdJU1RFUlM7CisKKy8qIFBsdXMgMSB0byBjcmVhdGUgc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCit0eXBlZGVmIHN0cnVjdCBNUFVfU0VUVElOR1MKK3sKKwl4TVBVX1JFR0lPTl9SRUdJU1RFUlMgeFJlZ2lvblsgcG9ydFRPVEFMX05VTV9SRUdJT05TIF07Cit9IHhNUFVfU0VUVElOR1M7CisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorCisvKiBDb25zdGFudHMgdXNlZCB3aXRoIG1lbW9yeSBiYXJyaWVyIGludHJpbnNpY3MuICovCisjZGVmaW5lIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUJCSggMTUgKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU1ZDIG51bWJlcnMgZm9yIHZhcmlvdXMgc2VydmljZXMuICovCisjZGVmaW5lIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSCQkJCTAKKyNkZWZpbmUgcG9ydFNWQ19ZSUVMRAkJCQkJCTEKKyNkZWZpbmUgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UJCQkJMgorCisvKiBTY2hlZHVsZXIgdXRpbGl0aWVzLiAqLworCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCV9fYXNteyBTVkMgcG9ydFNWQ19ZSUVMRCB9CisjZGVmaW5lIHBvcnRZSUVMRF9XSVRISU5fQVBJKCkgCQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLwkJCQkJCQkJXAorCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMgY29tcGxldGVseQlcCisJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLwkJCQkJCVwKKwlfX2RzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOwkJCQkJCQkJCQkJXAorCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CQkJCQkJCQkJCQlcCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVF9CSVQJCSggMVVMIDw8IDI4VUwgKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApIGlmKCB4U3dpdGNoUmVxdWlyZWQgKSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LiAqLworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApOworCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQkJCQl2UG9ydFJhaXNlQkFTRVBSSSgpCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQl2UG9ydFNldEJBU0VQUkkoMCkKKyNkZWZpbmUgcG9ydEVOVEVSX0NSSVRJQ0FMKCkJCQkJCXZQb3J0RW50ZXJDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRFWElUX0NSSVRJQ0FMKCkJCQkJCQl2UG9ydEV4aXRDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQkJdWxQb3J0UmFpc2VCQVNFUFJJKCkKKyNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKHgpCXZQb3J0U2V0QkFTRVBSSSh4KQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIG9wdGltaXNhdGlvbnMuICovCisjaWZuZGVmIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTgorCSNkZWZpbmUgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIDEKKyNlbmRpZgorCisjaWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OID09IDEKKworCS8qIENoZWNrIHRoZSBjb25maWd1cmF0aW9uLiAqLworCSNpZiggY29uZmlnTUFYX1BSSU9SSVRJRVMgPiAzMiApCisJCSNlcnJvciBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gY2FuIG9ubHkgYmUgc2V0IHRvIDEgd2hlbiBjb25maWdNQVhfUFJJT1JJVElFUyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzIuICBJdCBpcyB2ZXJ5IHJhcmUgdGhhdCBhIHN5c3RlbSByZXF1aXJlcyBtb3JlIHRoYW4gMTAgdG8gMTUgZGlmZmVyZW5jZSBwcmlvcml0aWVzIGFzIHRhc2tzIHRoYXQgc2hhcmUgYSBwcmlvcml0eSB3aWxsIHRpbWUgc2xpY2UuCisJI2VuZGlmCisKKwkvKiBTdG9yZS9jbGVhciB0aGUgcmVhZHkgcHJpb3JpdGllcyBpbiBhIGJpdCBtYXAuICovCisJI2RlZmluZSBwb3J0UkVDT1JEX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApICggdXhSZWFkeVByaW9yaXRpZXMgKSB8PSAoIDFVTCA8PCAoIHV4UHJpb3JpdHkgKSApCisJI2RlZmluZSBwb3J0UkVTRVRfUkVBRFlfUFJJT1JJVFkoIHV4UHJpb3JpdHksIHV4UmVhZHlQcmlvcml0aWVzICkgKCB1eFJlYWR5UHJpb3JpdGllcyApICY9IH4oIDFVTCA8PCAoIHV4UHJpb3JpdHkgKSApCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCSNkZWZpbmUgcG9ydEdFVF9ISUdIRVNUX1BSSU9SSVRZKCB1eFRvcFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApIHV4VG9wUHJpb3JpdHkgPSAoIDMxVUwgLSAoIHVpbnQzMl90ICkgX19jbHooICggdXhSZWFkeVByaW9yaXRpZXMgKSApICkKKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRhc2sgZnVuY3Rpb24gbWFjcm9zIGFzIGRlc2NyaWJlZCBvbiB0aGUgRnJlZVJUT1Mub3JnIFdFQiBzaXRlLiAgVGhlc2UgYXJlCitub3QgbmVjZXNzYXJ5IGZvciB0byB1c2UgdGhpcyBwb3J0LiAgVGhleSBhcmUgZGVmaW5lZCBzbyB0aGUgY29tbW9uIGRlbW8gZmlsZXMKKyh3aGljaCBidWlsZCB3aXRoIGFsbCB0aGUgcG9ydHMpIHdpbGwgYnVpbGQuICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgY29uZmlnQVNTRVJUCisJdm9pZCB2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoIHZvaWQgKTsKKwkjZGVmaW5lIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSAJdlBvcnRWYWxpZGF0ZUludGVycnVwdFByaW9yaXR5KCkKKyNlbmRpZgorCisvKiBwb3J0Tk9QKCkgaXMgbm90IHJlcXVpcmVkIGJ5IHRoaXMgcG9ydC4gKi8KKyNkZWZpbmUgcG9ydE5PUCgpCisKKyNkZWZpbmUgcG9ydElOTElORSBfX2lubGluZQorCisjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKKwkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUgX19mb3JjZWlubGluZQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSB2b2lkIHZQb3J0U2V0QkFTRVBSSSggdWludDMyX3QgdWxCQVNFUFJJICkKK3sKKwlfX2FzbQorCXsKKwkJLyogQmFycmllciBpbnN0cnVjdGlvbnMgYXJlIG5vdCB1c2VkIGFzIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvCisJCWxvd2VyIHRoZSBCQVNFUFJJIHZhbHVlLiAqLworCQltc3IgYmFzZXByaSwgdWxCQVNFUFJJCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIHZvaWQgdlBvcnRSYWlzZUJBU0VQUkkoIHZvaWQgKQorewordWludDMyX3QgdWxOZXdCQVNFUFJJID0gY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZOworCisJX19hc20KKwl7CisJCS8qIFNldCBCQVNFUFJJIHRvIHRoZSBtYXggc3lzY2FsbCBwcmlvcml0eSB0byBlZmZlY3QgYSBjcml0aWNhbAorCQlzZWN0aW9uLiAqLworICAgIGNwc2lkIGkKKwkJbXNyIGJhc2VwcmksIHVsTmV3QkFTRVBSSQorCQlkc2IKKwkJaXNiCisgICAgY3BzaWUgaQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgcG9ydEZPUkNFX0lOTElORSB2b2lkIHZQb3J0Q2xlYXJCQVNFUFJJRnJvbUlTUiggdm9pZCApCit7CisJX19hc20KKwl7CisJCS8qIFNldCBCQVNFUFJJIHRvIDAgc28gbm8gaW50ZXJydXB0cyBhcmUgbWFza2VkLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5CisJCXVzZWQgdG8gbG93ZXIgdGhlIG1hc2sgaW4gYW4gaW50ZXJydXB0LCBzbyBtZW1vcnkgYmFycmllcnMgYXJlIG5vdCAKKwkJdXNlZC4gKi8KKwkJbXNyIGJhc2VwcmksICMwCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBwb3J0Rk9SQ0VfSU5MSU5FIHVpbnQzMl90IHVsUG9ydFJhaXNlQkFTRVBSSSggdm9pZCApCit7Cit1aW50MzJfdCB1bFJldHVybiwgdWxOZXdCQVNFUFJJID0gY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZOworCisJX19hc20KKwl7CisJCS8qIFNldCBCQVNFUFJJIHRvIHRoZSBtYXggc3lzY2FsbCBwcmlvcml0eSB0byBlZmZlY3QgYSBjcml0aWNhbAorCQlzZWN0aW9uLiAqLworICAgIGNwc2lkIGkKKwkJbXJzIHVsUmV0dXJuLCBiYXNlcHJpCisJCW1zciBiYXNlcHJpLCB1bE5ld0JBU0VQUkkKKwkJZHNiCisJCWlzYgorICAgIGNwc2llIGkKKwl9CisKKwlyZXR1cm4gdWxSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHBvcnRGT1JDRV9JTkxJTkUgQmFzZVR5cGVfdCB4UG9ydElzSW5zaWRlSW50ZXJydXB0KCB2b2lkICkKK3sKK3VpbnQzMl90IHVsQ3VycmVudEludGVycnVwdDsKK0Jhc2VUeXBlX3QgeFJldHVybjsKKworCS8qIE9idGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGludGVycnVwdC4gKi8KKwlfX2FzbQorCXsKKwkJbXJzIHVsQ3VycmVudEludGVycnVwdCwgaXBzcgorCX0KKworCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPT0gMCApCisJeworCQl4UmV0dXJuID0gcGRGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IHBkVFJVRTsKKwl9CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTZXQgdGhlIHByaXZpbGVnZSBsZXZlbCB0byB1c2VyIG1vZGUgaWYgeFJ1bm5pbmdQcml2aWxlZ2VkIGlzIGZhbHNlLiAqLworcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgdm9pZCB2UG9ydFJlc2V0UHJpdmlsZWdlKCBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCApCit7Cit1aW50MzJfdCB1bFJlZzsKKwkKKwlpZiggeFJ1bm5pbmdQcml2aWxlZ2VkICE9IHBkVFJVRSApIAorCXsKKwkJX19hc20gCisJCXsKKwkJCW1ycyB1bFJlZywgY29udHJvbAorCQkJb3JyIHVsUmVnLCAjMQorCQkJbXNyIGNvbnRyb2wsIHVsUmVnCisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogUE9SVE1BQ1JPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL1Rhc2tpbmcvQVJNX0NNNEYvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL1Rhc2tpbmcvQVJNX0NNNEYvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTI3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvVGFza2luZy9BUk1fQ000Ri9wb3J0LmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiBwb3J0YWJsZS5oIGZvciB0aGUgQVJNIENNNEYgcG9ydC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIE5WSUMuICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTAkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FECQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTQgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEsJCTB4MDAwMDAwMDQKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDE2ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDI0ICkKKworLyogTWFza3Mgb2ZmIGFsbCBiaXRzIGJ1dCB0aGUgVkVDVEFDVElWRSBiaXRzIGluIHRoZSBJQ1NSIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0VkVDVEFDVElWRV9NQVNLCQkJKCAweEZGVUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgVkZQLiAqLworI2RlZmluZSBwb3J0RlBDQ1IJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWYzNCApIC8qIEZsb2F0aW5nIHBvaW50IGNvbnRleHQgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydEFTUEVOX0FORF9MU1BFTl9CSVRTCSggMHgzVUwgPDwgMzBVTCApCisKKy8qIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suICovCisjZGVmaW5lIHBvcnRJTklUSUFMX1hQU1IJCQkoIDB4MDEwMDAwMDAgKQorI2RlZmluZSBwb3J0SU5JVElBTF9FWENfUkVUVVJOCQkoIDB4ZmZmZmZmZmQgKQorCisvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHByZS1sb2FkaW5nIG9mIHRoZSBpbml0aWFsIExSIHdpdGggdGhlIGFkZHJlc3Mgb2YKK3BydlRhc2tFeGl0RXJyb3IoKSBpbiBjYXNlIGl0IG1lc3NlcyB1cCB1bndpbmRpbmcgb2YgdGhlIHN0YWNrIGluIHRoZQorZGVidWdnZXIuICovCisjaWZkZWYgY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUworCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUworI2Vsc2UKKwkjZGVmaW5lIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTCXBydlRhc2tFeGl0RXJyb3IKKyNlbmRpZgorCisvKiBGb3Igc3RyaWN0IGNvbXBsaWFuY2Ugd2l0aCB0aGUgQ29ydGV4LU0gc3BlYyB0aGUgdGFzayBzdGFydCBhZGRyZXNzIHNob3VsZAoraGF2ZSBiaXQtMCBjbGVhciwgYXMgaXQgaXMgbG9hZGVkIGludG8gdGhlIFBDIG9uIGV4aXQgZnJvbSBhbiBJU1IuICovCisjZGVmaW5lIHBvcnRTVEFSVF9BRERSRVNTX01BU0sJCQkJKCAoIFN0YWNrVHlwZV90ICkgMHhmZmZmZmZmZVVMICkKKworLyogVGhlIHByaW9yaXR5IHVzZWQgYnkgdGhlIGtlcm5lbCBpcyBhc3NpZ25lZCB0byBhIHZhcmlhYmxlIHRvIG1ha2UgYWNjZXNzCitmcm9tIGlubGluZSBhc3NlbWJsZXIgZWFzaWVyLiAqLworY29uc3QgdWludDMyX3QgdWxLZXJuZWxQcmlvcml0eSA9IGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFk7CisKKy8qIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCit2YXJpYWJsZS4gKi8KK3N0YXRpYyB1aW50MzJfdCB1bENyaXRpY2FsTmVzdGluZyA9IDB4YWFhYWFhYWFVTDsKKworLyoKKyAqIFNldHVwIHRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBwcnZTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CisKKy8qCisgKiBFeGNlcHRpb24gaGFuZGxlcnMuCisgKi8KK3ZvaWQgU3lzVGlja19IYW5kbGVyKCB2b2lkICk7CisKKy8qCisgKiBGdW5jdGlvbnMgZGVmaW5lZCBpbiBwb3J0X2FzbS5hc20uCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0RW5hYmxlVkZQKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydFN0YXJ0Rmlyc3RUYXNrKCB2b2lkICk7CisKKy8qCisgKiBVc2VkIHRvIGNhdGNoIHRhc2tzIHRoYXQgYXR0ZW1wdCB0byByZXR1cm4gZnJvbSB0aGVpciBpbXBsZW1lbnRpbmcgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKTsKKworLyogVGhpcyBleGlzdHMgcHVyZWx5IHRvIGFsbG93IHRoZSBjb25zdCB0byBiZSB1c2VkIGZyb20gd2l0aGluIHRoZQorcG9ydF9hc20uYXNtIGFzc2VtYmx5IGZpbGUuICovCitjb25zdCB1aW50MzJfdCB1bE1heFN5c2NhbGxJbnRlcnJ1cHRQcmlvcml0eUNvbnN0ID0gY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK1N0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkKK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJaW50ZXJydXB0LiAqLworCisJLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0CisJb2YgaW50ZXJydXB0cywgYW5kIHRvIGVuc3VyZSBhbGlnbm1lbnQuICovCisJcHhUb3BPZlN0YWNrLS07CisKKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJLyogeFBTUiAqLworCXB4VG9wT2ZTdGFjay0tOworCSpweFRvcE9mU3RhY2sgPSAoICggU3RhY2tUeXBlX3QgKSBweENvZGUgKSAmIHBvcnRTVEFSVF9BRERSRVNTX01BU0s7CS8qIFBDICovCisJcHhUb3BPZlN0YWNrLS07CisJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUzsJLyogTFIgKi8KKworCS8qIFNhdmUgY29kZSBzcGFjZSBieSBza2lwcGluZyByZWdpc3RlciBpbml0aWFsaXNhdGlvbi4gKi8KKwlweFRvcE9mU3RhY2sgLT0gNTsJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkvKiBSMCAqLworCisJLyogQSBzYXZlIG1ldGhvZCBpcyBiZWluZyB1c2VkIHRoYXQgcmVxdWlyZXMgZWFjaCB0YXNrIHRvIG1haW50YWluIGl0cworCW93biBleGVjIHJldHVybiB2YWx1ZS4gKi8KKwlweFRvcE9mU3RhY2stLTsKKwkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsKKworCXB4VG9wT2ZTdGFjayAtPSA4OwkvKiBSMTEsIFIxMCwgUjksIFI4LCBSNywgUjYsIFI1IGFuZCBSNC4gKi8KKworCXJldHVybiBweFRvcE9mU3RhY2s7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApCit7CisJLyogQSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYSB0YXNrIG11c3Qgbm90IGV4aXQgb3IgYXR0ZW1wdCB0byByZXR1cm4gdG8KKwlpdHMgY2FsbGVyIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLiAgSWYgYSB0YXNrIHdhbnRzIHRvIGV4aXQgaXQKKwlzaG91bGQgaW5zdGVhZCBjYWxsIHZUYXNrRGVsZXRlKCBOVUxMICkuCisKKwlBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0KCkgdG8gYmUgdHJpZ2dlcmVkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzCisJZGVmaW5lZCwgdGhlbiBzdG9wIGhlcmUgc28gYXBwbGljYXRpb24gd3JpdGVycyBjYW4gY2F0Y2ggdGhlIGVycm9yLiAqLworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgPT0gfjBVTCApOworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwlmb3IoIDs7ICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCisgKi8KK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApCit7CisJLyogY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIG11c3Qgbm90IGJlIHNldCB0byAwLgorCVNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCisJY29uZmlnQVNTRVJUKCAoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApICk7CisKKwkvKiBNYWtlIFBlbmRTViBhbmQgU3lzVGljayB0aGUgbG93ZXN0IHByaW9yaXR5IGludGVycnVwdHMuICovCisJKihwb3J0TlZJQ19TWVNQUkkyKSB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOworCSoocG9ydE5WSUNfU1lTUFJJMikgfD0gcG9ydE5WSUNfU1lTVElDS19QUkk7CisKKwkvKiBTdGFydCB0aGUgdGltZXIgdGhhdCBnZW5lcmF0ZXMgdGhlIHRpY2sgSVNSLiAgSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKwloZXJlIGFscmVhZHkuICovCisJcHJ2U2V0dXBUaW1lckludGVycnVwdCgpOworCisJLyogSW5pdGlhbGlzZSB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCByZWFkeSBmb3IgdGhlIGZpcnN0IHRhc2suICovCisJdWxDcml0aWNhbE5lc3RpbmcgPSAwOworCisJLyogRW5zdXJlIHRoZSBWRlAgaXMgZW5hYmxlZCAtIGl0IHNob3VsZCBiZSBhbnl3YXkuICovCisJdlBvcnRFbmFibGVWRlAoKTsKKworCS8qIExhenkgc2F2ZSBhbHdheXMuICovCisJKiggcG9ydEZQQ0NSICkgfD0gcG9ydEFTUEVOX0FORF9MU1BFTl9CSVRTOworCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJdlBvcnRTdGFydEZpcnN0VGFzaygpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSEgKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHVsQ3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApCit7CisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkqKHBvcnROVklDX0lOVF9DVFJMKSA9IHBvcnROVklDX1BFTkRTVlNFVDsKKworCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQgYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CisJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLworCV9fRFNCKCk7CisJX19JU0IoKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApCit7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXVsQ3JpdGljYWxOZXN0aW5nKys7CisJX19EU0IoKTsKKwlfX0lTQigpOworCisJLyogVGhpcyBpcyBub3QgdGhlIGludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIGVudGVyIGNyaXRpY2FsIGZ1bmN0aW9uIHNvCisJYXNzZXJ0KCkgaWYgaXQgaXMgYmVpbmcgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQuICBPbmx5IEFQSQorCWZ1bmN0aW9ucyB0aGF0IGVuZCBpbiAiRnJvbUlTUiIgY2FuIGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0LiAgT25seSBhc3NlcnQgaWYKKwl0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCBpcyAxIHRvIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpdmUgY2FsbHMgaWYgdGhlCisJYXNzZXJ0IGZ1bmN0aW9uIGFsc28gdXNlcyBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJaWYoIHVsQ3JpdGljYWxOZXN0aW5nID09IDEgKQorCXsKKwkJY29uZmlnQVNTRVJUKCAoICggKihwb3J0TlZJQ19JTlRfQ1RSTCkgKSAmIHBvcnRWRUNUQUNUSVZFX01BU0sgKSA9PSAwICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKQoreworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgKTsKKwl1bENyaXRpY2FsTmVzdGluZy0tOworCWlmKCB1bENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFN5c1RpY2tfSGFuZGxlciggdm9pZCApCit7Cit1aW50MzJfdCB1bER1bW15OworCisJdWxEdW1teSA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogUGVuZCBhIGNvbnRleHQgc3dpdGNoLiAqLworCQkJKihwb3J0TlZJQ19JTlRfQ1RSTCkgPSBwb3J0TlZJQ19QRU5EU1ZTRVQ7CisJCX0KKwl9CisJcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCB1bER1bW15ICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNldHVwIHRoZSBzeXN0aWNrIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMgYXQgdGhlIHJlcXVpcmVkCisgKiBmcmVxdWVuY3kuCisgKi8KK3ZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCit7CisJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwkqKHBvcnROVklDX1NZU1RJQ0tfTE9BRCkgPSAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC0gMVVMOworCSoocG9ydE5WSUNfU1lTVElDS19DVFJMKSA9IHBvcnROVklDX1NZU1RJQ0tfQ0xLIHwgcG9ydE5WSUNfU1lTVElDS19JTlQgfCBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvVGFza2luZy9BUk1fQ000Ri9wb3J0X2FzbS5hc20gYi9Tb3VyY2UvcG9ydGFibGUvVGFza2luZy9BUk1fQ000Ri9wb3J0X2FzbS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0ZjcwNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9UYXNraW5nL0FSTV9DTTRGL3BvcnRfYXNtLmFzbQpAQCAtMCwwICsxLDIzNiBAQAorOy8qCis7ICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKzsgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICoKKzsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCis7ICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKzsgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCis7ICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKzsgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCis7ICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cis7ICoKKzsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKzsgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorOyAqCis7ICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKzsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworOyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorOyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorOyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCis7ICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKzsgKgorOyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCis7ICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCis7ICoKKzsgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKzsgKi8KKworCisJLmV4dGVybiBweEN1cnJlbnRUQ0IKKwkuZXh0ZXJuIHZUYXNrU3dpdGNoQ29udGV4dAorCS5leHRlcm4gdWxNYXhTeXNjYWxsSW50ZXJydXB0UHJpb3JpdHlDb25zdAorCisJLmdsb2JhbCBfdmVjdG9yXzE0CisJLmdsb2JhbCBfbGNfcmVmX192ZWN0b3JfcHBfMTQKKwkuZ2xvYmFsIFNWQ19IYW5kbGVyCisJLmdsb2JhbCB2UG9ydFN0YXJ0Rmlyc3RUYXNrCisJLmdsb2JhbCB2UG9ydEVuYWJsZVZGUAorCS5nbG9iYWwgdWxQb3J0U2V0SW50ZXJydXB0TWFzaworCS5nbG9iYWwgdlBvcnRDbGVhckludGVycnVwdE1hc2sKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkuc2VjdGlvbiAudGV4dAorCS50aHVtYgorCS5hbGlnbiA0CitfdmVjdG9yXzE0OiAudHlwZSBmdW5jCisKKwltcnMgcjAsIHBzcAorCWlzYgorCisJO0dldCB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgVENCLgorCWxkci53CXIzLCA9cHhDdXJyZW50VENCCisJbGRyCXIyLCBbcjNdCisKKwk7SXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHB1c2ggaGlnaCB2ZnAgcmVnaXN0ZXJzLgorCXRzdCByMTQsICMweDEwCisJaXQgZXEKKwl2c3RtZGJlcSByMCEsIHtzMTYtczMxfQorCisJO1NhdmUgdGhlIGNvcmUgcmVnaXN0ZXJzLgorCXN0bWRiIHIwISwge3I0LXIxMSwgcjE0fQorCisJO1NhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW50byB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBUQ0IuCisJc3RyIHIwLCBbcjJdCisKKwlzdG1kYiBzcCEsIHtyMCwgcjN9CisJbGRyLncgcjAsID11bE1heFN5c2NhbGxJbnRlcnJ1cHRQcmlvcml0eUNvbnN0CisJbGRyIHIwLCBbcjBdCisJbXNyIGJhc2VwcmksIHIwCisJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CisJbW92IHIwLCAjMAorCW1zciBiYXNlcHJpLCByMAorCWxkbWlhIHNwISwge3IwLCByM30KKworCTtUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLgorCWxkciByMSwgW3IzXQorCWxkciByMCwgW3IxXQorCisJO1BvcCB0aGUgY29yZSByZWdpc3RlcnMuCisJbGRtaWEgcjAhLCB7cjQtcjExLCByMTR9CisKKwk7SXMgdGhlIHRhc2sgdXNpbmcgdGhlIEZQVSBjb250ZXh0PyAgSWYgc28sIHBvcCB0aGUgaGlnaCB2ZnAgcmVnaXN0ZXJzIHRvby4KKwl0c3QgcjE0LCAjMHgxMAorCWl0IGVxCisJdmxkbWlhZXEgcjAhLCB7czE2LXMzMX0KKworCW1zciBwc3AsIHIwCisJaXNiCisJYnggcjE0CisKKwkuc2l6ZQlfdmVjdG9yXzE0LCAkLV92ZWN0b3JfMTQKKwkuZW5kc2VjCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7IFRoaXMgZnVuY3Rpb24gaXMgYW4gWE1DNDAwMCBzaWxpY29uIGVycmF0YSB3b3JrYXJvdW5kLiAgSXQgd2lsbCBnZXQgdXNlZCB3aGVuCis7IHRoZSBTSUxJQ09OX0JVR19QTUNfQ01fMDAxIGxpbmtlciBtYWNybyBpcyBkZWZpbmVkLgorCS5zZWN0aW9uIC50ZXh0CisJLnRodW1iCisJLmFsaWduIDQKK19sY19yZWZfX3ZlY3Rvcl9wcF8xNDogLnR5cGUgZnVuYworCisJbXJzIHIwLCBwc3AKKwlpc2IKKworCTtHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4KKwlsZHIudwlyMywgPXB4Q3VycmVudFRDQgorCWxkcglyMiwgW3IzXQorCisJO0lzIHRoZSB0YXNrIHVzaW5nIHRoZSBGUFUgY29udGV4dD8gIElmIHNvLCBwdXNoIGhpZ2ggdmZwIHJlZ2lzdGVycy4KKwl0c3QgcjE0LCAjMHgxMAorCWl0IGVxCisJdnN0bWRiZXEgcjAhLCB7czE2LXMzMX0KKworCTtTYXZlIHRoZSBjb3JlIHJlZ2lzdGVycy4KKwlzdG1kYiByMCEsIHtyNC1yMTEsIHIxNH0KKworCTtTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGludG8gdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgVENCLgorCXN0ciByMCwgW3IyXQorCisJc3RtZGIgc3AhLCB7cjN9CisJbGRyLncgcjAsID11bE1heFN5c2NhbGxJbnRlcnJ1cHRQcmlvcml0eUNvbnN0CisJbGRyIHIwLCBbcjBdCisJbXNyIGJhc2VwcmksIHIwCisJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CisJbW92IHIwLCAjMAorCW1zciBiYXNlcHJpLCByMAorCWxkbWlhIHNwISwge3IzfQorCisJO1RoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suCisJbGRyIHIxLCBbcjNdCisJbGRyIHIwLCBbcjFdCisKKwk7UG9wIHRoZSBjb3JlIHJlZ2lzdGVycy4KKwlsZG1pYSByMCEsIHtyNC1yMTEsIHIxNH0KKworCTtJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcG9wIHRoZSBoaWdoIHZmcCByZWdpc3RlcnMgdG9vLgorCXRzdCByMTQsICMweDEwCisJaXQgZXEKKwl2bGRtaWFlcSByMCEsIHtzMTYtczMxfQorCisJbXNyIHBzcCwgcjAKKwlpc2IKKwlwdXNoIHsgbHIgfQorCXBvcCB7IHBjIH0gOyBYTUM0MDAwIHNwZWNpZmljIGVycmF0YSB3b3JrYXJvdW5kLiAgRG8gbm90IHVzZWQgImJ4IGxyIiBoZXJlLgorCisJLnNpemUJX2xjX3JlZl9fdmVjdG9yX3BwXzE0LCAkLV9sY19yZWZfX3ZlY3Rvcl9wcF8xNAorCS5lbmRzZWMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkuc2VjdGlvbiAudGV4dAorCS50aHVtYgorCS5hbGlnbiA0CitTVkNfSGFuZGxlcjogLnR5cGUgZnVuYworCTtHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4KKwlsZHIudwlyMywgPXB4Q3VycmVudFRDQgorCWxkciByMSwgW3IzXQorCWxkciByMCwgW3IxXQorCTtQb3AgdGhlIGNvcmUgcmVnaXN0ZXJzLgorCWxkbWlhIHIwISwge3I0LXIxMSwgcjE0fQorCW1zciBwc3AsIHIwCisJaXNiCisJbW92IHIwLCAjMAorCW1zcgliYXNlcHJpLCByMAorCWJ4IHIxNAorCS5zaXplCVNWQ19IYW5kbGVyLCAkLVNWQ19IYW5kbGVyCisJLmVuZHNlYworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS5zZWN0aW9uIC50ZXh0CisJLnRodW1iCisJLmFsaWduIDQKK3ZQb3J0U3RhcnRGaXJzdFRhc2sgLnR5cGUgZnVuYworCTtVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suCisJbGRyLncgcjAsID0weEUwMDBFRDA4CisJbGRyIHIwLCBbcjBdCisJbGRyIHIwLCBbcjBdCisJO1NldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4KKwltc3IgbXNwLCByMAorCTtDYWxsIFNWQyB0byBzdGFydCB0aGUgZmlyc3QgdGFzay4KKwljcHNpZSBpCisJY3BzaWUgZgorCWRzYgorCWlzYgorCXN2YyAwCisJLnNpemUJdlBvcnRTdGFydEZpcnN0VGFzaywgJC12UG9ydFN0YXJ0Rmlyc3RUYXNrCisJLmVuZHNlYworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCS5zZWN0aW9uIC50ZXh0CisJLnRodW1iCisJLmFsaWduIDQKK3ZQb3J0RW5hYmxlVkZQIC50eXBlIGZ1bmMKKwk7VGhlIEZQVSBlbmFibGUgYml0cyBhcmUgaW4gdGhlIENQQUNSLgorCWxkci53IHIwLCA9MHhFMDAwRUQ4OAorCWxkcglyMSwgW3IwXQorCisJO0VuYWJsZSBDUDEwIGFuZCBDUDExIGNvcHJvY2Vzc29ycywgdGhlbiBzYXZlIGJhY2suCisJb3JyCXIxLCByMSwgIyggMHhmIDw8IDIwICkKKwlzdHIgcjEsIFtyMF0KKwlieAlyMTQKKwkuc2l6ZQl2UG9ydEVuYWJsZVZGUCwgJC12UG9ydEVuYWJsZVZGUAorCS5lbmRzZWMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkuc2VjdGlvbiAudGV4dAorCS50aHVtYgorCS5hbGlnbiA0Cit1bFBvcnRTZXRJbnRlcnJ1cHRNYXNrOgorCW1ycyByMCwgYmFzZXByaQorCWxkci53IHIxLCA9dWxNYXhTeXNjYWxsSW50ZXJydXB0UHJpb3JpdHlDb25zdAorCWxkciByMSwgW3IxXQorCW1zciBiYXNlcHJpLCByMQorCWJ4IHIxNAorCS5zaXplCXVsUG9ydFNldEludGVycnVwdE1hc2ssICQtdWxQb3J0U2V0SW50ZXJydXB0TWFzaworCS5lbmRzZWMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkuc2VjdGlvbiAudGV4dAorCS50aHVtYgorCS5hbGlnbiA0Cit2UG9ydENsZWFySW50ZXJydXB0TWFzazoKKwltc3IgYmFzZXByaSwgcjAKKwlieCByMTQKKwkuc2l6ZQl2UG9ydENsZWFySW50ZXJydXB0TWFzaywgJC12UG9ydENsZWFySW50ZXJydXB0TWFzaworCS5lbmRzZWMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkuZW5kCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9UYXNraW5nL0FSTV9DTTRGL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL1Rhc2tpbmcvQVJNX0NNNEYvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjNTY3MAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9UYXNraW5nL0FSTV9DTTRGL3BvcnRtYWNyby5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZQorICogZ2l2ZW4gaGFyZHdhcmUgYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBUeXBlIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBwb3J0Q0hBUgkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFIFN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nIEJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUJhc2VUeXBlX3Q7CisKKworI2lmKCBjb25maWdVU0VfMTZfQklUX1RJQ0tTID09IDEgKQorCXR5cGVkZWYgdWludDE2X3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkgMHhmZmZmCisjZWxzZQorCXR5cGVkZWYgdWludDMyX3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkgMHhmZmZmZmZmZlVMCisKKwkvKiAzMi1iaXQgdGljayB0eXBlIG9uIGEgMzItYml0IGFyY2hpdGVjdHVyZSwgc28gcmVhZHMgb2YgdGhlIHRpY2sgY291bnQgZG8KKwlub3QgbmVlZCB0byBiZSBndWFyZGVkIHdpdGggYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCSNkZWZpbmUgcG9ydFRJQ0tfVFlQRV9JU19BVE9NSUMgMQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljcy4gKi8KKyNkZWZpbmUgcG9ydFNUQUNLX0dST1dUSAkJCSggLTEgKQorI2RlZmluZSBwb3J0VElDS19QRVJJT0RfTVMJCQkoICggVGlja1R5cGVfdCApIDEwMDAgLyBjb25maWdUSUNLX1JBVEVfSFogKQorI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlQJCQk4CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiBTY2hlZHVsZXIgdXRpbGl0aWVzLiAqLworZXh0ZXJuIHZvaWQgdlBvcnRZaWVsZCggdm9pZCApOworI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTAkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVAkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJCXZQb3J0WWllbGQoKQorCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkgaWYoIHhTd2l0Y2hSZXF1aXJlZCApICoocG9ydE5WSUNfSU5UX0NUUkwpID0gcG9ydE5WSUNfUEVORFNWU0VUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuICovCisKKy8qCisgKiBTZXQgYmFzZXByaSB0byBwb3J0TUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZIHdpdGhvdXQgZWZmZWN0aW5nIG90aGVyCisgKiByZWdpc3RlcnMuICByMCBpcyBjbG9iYmVyZWQuCisgKi8KKyNkZWZpbmUgcG9ydFNFVF9JTlRFUlJVUFRfTUFTSygpIF9fc2V0X0JBU0VQUkkoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApCisKKy8qCisgKiBTZXQgYmFzZXByaSBiYWNrIHRvIDAgd2l0aG91dCBlZmZlY3RpdmUgb3RoZXIgcmVnaXN0ZXJzLgorICogcjAgaXMgY2xvYmJlcmVkLiAgRkFROiAgU2V0dGluZyBCQVNFUFJJIHRvIDAgaXMgbm90IGEgYnVnLiAgUGxlYXNlIHNlZQorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCBiZWZvcmUgZGlzYWdyZWVpbmcuCisgKi8KKyNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLKCkgX19zZXRfQkFTRVBSSSggMCApCisKK2V4dGVybiB1aW50MzJfdCB1bFBvcnRTZXRJbnRlcnJ1cHRNYXNrKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydENsZWFySW50ZXJydXB0TWFzayggdWludDMyX3QgdWxOZXdNYXNrICk7CisjZGVmaW5lIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQkJdWxQb3J0U2V0SW50ZXJydXB0TWFzaygpCisjZGVmaW5lIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUih4KQl2UG9ydENsZWFySW50ZXJydXB0TWFzayggeCApCisKKworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApOworCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQlwb3J0U0VUX0lOVEVSUlVQVF9NQVNLKCkKKyNkZWZpbmUgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCkJCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTSygpCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGFzayBmdW5jdGlvbiBtYWNyb3MgYXMgZGVzY3JpYmVkIG9uIHRoZSBGcmVlUlRPUy5vcmcgV0VCIHNpdGUuICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApIHZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKSB2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKworI2RlZmluZSBwb3J0Tk9QKCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9yZWFkbWUudHh0IGIvU291cmNlL3BvcnRhYmxlL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4ZDJkNQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMjAgQEAKK0VhY2ggcmVhbCB0aW1lIGtlcm5lbCBwb3J0IGNvbnNpc3RzIG9mIHRocmVlIGZpbGVzIHRoYXQgY29udGFpbiB0aGUgY29yZSBrZXJuZWwKK2NvbXBvbmVudHMgYW5kIGFyZSBjb21tb24gdG8gZXZlcnkgcG9ydCwgYW5kIG9uZSBvciBtb3JlIGZpbGVzIHRoYXQgYXJlCitzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgbWljcm9jb250cm9sbGVyIGFuZC9vciBjb21waWxlci4KKworCisrIFRoZSBGcmVlUlRPUy9Tb3VyY2UvUG9ydGFibGUvTWVtTWFuZyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGZpdmUgc2FtcGxlCittZW1vcnkgYWxsb2NhdG9ycyBhcyBkZXNjcmliZWQgb24gdGhlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIFdFQiBzaXRlLgorCisrIFRoZSBvdGhlciBkaXJlY3RvcmllcyBlYWNoIGNvbnRhaW4gZmlsZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyCittaWNyb2NvbnRyb2xsZXIgb3IgY29tcGlsZXIsIHdoZXJlIHRoZSBkaXJlY3RvcnkgbmFtZSBkZW5vdGVzIHRoZSBjb21waWxlcgorc3BlY2lmaWMgZmlsZXMgdGhlIGRpcmVjdG9yeSBjb250YWlucy4KKworCisKK0ZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIFtjb21waWxlcl0gcG9ydCBmb3IgdGhlIFthcmNoaXRlY3R1cmVdCittaWNyb2NvbnRyb2xsZXIsIHRoZW4gdGhlIHBvcnQgc3BlY2lmaWMgZmlsZXMgYXJlIGNvbnRhaW5lZCBpbgorRnJlZVJUT1MvU291cmNlL1BvcnRhYmxlL1tjb21waWxlcl0vW2FyY2hpdGVjdHVyZV0gZGlyZWN0b3J5LiAgSWYgdGhpcyBpcyB0aGUKK29ubHkgcG9ydCB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdGhlbiBhbGwgdGhlIG90aGVyIGRpcmVjdG9yaWVzIGNhbiBiZQoraWdub3JlZC4KKwpkaWZmIC0tZ2l0IGEvU291cmNlL3F1ZXVlLmMgYi9Tb3VyY2UvcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzMwOTUwCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3F1ZXVlLmMKQEAgLTAsMCArMSwyOTA4IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCithbGwgdGhlIEFQSSBmdW5jdGlvbnMgdG8gdXNlIHRoZSBNUFUgd3JhcHBlcnMuICBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgordGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisKKyNpZiAoIGNvbmZpZ1VTRV9DT19ST1VUSU5FUyA9PSAxICkKKwkjaW5jbHVkZSAiY3JvdXRpbmUuaCIKKyNlbmRpZgorCisvKiBMaW50IGU5NjEgYW5kIGU3NTAgYXJlIHN1cHByZXNzZWQgYXMgYSBNSVNSQSBleGNlcHRpb24ganVzdGlmaWVkIGJlY2F1c2UgdGhlCitNUFUgcG9ydHMgcmVxdWlyZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSB0byBiZSBkZWZpbmVkIGZvciB0aGUKK2hlYWRlciBmaWxlcyBhYm92ZSwgYnV0IG5vdCBpbiB0aGlzIGZpbGUsIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0Citwcml2aWxlZ2VkIFZzIHVucHJpdmlsZWdlZCBsaW5rYWdlIGFuZCBwbGFjZW1lbnQuICovCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgLypsaW50ICFlOTYxICFlNzUwLiAqLworCisKKy8qIENvbnN0YW50cyB1c2VkIHdpdGggdGhlIGNSeExvY2sgYW5kIGNUeExvY2sgc3RydWN0dXJlIG1lbWJlcnMuICovCisjZGVmaW5lIHF1ZXVlVU5MT0NLRUQJCQkJCSggKCBpbnQ4X3QgKSAtMSApCisjZGVmaW5lIHF1ZXVlTE9DS0VEX1VOTU9ESUZJRUQJCQkoICggaW50OF90ICkgMCApCisKKy8qIFdoZW4gdGhlIFF1ZXVlX3Qgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgYmFzZSBxdWV1ZSBpdHMgcGNIZWFkIGFuZAorcGNUYWlsIG1lbWJlcnMgYXJlIHVzZWQgYXMgcG9pbnRlcnMgaW50byB0aGUgcXVldWUgc3RvcmFnZSBhcmVhLiAgV2hlbiB0aGUKK1F1ZXVlX3Qgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgbXV0ZXggcGNIZWFkIGFuZCBwY1RhaWwgcG9pbnRlcnMgYXJlCitub3QgbmVjZXNzYXJ5LCBhbmQgdGhlIHBjSGVhZCBwb2ludGVyIGlzIHNldCB0byBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlCitwY1RhaWwgcG9pbnRlciBhY3R1YWxseSBwb2ludHMgdG8gdGhlIG11dGV4IGhvbGRlciAoaWYgYW55KS4gIE1hcCBhbHRlcm5hdGl2ZQorbmFtZXMgdG8gdGhlIHBjSGVhZCBhbmQgcGNUYWlsIHN0cnVjdHVyZSBtZW1iZXJzIHRvIGVuc3VyZSB0aGUgcmVhZGFiaWxpdHkgb2YKK3RoZSBjb2RlIGlzIG1haW50YWluZWQgZGVzcGl0ZSB0aGlzIGR1YWwgdXNlIG9mIHR3byBzdHJ1Y3R1cmUgbWVtYmVycy4gIEFuCithbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZSB0byB1c2UgYSB1bmlvbiwgYnV0IHVzZSBvZiBhIHVuaW9uIGlzCithZ2FpbnN0IHRoZSBjb2Rpbmcgc3RhbmRhcmQgKGFsdGhvdWdoIGFuIGV4Y2VwdGlvbiB0byB0aGUgc3RhbmRhcmQgaGFzIGJlZW4KK3Blcm1pdHRlZCB3aGVyZSB0aGUgZHVhbCB1c2UgYWxzbyBzaWduaWZpY2FudGx5IGNoYW5nZXMgdGhlIHR5cGUgb2YgdGhlCitzdHJ1Y3R1cmUgbWVtYmVyKS4gKi8KKyNkZWZpbmUgcHhNdXRleEhvbGRlcgkJCQkJcGNUYWlsCisjZGVmaW5lIHV4UXVldWVUeXBlCQkJCQkJcGNIZWFkCisjZGVmaW5lIHF1ZXVlUVVFVUVfSVNfTVVURVgJCQkJTlVMTAorCisvKiBTZW1hcGhvcmVzIGRvIG5vdCBhY3R1YWxseSBzdG9yZSBvciBjb3B5IGRhdGEsIHNvIGhhdmUgYW4gaXRlbSBzaXplIG9mCit6ZXJvLiAqLworI2RlZmluZSBxdWV1ZVNFTUFQSE9SRV9RVUVVRV9JVEVNX0xFTkdUSCAoICggVUJhc2VUeXBlX3QgKSAwICkKKyNkZWZpbmUgcXVldWVNVVRFWF9HSVZFX0JMT0NLX1RJTUUJCSAoICggVGlja1R5cGVfdCApIDBVICkKKworI2lmKCBjb25maWdVU0VfUFJFRU1QVElPTiA9PSAwICkKKwkvKiBJZiB0aGUgY29vcGVyYXRpdmUgc2NoZWR1bGVyIGlzIGJlaW5nIHVzZWQgdGhlbiBhIHlpZWxkIHNob3VsZCBub3QgYmUKKwlwZXJmb3JtZWQganVzdCBiZWNhdXNlIGEgaGlnaGVyIHByaW9yaXR5IHRhc2sgaGFzIGJlZW4gd29rZW4uICovCisJI2RlZmluZSBxdWV1ZVlJRUxEX0lGX1VTSU5HX1BSRUVNUFRJT04oKQorI2Vsc2UKKwkjZGVmaW5lIHF1ZXVlWUlFTERfSUZfVVNJTkdfUFJFRU1QVElPTigpIHBvcnRZSUVMRF9XSVRISU5fQVBJKCkKKyNlbmRpZgorCisvKgorICogRGVmaW5pdGlvbiBvZiB0aGUgcXVldWUgdXNlZCBieSB0aGUgc2NoZWR1bGVyLgorICogSXRlbXMgYXJlIHF1ZXVlZCBieSBjb3B5LCBub3QgcmVmZXJlbmNlLiAgU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgdGhlCisgKiByYXRpb25hbGU6IGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL0VtYmVkZGVkLVJUT1MtUXVldWVzLmh0bWwKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUXVldWVEZWZpbml0aW9uCit7CisJaW50OF90ICpwY0hlYWQ7CQkJCQkvKjwgUG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlIHN0b3JhZ2UgYXJlYS4gKi8KKwlpbnQ4X3QgKnBjVGFpbDsJCQkJCS8qPCBQb2ludHMgdG8gdGhlIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgcXVldWUgc3RvcmFnZSBhcmVhLiAgT25jZSBtb3JlIGJ5dGUgaXMgYWxsb2NhdGVkIHRoYW4gbmVjZXNzYXJ5IHRvIHN0b3JlIHRoZSBxdWV1ZSBpdGVtcywgdGhpcyBpcyB1c2VkIGFzIGEgbWFya2VyLiAqLworCWludDhfdCAqcGNXcml0ZVRvOwkJCQkvKjwgUG9pbnRzIHRvIHRoZSBmcmVlIG5leHQgcGxhY2UgaW4gdGhlIHN0b3JhZ2UgYXJlYS4gKi8KKworCXVuaW9uCQkJCQkJCS8qIFVzZSBvZiBhIHVuaW9uIGlzIGFuIGV4Y2VwdGlvbiB0byB0aGUgY29kaW5nIHN0YW5kYXJkIHRvIGVuc3VyZSB0d28gbXV0dWFsbHkgZXhjbHVzaXZlIHN0cnVjdHVyZSBtZW1iZXJzIGRvbid0IGFwcGVhciBzaW11bHRhbmVvdXNseSAod2FzdGluZyBSQU0pLiAqLworCXsKKwkJaW50OF90ICpwY1JlYWRGcm9tOwkJCS8qPCBQb2ludHMgdG8gdGhlIGxhc3QgcGxhY2UgdGhhdCBhIHF1ZXVlZCBpdGVtIHdhcyByZWFkIGZyb20gd2hlbiB0aGUgc3RydWN0dXJlIGlzIHVzZWQgYXMgYSBxdWV1ZS4gKi8KKwkJVUJhc2VUeXBlX3QgdXhSZWN1cnNpdmVDYWxsQ291bnQ7Lyo8IE1haW50YWlucyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdGltZXMgYSByZWN1cnNpdmUgbXV0ZXggaGFzIGJlZW4gcmVjdXJzaXZlbHkgJ3Rha2VuJyB3aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyBhIG11dGV4LiAqLworCX0gdTsKKworCUxpc3RfdCB4VGFza3NXYWl0aW5nVG9TZW5kOwkJLyo8IExpc3Qgb2YgdGFza3MgdGhhdCBhcmUgYmxvY2tlZCB3YWl0aW5nIHRvIHBvc3Qgb250byB0aGlzIHF1ZXVlLiAgU3RvcmVkIGluIHByaW9yaXR5IG9yZGVyLiAqLworCUxpc3RfdCB4VGFza3NXYWl0aW5nVG9SZWNlaXZlOwkvKjwgTGlzdCBvZiB0YXNrcyB0aGF0IGFyZSBibG9ja2VkIHdhaXRpbmcgdG8gcmVhZCBmcm9tIHRoaXMgcXVldWUuICBTdG9yZWQgaW4gcHJpb3JpdHkgb3JkZXIuICovCisKKwl2b2xhdGlsZSBVQmFzZVR5cGVfdCB1eE1lc3NhZ2VzV2FpdGluZzsvKjwgVGhlIG51bWJlciBvZiBpdGVtcyBjdXJyZW50bHkgaW4gdGhlIHF1ZXVlLiAqLworCVVCYXNlVHlwZV90IHV4TGVuZ3RoOwkJCS8qPCBUaGUgbGVuZ3RoIG9mIHRoZSBxdWV1ZSBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgaXRlbXMgaXQgd2lsbCBob2xkLCBub3QgdGhlIG51bWJlciBvZiBieXRlcy4gKi8KKwlVQmFzZVR5cGVfdCB1eEl0ZW1TaXplOwkJCS8qPCBUaGUgc2l6ZSBvZiBlYWNoIGl0ZW1zIHRoYXQgdGhlIHF1ZXVlIHdpbGwgaG9sZC4gKi8KKworCXZvbGF0aWxlIGludDhfdCBjUnhMb2NrOwkJLyo8IFN0b3JlcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHJlY2VpdmVkIGZyb20gdGhlIHF1ZXVlIChyZW1vdmVkIGZyb20gdGhlIHF1ZXVlKSB3aGlsZSB0aGUgcXVldWUgd2FzIGxvY2tlZC4gIFNldCB0byBxdWV1ZVVOTE9DS0VEIHdoZW4gdGhlIHF1ZXVlIGlzIG5vdCBsb2NrZWQuICovCisJdm9sYXRpbGUgaW50OF90IGNUeExvY2s7CQkvKjwgU3RvcmVzIHRoZSBudW1iZXIgb2YgaXRlbXMgdHJhbnNtaXR0ZWQgdG8gdGhlIHF1ZXVlIChhZGRlZCB0byB0aGUgcXVldWUpIHdoaWxlIHRoZSBxdWV1ZSB3YXMgbG9ja2VkLiAgU2V0IHRvIHF1ZXVlVU5MT0NLRUQgd2hlbiB0aGUgcXVldWUgaXMgbm90IGxvY2tlZC4gKi8KKworCSNpZiggKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKSApCisJCXVpbnQ4X3QgdWNTdGF0aWNhbGx5QWxsb2NhdGVkOwkvKjwgU2V0IHRvIHBkVFJVRSBpZiB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIHF1ZXVlIHdhcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0byBlbnN1cmUgbm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGZyZWUgdGhlIG1lbW9yeS4gKi8KKwkjZW5kaWYKKworCSNpZiAoIGNvbmZpZ1VTRV9RVUVVRV9TRVRTID09IDEgKQorCQlzdHJ1Y3QgUXVldWVEZWZpbml0aW9uICpweFF1ZXVlU2V0Q29udGFpbmVyOworCSNlbmRpZgorCisJI2lmICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCQlVQmFzZVR5cGVfdCB1eFF1ZXVlTnVtYmVyOworCQl1aW50OF90IHVjUXVldWVUeXBlOworCSNlbmRpZgorCit9IHhRVUVVRTsKKworLyogVGhlIG9sZCB4UVVFVUUgbmFtZSBpcyBtYWludGFpbmVkIGFib3ZlIHRoZW4gdHlwZWRlZmVkIHRvIHRoZSBuZXcgUXVldWVfdAorbmFtZSBiZWxvdyB0byBlbmFibGUgdGhlIHVzZSBvZiBvbGRlciBrZXJuZWwgYXdhcmUgZGVidWdnZXJzLiAqLwordHlwZWRlZiB4UVVFVUUgUXVldWVfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUaGUgcXVldWUgcmVnaXN0cnkgaXMganVzdCBhIG1lYW5zIGZvciBrZXJuZWwgYXdhcmUgZGVidWdnZXJzIHRvIGxvY2F0ZQorICogcXVldWUgc3RydWN0dXJlcy4gIEl0IGhhcyBubyBvdGhlciBwdXJwb3NlIHNvIGlzIGFuIG9wdGlvbmFsIGNvbXBvbmVudC4KKyAqLworI2lmICggY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDAgKQorCisJLyogVGhlIHR5cGUgc3RvcmVkIHdpdGhpbiB0aGUgcXVldWUgcmVnaXN0cnkgYXJyYXkuICBUaGlzIGFsbG93cyBhIG5hbWUKKwl0byBiZSBhc3NpZ25lZCB0byBlYWNoIHF1ZXVlIG1ha2luZyBrZXJuZWwgYXdhcmUgZGVidWdnaW5nIGEgbGl0dGxlCisJbW9yZSB1c2VyIGZyaWVuZGx5LiAqLworCXR5cGVkZWYgc3RydWN0IFFVRVVFX1JFR0lTVFJZX0lURU0KKwl7CisJCWNvbnN0IGNoYXIgKnBjUXVldWVOYW1lOyAvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KKwkJUXVldWVIYW5kbGVfdCB4SGFuZGxlOworCX0geFF1ZXVlUmVnaXN0cnlJdGVtOworCisJLyogVGhlIG9sZCB4UXVldWVSZWdpc3RyeUl0ZW0gbmFtZSBpcyBtYWludGFpbmVkIGFib3ZlIHRoZW4gdHlwZWRlZmVkIHRvIHRoZQorCW5ldyB4UXVldWVSZWdpc3RyeUl0ZW0gbmFtZSBiZWxvdyB0byBlbmFibGUgdGhlIHVzZSBvZiBvbGRlciBrZXJuZWwgYXdhcmUKKwlkZWJ1Z2dlcnMuICovCisJdHlwZWRlZiB4UXVldWVSZWdpc3RyeUl0ZW0gUXVldWVSZWdpc3RyeUl0ZW1fdDsKKworCS8qIFRoZSBxdWV1ZSByZWdpc3RyeSBpcyBzaW1wbHkgYW4gYXJyYXkgb2YgUXVldWVSZWdpc3RyeUl0ZW1fdCBzdHJ1Y3R1cmVzLgorCVRoZSBwY1F1ZXVlTmFtZSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgYmVpbmcgTlVMTCBpcyBpbmRpY2F0aXZlIG9mIHRoZQorCWFycmF5IHBvc2l0aW9uIGJlaW5nIHZhY2FudC4gKi8KKwlQUklWSUxFR0VEX0RBVEEgUXVldWVSZWdpc3RyeUl0ZW1fdCB4UXVldWVSZWdpc3RyeVsgY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSBdOworCisjZW5kaWYgLyogY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSAqLworCisvKgorICogVW5sb2NrcyBhIHF1ZXVlIGxvY2tlZCBieSBhIGNhbGwgdG8gcHJ2TG9ja1F1ZXVlLiAgTG9ja2luZyBhIHF1ZXVlIGRvZXMgbm90CisgKiBwcmV2ZW50IGFuIElTUiBmcm9tIGFkZGluZyBvciByZW1vdmluZyBpdGVtcyB0byB0aGUgcXVldWUsIGJ1dCBkb2VzIHByZXZlbnQKKyAqIGFuIElTUiBmcm9tIHJlbW92aW5nIHRhc2tzIGZyb20gdGhlIHF1ZXVlIGV2ZW50IGxpc3RzLiAgSWYgYW4gSVNSIGZpbmRzIGEKKyAqIHF1ZXVlIGlzIGxvY2tlZCBpdCB3aWxsIGluc3RlYWQgaW5jcmVtZW50IHRoZSBhcHByb3ByaWF0ZSBxdWV1ZSBsb2NrIGNvdW50CisgKiB0byBpbmRpY2F0ZSB0aGF0IGEgdGFzayBtYXkgcmVxdWlyZSB1bmJsb2NraW5nLiAgV2hlbiB0aGUgcXVldWUgaW4gdW5sb2NrZWQKKyAqIHRoZXNlIGxvY2sgY291bnRzIGFyZSBpbnNwZWN0ZWQsIGFuZCB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIHRha2VuLgorICovCitzdGF0aWMgdm9pZCBwcnZVbmxvY2tRdWV1ZSggUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogVXNlcyBhIGNyaXRpY2FsIHNlY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGFueSBkYXRhIGluIGEgcXVldWUuCisgKgorICogQHJldHVybiBwZFRSVUUgaWYgdGhlIHF1ZXVlIGNvbnRhaW5zIG5vIGl0ZW1zLCBvdGhlcndpc2UgcGRGQUxTRS4KKyAqLworc3RhdGljIEJhc2VUeXBlX3QgcHJ2SXNRdWV1ZUVtcHR5KCBjb25zdCBRdWV1ZV90ICpweFF1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFVzZXMgYSBjcml0aWNhbCBzZWN0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhbnkgc3BhY2UgaW4gYSBxdWV1ZS4KKyAqCisgKiBAcmV0dXJuIHBkVFJVRSBpZiB0aGVyZSBpcyBubyBzcGFjZSwgb3RoZXJ3aXNlIHBkRkFMU0U7CisgKi8KK3N0YXRpYyBCYXNlVHlwZV90IHBydklzUXVldWVGdWxsKCBjb25zdCBRdWV1ZV90ICpweFF1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIENvcGllcyBhbiBpdGVtIGludG8gdGhlIHF1ZXVlLCBlaXRoZXIgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBvciB0aGUKKyAqIGJhY2sgb2YgdGhlIHF1ZXVlLgorICovCitzdGF0aWMgQmFzZVR5cGVfdCBwcnZDb3B5RGF0YVRvUXVldWUoIFF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlLCBjb25zdCB2b2lkICpwdkl0ZW1Ub1F1ZXVlLCBjb25zdCBCYXNlVHlwZV90IHhQb3NpdGlvbiApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBDb3BpZXMgYW4gaXRlbSBvdXQgb2YgYSBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgcHJ2Q29weURhdGFGcm9tUXVldWUoIFF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlLCB2b2lkICogY29uc3QgcHZCdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjaWYgKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkKKwkvKgorCSAqIENoZWNrcyB0byBzZWUgaWYgYSBxdWV1ZSBpcyBhIG1lbWJlciBvZiBhIHF1ZXVlIHNldCwgYW5kIGlmIHNvLCBub3RpZmllcworCSAqIHRoZSBxdWV1ZSBzZXQgdGhhdCB0aGUgcXVldWUgY29udGFpbnMgZGF0YS4KKwkgKi8KKwlzdGF0aWMgQmFzZVR5cGVfdCBwcnZOb3RpZnlRdWV1ZVNldENvbnRhaW5lciggY29uc3QgUXVldWVfdCAqIGNvbnN0IHB4UXVldWUsIGNvbnN0IEJhc2VUeXBlX3QgeENvcHlQb3NpdGlvbiApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYKKworLyoKKyAqIENhbGxlZCBhZnRlciBhIFF1ZXVlX3Qgc3RydWN0dXJlIGhhcyBiZWVuIGFsbG9jYXRlZCBlaXRoZXIgc3RhdGljYWxseSBvcgorICogZHluYW1pY2FsbHkgdG8gZmlsbCBpbiB0aGUgc3RydWN0dXJlJ3MgbWVtYmVycy4KKyAqLworc3RhdGljIHZvaWQgcHJ2SW5pdGlhbGlzZU5ld1F1ZXVlKCBjb25zdCBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLCBjb25zdCBVQmFzZVR5cGVfdCB1eEl0ZW1TaXplLCB1aW50OF90ICpwdWNRdWV1ZVN0b3JhZ2UsIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUsIFF1ZXVlX3QgKnB4TmV3UXVldWUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogTXV0ZXhlcyBhcmUgYSBzcGVjaWFsIHR5cGUgb2YgcXVldWUuICBXaGVuIGEgbXV0ZXggaXMgY3JlYXRlZCwgZmlyc3QgdGhlCisgKiBxdWV1ZSBpcyBjcmVhdGVkLCB0aGVuIHBydkluaXRpYWxpc2VNdXRleCgpIGlzIGNhbGxlZCB0byBjb25maWd1cmUgdGhlIHF1ZXVlCisgKiBhcyBhIG11dGV4LgorICovCisjaWYoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKQorCXN0YXRpYyB2b2lkIHBydkluaXRpYWxpc2VNdXRleCggUXVldWVfdCAqcHhOZXdRdWV1ZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYKKworI2lmKCBjb25maWdVU0VfTVVURVhFUyA9PSAxICkKKwkvKgorCSAqIElmIGEgdGFzayB3YWl0aW5nIGZvciBhIG11dGV4IGNhdXNlcyB0aGUgbXV0ZXggaG9sZGVyIHRvIGluaGVyaXQgYQorCSAqIHByaW9yaXR5LCBidXQgdGhlIHdhaXRpbmcgdGFzayB0aW1lcyBvdXQsIHRoZW4gdGhlIGhvbGRlciBzaG91bGQKKwkgKiBkaXNpbmhlcml0IHRoZSBwcmlvcml0eSAtIGJ1dCBvbmx5IGRvd24gdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgb2YgYW55CisJICogb3RoZXIgdGFza3MgdGhhdCBhcmUgd2FpdGluZyBmb3IgdGhlIHNhbWUgbXV0ZXguICBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKwkgKiB0aGF0IHByaW9yaXR5LgorCSAqLworCXN0YXRpYyBVQmFzZVR5cGVfdCBwcnZHZXREaXNpbmhlcml0UHJpb3JpdHlBZnRlclRpbWVvdXQoIGNvbnN0IFF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBNYWNybyB0byBtYXJrIGEgcXVldWUgYXMgbG9ja2VkLiAgTG9ja2luZyBhIHF1ZXVlIHByZXZlbnRzIGFuIElTUiBmcm9tCisgKiBhY2Nlc3NpbmcgdGhlIHF1ZXVlIGV2ZW50IGxpc3RzLgorICovCisjZGVmaW5lIHBydkxvY2tRdWV1ZSggcHhRdWV1ZSApCQkJCQkJCQlcCisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCVwKKwkJaWYoICggcHhRdWV1ZSApLT5jUnhMb2NrID09IHF1ZXVlVU5MT0NLRUQgKQkJCVwKKwkJewkJCQkJCQkJCQkJCQlcCisJCQkoIHB4UXVldWUgKS0+Y1J4TG9jayA9IHF1ZXVlTE9DS0VEX1VOTU9ESUZJRUQ7CVwKKwkJfQkJCQkJCQkJCQkJCQlcCisJCWlmKCAoIHB4UXVldWUgKS0+Y1R4TG9jayA9PSBxdWV1ZVVOTE9DS0VEICkJCQlcCisJCXsJCQkJCQkJCQkJCQkJXAorCQkJKCBweFF1ZXVlICktPmNUeExvY2sgPSBxdWV1ZUxPQ0tFRF9VTk1PRElGSUVEOwlcCisJCX0JCQkJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQkJCVwKKwl0YXNrRVhJVF9DUklUSUNBTCgpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4UXVldWVHZW5lcmljUmVzZXQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBCYXNlVHlwZV90IHhOZXdRdWV1ZSApCit7CitRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworCisJY29uZmlnQVNTRVJUKCBweFF1ZXVlICk7CisKKwl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwl7CisJCXB4UXVldWUtPnBjVGFpbCA9IHB4UXVldWUtPnBjSGVhZCArICggcHhRdWV1ZS0+dXhMZW5ndGggKiBweFF1ZXVlLT51eEl0ZW1TaXplICk7CisJCXB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nID0gKCBVQmFzZVR5cGVfdCApIDBVOworCQlweFF1ZXVlLT5wY1dyaXRlVG8gPSBweFF1ZXVlLT5wY0hlYWQ7CisJCXB4UXVldWUtPnUucGNSZWFkRnJvbSA9IHB4UXVldWUtPnBjSGVhZCArICggKCBweFF1ZXVlLT51eExlbmd0aCAtICggVUJhc2VUeXBlX3QgKSAxVSApICogcHhRdWV1ZS0+dXhJdGVtU2l6ZSApOworCQlweFF1ZXVlLT5jUnhMb2NrID0gcXVldWVVTkxPQ0tFRDsKKwkJcHhRdWV1ZS0+Y1R4TG9jayA9IHF1ZXVlVU5MT0NLRUQ7CisKKwkJaWYoIHhOZXdRdWV1ZSA9PSBwZEZBTFNFICkKKwkJeworCQkJLyogSWYgdGhlcmUgYXJlIHRhc2tzIGJsb2NrZWQgd2FpdGluZyB0byByZWFkIGZyb20gdGhlIHF1ZXVlLCB0aGVuCisJCQl0aGUgdGFza3Mgd2lsbCByZW1haW4gYmxvY2tlZCBhcyBhZnRlciB0aGlzIGZ1bmN0aW9uIGV4aXRzIHRoZSBxdWV1ZQorCQkJd2lsbCBzdGlsbCBiZSBlbXB0eS4gIElmIHRoZXJlIGFyZSB0YXNrcyBibG9ja2VkIHdhaXRpbmcgdG8gd3JpdGUgdG8KKwkJCXRoZSBxdWV1ZSwgdGhlbiBvbmUgc2hvdWxkIGJlIHVuYmxvY2tlZCBhcyBhZnRlciB0aGlzIGZ1bmN0aW9uIGV4aXRzCisJCQlpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHdyaXRlIHRvIGl0LiAqLworCQkJaWYoIGxpc3RMSVNUX0lTX0VNUFRZKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9TZW5kICkgKSA9PSBwZEZBTFNFICkKKwkJCXsKKwkJCQlpZiggeFRhc2tSZW1vdmVGcm9tRXZlbnRMaXN0KCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9TZW5kICkgKSAhPSBwZEZBTFNFICkKKwkJCQl7CisJCQkJCXF1ZXVlWUlFTERfSUZfVVNJTkdfUFJFRU1QVElPTigpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIEVuc3VyZSB0aGUgZXZlbnQgcXVldWVzIHN0YXJ0IGluIHRoZSBjb3JyZWN0IHN0YXRlLiAqLworCQkJdkxpc3RJbml0aWFsaXNlKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9TZW5kICkgKTsKKwkJCXZMaXN0SW5pdGlhbGlzZSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICk7CisJCX0KKwl9CisJdGFza0VYSVRfQ1JJVElDQUwoKTsKKworCS8qIEEgdmFsdWUgaXMgcmV0dXJuZWQgZm9yIGNhbGxpbmcgc2VtYW50aWMgY29uc2lzdGVuY3kgd2l0aCBwcmV2aW91cworCXZlcnNpb25zLiAqLworCXJldHVybiBwZFBBU1M7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCisJUXVldWVIYW5kbGVfdCB4UXVldWVHZW5lcmljQ3JlYXRlU3RhdGljKCBjb25zdCBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLCBjb25zdCBVQmFzZVR5cGVfdCB1eEl0ZW1TaXplLCB1aW50OF90ICpwdWNRdWV1ZVN0b3JhZ2UsIFN0YXRpY1F1ZXVlX3QgKnB4U3RhdGljUXVldWUsIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUgKQorCXsKKwlRdWV1ZV90ICpweE5ld1F1ZXVlOworCisJCWNvbmZpZ0FTU0VSVCggdXhRdWV1ZUxlbmd0aCA+ICggVUJhc2VUeXBlX3QgKSAwICk7CisKKwkJLyogVGhlIFN0YXRpY1F1ZXVlX3Qgc3RydWN0dXJlIGFuZCB0aGUgcXVldWUgc3RvcmFnZSBhcmVhIG11c3QgYmUKKwkJc3VwcGxpZWQuICovCisJCWNvbmZpZ0FTU0VSVCggcHhTdGF0aWNRdWV1ZSAhPSBOVUxMICk7CisKKwkJLyogQSBxdWV1ZSBzdG9yYWdlIGFyZWEgc2hvdWxkIGJlIHByb3ZpZGVkIGlmIHRoZSBpdGVtIHNpemUgaXMgbm90IDAsIGFuZAorCQlzaG91bGQgbm90IGJlIHByb3ZpZGVkIGlmIHRoZSBpdGVtIHNpemUgaXMgMC4gKi8KKwkJY29uZmlnQVNTRVJUKCAhKCAoIHB1Y1F1ZXVlU3RvcmFnZSAhPSBOVUxMICkgJiYgKCB1eEl0ZW1TaXplID09IDAgKSApICk7CisJCWNvbmZpZ0FTU0VSVCggISggKCBwdWNRdWV1ZVN0b3JhZ2UgPT0gTlVMTCApICYmICggdXhJdGVtU2l6ZSAhPSAwICkgKSApOworCisJCSNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJCXsKKwkJCS8qIFNhbml0eSBjaGVjayB0aGF0IHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWNsYXJlIGEKKwkJCXZhcmlhYmxlIG9mIHR5cGUgU3RhdGljUXVldWVfdCBvciBTdGF0aWNTZW1hcGhvcmVfdCBlcXVhbHMgdGhlIHNpemUgb2YKKwkJCXRoZSByZWFsIHF1ZXVlIGFuZCBzZW1hcGhvcmUgc3RydWN0dXJlcy4gKi8KKwkJCXZvbGF0aWxlIHNpemVfdCB4U2l6ZSA9IHNpemVvZiggU3RhdGljUXVldWVfdCApOworCQkJY29uZmlnQVNTRVJUKCB4U2l6ZSA9PSBzaXplb2YoIFF1ZXVlX3QgKSApOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisJCS8qIFRoZSBhZGRyZXNzIG9mIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgcXVldWUgd2FzIHBhc3NlZCBpbiwgdXNlIGl0LgorCQlUaGUgYWRkcmVzcyBvZiBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHN0b3JhZ2UgYXJlYSB3YXMgYWxzbyBwYXNzZWQgaW4KKwkJYnV0IGlzIGFscmVhZHkgc2V0LiAqLworCQlweE5ld1F1ZXVlID0gKCBRdWV1ZV90ICogKSBweFN0YXRpY1F1ZXVlOyAvKmxpbnQgIWU3NDAgVW51c3VhbCBjYXN0IGlzIG9rIGFzIHRoZSBzdHJ1Y3R1cmVzIGFyZSBkZXNpZ25lZCB0byBoYXZlIHRoZSBzYW1lIGFsaWdubWVudCwgYW5kIHRoZSBzaXplIGlzIGNoZWNrZWQgYnkgYW4gYXNzZXJ0LiAqLworCisJCWlmKCBweE5ld1F1ZXVlICE9IE5VTEwgKQorCQl7CisJCQkjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCQkJeworCQkJCS8qIFF1ZXVlcyBjYW4gYmUgYWxsb2NhdGVkIHdpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBzbworCQkJCW5vdGUgdGhpcyBxdWV1ZSB3YXMgYWxsb2NhdGVkIHN0YXRpY2FsbHkgaW4gY2FzZSB0aGUgcXVldWUgaXMKKwkJCQlsYXRlciBkZWxldGVkLiAqLworCQkJCXB4TmV3UXVldWUtPnVjU3RhdGljYWxseUFsbG9jYXRlZCA9IHBkVFJVRTsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworCisJCQlwcnZJbml0aWFsaXNlTmV3UXVldWUoIHV4UXVldWVMZW5ndGgsIHV4SXRlbVNpemUsIHB1Y1F1ZXVlU3RvcmFnZSwgdWNRdWV1ZVR5cGUsIHB4TmV3UXVldWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRyYWNlUVVFVUVfQ1JFQVRFX0ZBSUxFRCggdWNRdWV1ZVR5cGUgKTsKKwkJfQorCisJCXJldHVybiBweE5ld1F1ZXVlOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCisJUXVldWVIYW5kbGVfdCB4UXVldWVHZW5lcmljQ3JlYXRlKCBjb25zdCBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLCBjb25zdCBVQmFzZVR5cGVfdCB1eEl0ZW1TaXplLCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlICkKKwl7CisJUXVldWVfdCAqcHhOZXdRdWV1ZTsKKwlzaXplX3QgeFF1ZXVlU2l6ZUluQnl0ZXM7CisJdWludDhfdCAqcHVjUXVldWVTdG9yYWdlOworCisJCWNvbmZpZ0FTU0VSVCggdXhRdWV1ZUxlbmd0aCA+ICggVUJhc2VUeXBlX3QgKSAwICk7CisKKwkJaWYoIHV4SXRlbVNpemUgPT0gKCBVQmFzZVR5cGVfdCApIDAgKQorCQl7CisJCQkvKiBUaGVyZSBpcyBub3QgZ29pbmcgdG8gYmUgYSBxdWV1ZSBzdG9yYWdlIGFyZWEuICovCisJCQl4UXVldWVTaXplSW5CeXRlcyA9ICggc2l6ZV90ICkgMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIEFsbG9jYXRlIGVub3VnaCBzcGFjZSB0byBob2xkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0CisJCQljYW4gYmUgaW4gdGhlIHF1ZXVlIGF0IGFueSB0aW1lLiAqLworCQkJeFF1ZXVlU2l6ZUluQnl0ZXMgPSAoIHNpemVfdCApICggdXhRdWV1ZUxlbmd0aCAqIHV4SXRlbVNpemUgKTsgLypsaW50ICFlOTYxIE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBvcnRzLiAqLworCQl9CisKKwkJcHhOZXdRdWV1ZSA9ICggUXVldWVfdCAqICkgcHZQb3J0TWFsbG9jKCBzaXplb2YoIFF1ZXVlX3QgKSArIHhRdWV1ZVNpemVJbkJ5dGVzICk7CisKKwkJaWYoIHB4TmV3UXVldWUgIT0gTlVMTCApCisJCXsKKwkJCS8qIEp1bXAgcGFzdCB0aGUgcXVldWUgc3RydWN0dXJlIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBxdWV1ZQorCQkJc3RvcmFnZSBhcmVhLiAqLworCQkJcHVjUXVldWVTdG9yYWdlID0gKCAoIHVpbnQ4X3QgKiApIHB4TmV3UXVldWUgKSArIHNpemVvZiggUXVldWVfdCApOworCisJCQkjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisJCQl7CisJCQkJLyogUXVldWVzIGNhbiBiZSBjcmVhdGVkIGVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBzbworCQkJCW5vdGUgdGhpcyB0YXNrIHdhcyBjcmVhdGVkIGR5bmFtaWNhbGx5IGluIGNhc2UgaXQgaXMgbGF0ZXIKKwkJCQlkZWxldGVkLiAqLworCQkJCXB4TmV3UXVldWUtPnVjU3RhdGljYWxseUFsbG9jYXRlZCA9IHBkRkFMU0U7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAqLworCisJCQlwcnZJbml0aWFsaXNlTmV3UXVldWUoIHV4UXVldWVMZW5ndGgsIHV4SXRlbVNpemUsIHB1Y1F1ZXVlU3RvcmFnZSwgdWNRdWV1ZVR5cGUsIHB4TmV3UXVldWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRyYWNlUVVFVUVfQ1JFQVRFX0ZBSUxFRCggdWNRdWV1ZVR5cGUgKTsKKwkJfQorCisJCXJldHVybiBweE5ld1F1ZXVlOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZJbml0aWFsaXNlTmV3UXVldWUoIGNvbnN0IFVCYXNlVHlwZV90IHV4UXVldWVMZW5ndGgsIGNvbnN0IFVCYXNlVHlwZV90IHV4SXRlbVNpemUsIHVpbnQ4X3QgKnB1Y1F1ZXVlU3RvcmFnZSwgY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSwgUXVldWVfdCAqcHhOZXdRdWV1ZSApCit7CisJLyogUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzIHNob3VsZAorCWNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSBub3QgYmUgc2V0IHRvIDEuICovCisJKCB2b2lkICkgdWNRdWV1ZVR5cGU7CisKKwlpZiggdXhJdGVtU2l6ZSA9PSAoIFVCYXNlVHlwZV90ICkgMCApCisJeworCQkvKiBObyBSQU0gd2FzIGFsbG9jYXRlZCBmb3IgdGhlIHF1ZXVlIHN0b3JhZ2UgYXJlYSwgYnV0IFBDIGhlYWQgY2Fubm90CisJCWJlIHNldCB0byBOVUxMIGJlY2F1c2UgTlVMTCBpcyB1c2VkIGFzIGEga2V5IHRvIHNheSB0aGUgcXVldWUgaXMgdXNlZCBhcworCQlhIG11dGV4LiAgVGhlcmVmb3JlIGp1c3Qgc2V0IHBjSGVhZCB0byBwb2ludCB0byB0aGUgcXVldWUgYXMgYSBiZW5pZ24KKwkJdmFsdWUgdGhhdCBpcyBrbm93biB0byBiZSB3aXRoaW4gdGhlIG1lbW9yeSBtYXAuICovCisJCXB4TmV3UXVldWUtPnBjSGVhZCA9ICggaW50OF90ICogKSBweE5ld1F1ZXVlOworCX0KKwllbHNlCisJeworCQkvKiBTZXQgdGhlIGhlYWQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBxdWV1ZSBzdG9yYWdlIGFyZWEuICovCisJCXB4TmV3UXVldWUtPnBjSGVhZCA9ICggaW50OF90ICogKSBwdWNRdWV1ZVN0b3JhZ2U7CisJfQorCisJLyogSW5pdGlhbGlzZSB0aGUgcXVldWUgbWVtYmVycyBhcyBkZXNjcmliZWQgd2hlcmUgdGhlIHF1ZXVlIHR5cGUgaXMKKwlkZWZpbmVkLiAqLworCXB4TmV3UXVldWUtPnV4TGVuZ3RoID0gdXhRdWV1ZUxlbmd0aDsKKwlweE5ld1F1ZXVlLT51eEl0ZW1TaXplID0gdXhJdGVtU2l6ZTsKKwkoIHZvaWQgKSB4UXVldWVHZW5lcmljUmVzZXQoIHB4TmV3UXVldWUsIHBkVFJVRSApOworCisJI2lmICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCXsKKwkJcHhOZXdRdWV1ZS0+dWNRdWV1ZVR5cGUgPSB1Y1F1ZXVlVHlwZTsKKwl9CisJI2VuZGlmIC8qIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSAqLworCisJI2lmKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkKKwl7CisJCXB4TmV3UXVldWUtPnB4UXVldWVTZXRDb250YWluZXIgPSBOVUxMOworCX0KKwkjZW5kaWYgLyogY29uZmlnVVNFX1FVRVVFX1NFVFMgKi8KKworCXRyYWNlUVVFVUVfQ1JFQVRFKCBweE5ld1F1ZXVlICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfTVVURVhFUyA9PSAxICkKKworCXN0YXRpYyB2b2lkIHBydkluaXRpYWxpc2VNdXRleCggUXVldWVfdCAqcHhOZXdRdWV1ZSApCisJeworCQlpZiggcHhOZXdRdWV1ZSAhPSBOVUxMICkKKwkJeworCQkJLyogVGhlIHF1ZXVlIGNyZWF0ZSBmdW5jdGlvbiB3aWxsIHNldCBhbGwgdGhlIHF1ZXVlIHN0cnVjdHVyZSBtZW1iZXJzCisJCQljb3JyZWN0bHkgZm9yIGEgZ2VuZXJpYyBxdWV1ZSwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgY3JlYXRpbmcgYQorCQkJbXV0ZXguICBPdmVyd3JpdGUgdGhvc2UgbWVtYmVycyB0aGF0IG5lZWQgdG8gYmUgc2V0IGRpZmZlcmVudGx5IC0KKwkJCWluIHBhcnRpY3VsYXIgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciBwcmlvcml0eSBpbmhlcml0YW5jZS4gKi8KKwkJCXB4TmV3UXVldWUtPnB4TXV0ZXhIb2xkZXIgPSBOVUxMOworCQkJcHhOZXdRdWV1ZS0+dXhRdWV1ZVR5cGUgPSBxdWV1ZVFVRVVFX0lTX01VVEVYOworCisJCQkvKiBJbiBjYXNlIHRoaXMgaXMgYSByZWN1cnNpdmUgbXV0ZXguICovCisJCQlweE5ld1F1ZXVlLT51LnV4UmVjdXJzaXZlQ2FsbENvdW50ID0gMDsKKworCQkJdHJhY2VDUkVBVEVfTVVURVgoIHB4TmV3UXVldWUgKTsKKworCQkJLyogU3RhcnQgd2l0aCB0aGUgc2VtYXBob3JlIGluIHRoZSBleHBlY3RlZCBzdGF0ZS4gKi8KKwkJCSggdm9pZCApIHhRdWV1ZUdlbmVyaWNTZW5kKCBweE5ld1F1ZXVlLCBOVUxMLCAoIFRpY2tUeXBlX3QgKSAwVSwgcXVldWVTRU5EX1RPX0JBQ0sgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRyYWNlQ1JFQVRFX01VVEVYX0ZBSUxFRCgpOworCQl9CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX01VVEVYRVMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKKworCVF1ZXVlSGFuZGxlX3QgeFF1ZXVlQ3JlYXRlTXV0ZXgoIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUgKQorCXsKKwlRdWV1ZV90ICpweE5ld1F1ZXVlOworCWNvbnN0IFVCYXNlVHlwZV90IHV4TXV0ZXhMZW5ndGggPSAoIFVCYXNlVHlwZV90ICkgMSwgdXhNdXRleFNpemUgPSAoIFVCYXNlVHlwZV90ICkgMDsKKworCQlweE5ld1F1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWVHZW5lcmljQ3JlYXRlKCB1eE11dGV4TGVuZ3RoLCB1eE11dGV4U2l6ZSwgdWNRdWV1ZVR5cGUgKTsKKwkJcHJ2SW5pdGlhbGlzZU11dGV4KCBweE5ld1F1ZXVlICk7CisKKwkJcmV0dXJuIHB4TmV3UXVldWU7CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX01VVEVYRVMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCisJUXVldWVIYW5kbGVfdCB4UXVldWVDcmVhdGVNdXRleFN0YXRpYyggY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSApCisJeworCVF1ZXVlX3QgKnB4TmV3UXVldWU7CisJY29uc3QgVUJhc2VUeXBlX3QgdXhNdXRleExlbmd0aCA9ICggVUJhc2VUeXBlX3QgKSAxLCB1eE11dGV4U2l6ZSA9ICggVUJhc2VUeXBlX3QgKSAwOworCisJCS8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMgaWYKKwkJY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZIGRvZXMgbm90IGVxdWFsIDEuICovCisJCSggdm9pZCApIHVjUXVldWVUeXBlOworCisJCXB4TmV3UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZUdlbmVyaWNDcmVhdGVTdGF0aWMoIHV4TXV0ZXhMZW5ndGgsIHV4TXV0ZXhTaXplLCBOVUxMLCBweFN0YXRpY1F1ZXVlLCB1Y1F1ZXVlVHlwZSApOworCQlwcnZJbml0aWFsaXNlTXV0ZXgoIHB4TmV3UXVldWUgKTsKKworCQlyZXR1cm4gcHhOZXdRdWV1ZTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfTVVURVhFUyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApICYmICggSU5DTFVERV94U2VtYXBob3JlR2V0TXV0ZXhIb2xkZXIgPT0gMSApICkKKworCXZvaWQqIHhRdWV1ZUdldE11dGV4SG9sZGVyKCBRdWV1ZUhhbmRsZV90IHhTZW1hcGhvcmUgKQorCXsKKwl2b2lkICpweFJldHVybjsKKworCQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB4U2VtYXBob3JlR2V0TXV0ZXhIb2xkZXIoKSwgYW5kIHNob3VsZCBub3QKKwkJYmUgY2FsbGVkIGRpcmVjdGx5LiAgTm90ZTogIFRoaXMgaXMgYSBnb29kIHdheSBvZiBkZXRlcm1pbmluZyBpZiB0aGUKKwkJY2FsbGluZyB0YXNrIGlzIHRoZSBtdXRleCBob2xkZXIsIGJ1dCBub3QgYSBnb29kIHdheSBvZiBkZXRlcm1pbmluZyB0aGUKKwkJaWRlbnRpdHkgb2YgdGhlIG11dGV4IGhvbGRlciwgYXMgdGhlIGhvbGRlciBtYXkgY2hhbmdlIGJldHdlZW4gdGhlCisJCWZvbGxvd2luZyBjcml0aWNhbCBzZWN0aW9uIGV4aXRpbmcgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5pbmcuICovCisJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQl7CisJCQlpZiggKCAoIFF1ZXVlX3QgKiApIHhTZW1hcGhvcmUgKS0+dXhRdWV1ZVR5cGUgPT0gcXVldWVRVUVVRV9JU19NVVRFWCApCisJCQl7CisJCQkJcHhSZXR1cm4gPSAoIHZvaWQgKiApICggKCBRdWV1ZV90ICogKSB4U2VtYXBob3JlICktPnB4TXV0ZXhIb2xkZXI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHhSZXR1cm4gPSBOVUxMOworCQkJfQorCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJcmV0dXJuIHB4UmV0dXJuOworCX0gLypsaW50ICFlODE4IHhTZW1hcGhvcmUgY2Fubm90IGJlIGEgcG9pbnRlciB0byBjb25zdCBiZWNhdXNlIGl0IGlzIGEgdHlwZWRlZi4gKi8KKworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggKCBjb25maWdVU0VfTVVURVhFUyA9PSAxICkgJiYgKCBJTkNMVURFX3hTZW1hcGhvcmVHZXRNdXRleEhvbGRlciA9PSAxICkgKQorCisJdm9pZCogeFF1ZXVlR2V0TXV0ZXhIb2xkZXJGcm9tSVNSKCBRdWV1ZUhhbmRsZV90IHhTZW1hcGhvcmUgKQorCXsKKwl2b2lkICpweFJldHVybjsKKworCQljb25maWdBU1NFUlQoIHhTZW1hcGhvcmUgKTsKKworCQkvKiBNdXRleGVzIGNhbm5vdCBiZSB1c2VkIGluIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzLCBzbyB0aGUgbXV0ZXgKKwkJaG9sZGVyIHNob3VsZCBub3QgY2hhbmdlIGluIGFuIElTUiwgYW5kIHRoZXJlZm9yZSBhIGNyaXRpY2FsIHNlY3Rpb24gaXMKKwkJbm90IHJlcXVpcmVkIGhlcmUuICovCisJCWlmKCAoICggUXVldWVfdCAqICkgeFNlbWFwaG9yZSApLT51eFF1ZXVlVHlwZSA9PSBxdWV1ZVFVRVVFX0lTX01VVEVYICkKKwkJeworCQkJcHhSZXR1cm4gPSAoIHZvaWQgKiApICggKCBRdWV1ZV90ICogKSB4U2VtYXBob3JlICktPnB4TXV0ZXhIb2xkZXI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlweFJldHVybiA9IE5VTEw7CisJCX0KKworCQlyZXR1cm4gcHhSZXR1cm47CisJfSAvKmxpbnQgIWU4MTggeFNlbWFwaG9yZSBjYW5ub3QgYmUgYSBwb2ludGVyIHRvIGNvbnN0IGJlY2F1c2UgaXQgaXMgYSB0eXBlZGVmLiAqLworCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfUkVDVVJTSVZFX01VVEVYRVMgPT0gMSApCisKKwlCYXNlVHlwZV90IHhRdWV1ZUdpdmVNdXRleFJlY3Vyc2l2ZSggUXVldWVIYW5kbGVfdCB4TXV0ZXggKQorCXsKKwlCYXNlVHlwZV90IHhSZXR1cm47CisJUXVldWVfdCAqIGNvbnN0IHB4TXV0ZXggPSAoIFF1ZXVlX3QgKiApIHhNdXRleDsKKworCQljb25maWdBU1NFUlQoIHB4TXV0ZXggKTsKKworCQkvKiBJZiB0aGlzIGlzIHRoZSB0YXNrIHRoYXQgaG9sZHMgdGhlIG11dGV4IHRoZW4gcHhNdXRleEhvbGRlciB3aWxsIG5vdAorCQljaGFuZ2Ugb3V0c2lkZSBvZiB0aGlzIHRhc2suICBJZiB0aGlzIHRhc2sgZG9lcyBub3QgaG9sZCB0aGUgbXV0ZXggdGhlbgorCQlweE11dGV4SG9sZGVyIGNhbiBuZXZlciBjb2luY2lkZW50YWxseSBlcXVhbCB0aGUgdGFza3MgaGFuZGxlLCBhbmQgYXMKKwkJdGhpcyBpcyB0aGUgb25seSBjb25kaXRpb24gd2UgYXJlIGludGVyZXN0ZWQgaW4gaXQgZG9lcyBub3QgbWF0dGVyIGlmCisJCXB4TXV0ZXhIb2xkZXIgaXMgYWNjZXNzZWQgc2ltdWx0YW5lb3VzbHkgYnkgYW5vdGhlciB0YXNrLiAgVGhlcmVmb3JlIG5vCisJCW11dHVhbCBleGNsdXNpb24gaXMgcmVxdWlyZWQgdG8gdGVzdCB0aGUgcHhNdXRleEhvbGRlciB2YXJpYWJsZS4gKi8KKwkJaWYoIHB4TXV0ZXgtPnB4TXV0ZXhIb2xkZXIgPT0gKCB2b2lkICogKSB4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCkgKSAvKmxpbnQgIWU5NjEgTm90IGEgcmVkdW5kYW50IGNhc3QgYXMgVGFza0hhbmRsZV90IGlzIGEgdHlwZWRlZi4gKi8KKwkJeworCQkJdHJhY2VHSVZFX01VVEVYX1JFQ1VSU0lWRSggcHhNdXRleCApOworCisJCQkvKiB1eFJlY3Vyc2l2ZUNhbGxDb3VudCBjYW5ub3QgYmUgemVybyBpZiBweE11dGV4SG9sZGVyIGlzIGVxdWFsIHRvCisJCQl0aGUgdGFzayBoYW5kbGUsIHRoZXJlZm9yZSBubyB1bmRlcmZsb3cgY2hlY2sgaXMgcmVxdWlyZWQuICBBbHNvLAorCQkJdXhSZWN1cnNpdmVDYWxsQ291bnQgaXMgb25seSBtb2RpZmllZCBieSB0aGUgbXV0ZXggaG9sZGVyLCBhbmQgYXMKKwkJCXRoZXJlIGNhbiBvbmx5IGJlIG9uZSwgbm8gbXV0dWFsIGV4Y2x1c2lvbiBpcyByZXF1aXJlZCB0byBtb2RpZnkgdGhlCisJCQl1eFJlY3Vyc2l2ZUNhbGxDb3VudCBtZW1iZXIuICovCisJCQkoIHB4TXV0ZXgtPnUudXhSZWN1cnNpdmVDYWxsQ291bnQgKS0tOworCisJCQkvKiBIYXMgdGhlIHJlY3Vyc2l2ZSBjYWxsIGNvdW50IHVud291bmQgdG8gMD8gKi8KKwkJCWlmKCBweE11dGV4LT51LnV4UmVjdXJzaXZlQ2FsbENvdW50ID09ICggVUJhc2VUeXBlX3QgKSAwICkKKwkJCXsKKwkJCQkvKiBSZXR1cm4gdGhlIG11dGV4LiAgVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgdW5ibG9jayBhbnkgb3RoZXIKKwkJCQl0YXNrIHRoYXQgbWlnaHQgYmUgd2FpdGluZyB0byBhY2Nlc3MgdGhlIG11dGV4LiAqLworCQkJCSggdm9pZCApIHhRdWV1ZUdlbmVyaWNTZW5kKCBweE11dGV4LCBOVUxMLCBxdWV1ZU1VVEVYX0dJVkVfQkxPQ0tfVElNRSwgcXVldWVTRU5EX1RPX0JBQ0sgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisKKwkJCXhSZXR1cm4gPSBwZFBBU1M7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBUaGUgbXV0ZXggY2Fubm90IGJlIGdpdmVuIGJlY2F1c2UgdGhlIGNhbGxpbmcgdGFzayBpcyBub3QgdGhlCisJCQlob2xkZXIuICovCisJCQl4UmV0dXJuID0gcGRGQUlMOworCisJCQl0cmFjZUdJVkVfTVVURVhfUkVDVVJTSVZFX0ZBSUxFRCggcHhNdXRleCApOworCQl9CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTID09IDEgKQorCisJQmFzZVR5cGVfdCB4UXVldWVUYWtlTXV0ZXhSZWN1cnNpdmUoIFF1ZXVlSGFuZGxlX3QgeE11dGV4LCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlRdWV1ZV90ICogY29uc3QgcHhNdXRleCA9ICggUXVldWVfdCAqICkgeE11dGV4OworCisJCWNvbmZpZ0FTU0VSVCggcHhNdXRleCApOworCisJCS8qIENvbW1lbnRzIHJlZ2FyZGluZyBtdXR1YWwgZXhjbHVzaW9uIGFzIHBlciB0aG9zZSB3aXRoaW4KKwkJeFF1ZXVlR2l2ZU11dGV4UmVjdXJzaXZlKCkuICovCisKKwkJdHJhY2VUQUtFX01VVEVYX1JFQ1VSU0lWRSggcHhNdXRleCApOworCisJCWlmKCBweE11dGV4LT5weE11dGV4SG9sZGVyID09ICggdm9pZCAqICkgeFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSgpICkgLypsaW50ICFlOTYxIENhc3QgaXMgbm90IHJlZHVuZGFudCBhcyBUYXNrSGFuZGxlX3QgaXMgYSB0eXBlZGVmLiAqLworCQl7CisJCQkoIHB4TXV0ZXgtPnUudXhSZWN1cnNpdmVDYWxsQ291bnQgKSsrOworCQkJeFJldHVybiA9IHBkUEFTUzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXhSZXR1cm4gPSB4UXVldWVTZW1hcGhvcmVUYWtlKCBweE11dGV4LCB4VGlja3NUb1dhaXQgKTsKKworCQkJLyogcGRQQVNTIHdpbGwgb25seSBiZSByZXR1cm5lZCBpZiB0aGUgbXV0ZXggd2FzIHN1Y2Nlc3NmdWxseQorCQkJb2J0YWluZWQuICBUaGUgY2FsbGluZyB0YXNrIG1heSBoYXZlIGVudGVyZWQgdGhlIEJsb2NrZWQgc3RhdGUKKwkJCWJlZm9yZSByZWFjaGluZyBoZXJlLiAqLworCQkJaWYoIHhSZXR1cm4gIT0gcGRGQUlMICkKKwkJCXsKKwkJCQkoIHB4TXV0ZXgtPnUudXhSZWN1cnNpdmVDYWxsQ291bnQgKSsrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRyYWNlVEFLRV9NVVRFWF9SRUNVUlNJVkVfRkFJTEVEKCBweE11dGV4ICk7CisJCQl9CisJCX0KKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfUkVDVVJTSVZFX01VVEVYRVMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggY29uZmlnVVNFX0NPVU5USU5HX1NFTUFQSE9SRVMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCisJUXVldWVIYW5kbGVfdCB4UXVldWVDcmVhdGVDb3VudGluZ1NlbWFwaG9yZVN0YXRpYyggY29uc3QgVUJhc2VUeXBlX3QgdXhNYXhDb3VudCwgY29uc3QgVUJhc2VUeXBlX3QgdXhJbml0aWFsQ291bnQsIFN0YXRpY1F1ZXVlX3QgKnB4U3RhdGljUXVldWUgKQorCXsKKwlRdWV1ZUhhbmRsZV90IHhIYW5kbGU7CisKKwkJY29uZmlnQVNTRVJUKCB1eE1heENvdW50ICE9IDAgKTsKKwkJY29uZmlnQVNTRVJUKCB1eEluaXRpYWxDb3VudCA8PSB1eE1heENvdW50ICk7CisKKwkJeEhhbmRsZSA9IHhRdWV1ZUdlbmVyaWNDcmVhdGVTdGF0aWMoIHV4TWF4Q291bnQsIHF1ZXVlU0VNQVBIT1JFX1FVRVVFX0lURU1fTEVOR1RILCBOVUxMLCBweFN0YXRpY1F1ZXVlLCBxdWV1ZVFVRVVFX1RZUEVfQ09VTlRJTkdfU0VNQVBIT1JFICk7CisKKwkJaWYoIHhIYW5kbGUgIT0gTlVMTCApCisJCXsKKwkJCSggKCBRdWV1ZV90ICogKSB4SGFuZGxlICktPnV4TWVzc2FnZXNXYWl0aW5nID0gdXhJbml0aWFsQ291bnQ7CisKKwkJCXRyYWNlQ1JFQVRFX0NPVU5USU5HX1NFTUFQSE9SRSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJdHJhY2VDUkVBVEVfQ09VTlRJTkdfU0VNQVBIT1JFX0ZBSUxFRCgpOworCQl9CisKKwkJcmV0dXJuIHhIYW5kbGU7CisJfQorCisjZW5kaWYgLyogKCAoIGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKSApICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCAoIGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKSApCisKKwlRdWV1ZUhhbmRsZV90IHhRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlKCBjb25zdCBVQmFzZVR5cGVfdCB1eE1heENvdW50LCBjb25zdCBVQmFzZVR5cGVfdCB1eEluaXRpYWxDb3VudCApCisJeworCVF1ZXVlSGFuZGxlX3QgeEhhbmRsZTsKKworCQljb25maWdBU1NFUlQoIHV4TWF4Q291bnQgIT0gMCApOworCQljb25maWdBU1NFUlQoIHV4SW5pdGlhbENvdW50IDw9IHV4TWF4Q291bnQgKTsKKworCQl4SGFuZGxlID0geFF1ZXVlR2VuZXJpY0NyZWF0ZSggdXhNYXhDb3VudCwgcXVldWVTRU1BUEhPUkVfUVVFVUVfSVRFTV9MRU5HVEgsIHF1ZXVlUVVFVUVfVFlQRV9DT1VOVElOR19TRU1BUEhPUkUgKTsKKworCQlpZiggeEhhbmRsZSAhPSBOVUxMICkKKwkJeworCQkJKCAoIFF1ZXVlX3QgKiApIHhIYW5kbGUgKS0+dXhNZXNzYWdlc1dhaXRpbmcgPSB1eEluaXRpYWxDb3VudDsKKworCQkJdHJhY2VDUkVBVEVfQ09VTlRJTkdfU0VNQVBIT1JFKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0cmFjZUNSRUFURV9DT1VOVElOR19TRU1BUEhPUkVfRkFJTEVEKCk7CisJCX0KKworCQlyZXR1cm4geEhhbmRsZTsKKwl9CisKKyNlbmRpZiAvKiAoICggY29uZmlnVVNFX0NPVU5USU5HX1NFTUFQSE9SRVMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhRdWV1ZUdlbmVyaWNTZW5kKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgY29uc3Qgdm9pZCAqIGNvbnN0IHB2SXRlbVRvUXVldWUsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0LCBjb25zdCBCYXNlVHlwZV90IHhDb3B5UG9zaXRpb24gKQoreworQmFzZVR5cGVfdCB4RW50cnlUaW1lU2V0ID0gcGRGQUxTRSwgeFlpZWxkUmVxdWlyZWQ7CitUaW1lT3V0X3QgeFRpbWVPdXQ7CitRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworCisJY29uZmlnQVNTRVJUKCBweFF1ZXVlICk7CisJY29uZmlnQVNTRVJUKCAhKCAoIHB2SXRlbVRvUXVldWUgPT0gTlVMTCApICYmICggcHhRdWV1ZS0+dXhJdGVtU2l6ZSAhPSAoIFVCYXNlVHlwZV90ICkgMFUgKSApICk7CisJY29uZmlnQVNTRVJUKCAhKCAoIHhDb3B5UG9zaXRpb24gPT0gcXVldWVPVkVSV1JJVEUgKSAmJiAoIHB4UXVldWUtPnV4TGVuZ3RoICE9IDEgKSApICk7CisJI2lmICggKCBJTkNMVURFX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUgPT0gMSApIHx8ICggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkgKQorCXsKKwkJY29uZmlnQVNTRVJUKCAhKCAoIHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSA9PSB0YXNrU0NIRURVTEVSX1NVU1BFTkRFRCApICYmICggeFRpY2tzVG9XYWl0ICE9IDAgKSApICk7CisJfQorCSNlbmRpZgorCisKKwkvKiBUaGlzIGZ1bmN0aW9uIHJlbGF4ZXMgdGhlIGNvZGluZyBzdGFuZGFyZCBzb21ld2hhdCB0byBhbGxvdyByZXR1cm4KKwlzdGF0ZW1lbnRzIHdpdGhpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgVGhpcyBpcyBkb25lIGluIHRoZSBpbnRlcmVzdAorCW9mIGV4ZWN1dGlvbiB0aW1lIGVmZmljaWVuY3kuICovCisJZm9yKCA7OyApCisJeworCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJeworCQkJLyogSXMgdGhlcmUgcm9vbSBvbiB0aGUgcXVldWUgbm93PyAgVGhlIHJ1bm5pbmcgdGFzayBtdXN0IGJlIHRoZQorCQkJaGlnaGVzdCBwcmlvcml0eSB0YXNrIHdhbnRpbmcgdG8gYWNjZXNzIHRoZSBxdWV1ZS4gIElmIHRoZSBoZWFkIGl0ZW0KKwkJCWluIHRoZSBxdWV1ZSBpcyB0byBiZSBvdmVyd3JpdHRlbiB0aGVuIGl0IGRvZXMgbm90IG1hdHRlciBpZiB0aGUKKwkJCXF1ZXVlIGlzIGZ1bGwuICovCisJCQlpZiggKCBweFF1ZXVlLT51eE1lc3NhZ2VzV2FpdGluZyA8IHB4UXVldWUtPnV4TGVuZ3RoICkgfHwgKCB4Q29weVBvc2l0aW9uID09IHF1ZXVlT1ZFUldSSVRFICkgKQorCQkJeworCQkJCXRyYWNlUVVFVUVfU0VORCggcHhRdWV1ZSApOworCQkJCXhZaWVsZFJlcXVpcmVkID0gcHJ2Q29weURhdGFUb1F1ZXVlKCBweFF1ZXVlLCBwdkl0ZW1Ub1F1ZXVlLCB4Q29weVBvc2l0aW9uICk7CisKKwkJCQkjaWYgKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkKKwkJCQl7CisJCQkJCWlmKCBweFF1ZXVlLT5weFF1ZXVlU2V0Q29udGFpbmVyICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQlpZiggcHJ2Tm90aWZ5UXVldWVTZXRDb250YWluZXIoIHB4UXVldWUsIHhDb3B5UG9zaXRpb24gKSAhPSBwZEZBTFNFICkKKwkJCQkJCXsKKwkJCQkJCQkvKiBUaGUgcXVldWUgaXMgYSBtZW1iZXIgb2YgYSBxdWV1ZSBzZXQsIGFuZCBwb3N0aW5nCisJCQkJCQkJdG8gdGhlIHF1ZXVlIHNldCBjYXVzZWQgYSBoaWdoZXIgcHJpb3JpdHkgdGFzayB0bworCQkJCQkJCXVuYmxvY2suIEEgY29udGV4dCBzd2l0Y2ggaXMgcmVxdWlyZWQuICovCisJCQkJCQkJcXVldWVZSUVMRF9JRl9VU0lOR19QUkVFTVBUSU9OKCk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLyogSWYgdGhlcmUgd2FzIGEgdGFzayB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZSBvbiB0aGUKKwkJCQkJCXF1ZXVlIHRoZW4gdW5ibG9jayBpdCBub3cuICovCisJCQkJCQlpZiggbGlzdExJU1RfSVNfRU1QVFkoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1JlY2VpdmUgKSApID09IHBkRkFMU0UgKQorCQkJCQkJeworCQkJCQkJCWlmKCB4VGFza1JlbW92ZUZyb21FdmVudExpc3QoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1JlY2VpdmUgKSApICE9IHBkRkFMU0UgKQorCQkJCQkJCXsKKwkJCQkJCQkJLyogVGhlIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuCisJCQkJCQkJCW91ciBvd24gc28geWllbGQgaW1tZWRpYXRlbHkuICBZZXMgaXQgaXMgb2sgdG8KKwkJCQkJCQkJZG8gdGhpcyBmcm9tIHdpdGhpbiB0aGUgY3JpdGljYWwgc2VjdGlvbiAtIHRoZQorCQkJCQkJCQlrZXJuZWwgdGFrZXMgY2FyZSBvZiB0aGF0LiAqLworCQkJCQkJCQlxdWV1ZVlJRUxEX0lGX1VTSU5HX1BSRUVNUFRJT04oKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYoIHhZaWVsZFJlcXVpcmVkICE9IHBkRkFMU0UgKQorCQkJCQkJeworCQkJCQkJCS8qIFRoaXMgcGF0aCBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IHdpbGwgb25seSBnZXQKKwkJCQkJCQlleGVjdXRlZCBpZiB0aGUgdGFzayB3YXMgaG9sZGluZyBtdWx0aXBsZSBtdXRleGVzCisJCQkJCQkJYW5kIHRoZSBtdXRleGVzIHdlcmUgZ2l2ZW4gYmFjayBpbiBhbiBvcmRlciB0aGF0IGlzCisJCQkJCQkJZGlmZmVyZW50IHRvIHRoYXQgaW4gd2hpY2ggdGhleSB3ZXJlIHRha2VuLiAqLworCQkJCQkJCXF1ZXVlWUlFTERfSUZfVVNJTkdfUFJFRU1QVElPTigpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkjZWxzZSAvKiBjb25maWdVU0VfUVVFVUVfU0VUUyAqLworCQkJCXsKKwkJCQkJLyogSWYgdGhlcmUgd2FzIGEgdGFzayB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZSBvbiB0aGUKKwkJCQkJcXVldWUgdGhlbiB1bmJsb2NrIGl0IG5vdy4gKi8KKwkJCQkJaWYoIGxpc3RMSVNUX0lTX0VNUFRZKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKSA9PSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJaWYoIHhUYXNrUmVtb3ZlRnJvbUV2ZW50TGlzdCggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgIT0gcGRGQUxTRSApCisJCQkJCQl7CisJCQkJCQkJLyogVGhlIHVuYmxvY2tlZCB0YXNrIGhhcyBhIHByaW9yaXR5IGhpZ2hlciB0aGFuCisJCQkJCQkJb3VyIG93biBzbyB5aWVsZCBpbW1lZGlhdGVseS4gIFllcyBpdCBpcyBvayB0byBkbworCQkJCQkJCXRoaXMgZnJvbSB3aXRoaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24gLSB0aGUga2VybmVsCisJCQkJCQkJdGFrZXMgY2FyZSBvZiB0aGF0LiAqLworCQkJCQkJCXF1ZXVlWUlFTERfSUZfVVNJTkdfUFJFRU1QVElPTigpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmKCB4WWllbGRSZXF1aXJlZCAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJLyogVGhpcyBwYXRoIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgd2lsbCBvbmx5IGdldAorCQkJCQkJZXhlY3V0ZWQgaWYgdGhlIHRhc2sgd2FzIGhvbGRpbmcgbXVsdGlwbGUgbXV0ZXhlcyBhbmQKKwkJCQkJCXRoZSBtdXRleGVzIHdlcmUgZ2l2ZW4gYmFjayBpbiBhbiBvcmRlciB0aGF0IGlzCisJCQkJCQlkaWZmZXJlbnQgdG8gdGhhdCBpbiB3aGljaCB0aGV5IHdlcmUgdGFrZW4uICovCisJCQkJCQlxdWV1ZVlJRUxEX0lGX1VTSU5HX1BSRUVNUFRJT04oKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkjZW5kaWYgLyogY29uZmlnVVNFX1FVRVVFX1NFVFMgKi8KKworCQkJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisJCQkJcmV0dXJuIHBkUEFTUzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiggeFRpY2tzVG9XYWl0ID09ICggVGlja1R5cGVfdCApIDAgKQorCQkJCXsKKwkJCQkJLyogVGhlIHF1ZXVlIHdhcyBmdWxsIGFuZCBubyBibG9jayB0aW1lIGlzIHNwZWNpZmllZCAob3IKKwkJCQkJdGhlIGJsb2NrIHRpbWUgaGFzIGV4cGlyZWQpIHNvIGxlYXZlIG5vdy4gKi8KKwkJCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKworCQkJCQkvKiBSZXR1cm4gdG8gdGhlIG9yaWdpbmFsIHByaXZpbGVnZSBsZXZlbCBiZWZvcmUgZXhpdGluZworCQkJCQl0aGUgZnVuY3Rpb24uICovCisJCQkJCXRyYWNlUVVFVUVfU0VORF9GQUlMRUQoIHB4UXVldWUgKTsKKwkJCQkJcmV0dXJuIGVyclFVRVVFX0ZVTEw7CisJCQkJfQorCQkJCWVsc2UgaWYoIHhFbnRyeVRpbWVTZXQgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQkvKiBUaGUgcXVldWUgd2FzIGZ1bGwgYW5kIGEgYmxvY2sgdGltZSB3YXMgc3BlY2lmaWVkIHNvCisJCQkJCWNvbmZpZ3VyZSB0aGUgdGltZW91dCBzdHJ1Y3R1cmUuICovCisJCQkJCXZUYXNrSW50ZXJuYWxTZXRUaW1lT3V0U3RhdGUoICZ4VGltZU91dCApOworCQkJCQl4RW50cnlUaW1lU2V0ID0gcGRUUlVFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBFbnRyeSB0aW1lIHdhcyBhbHJlYWR5IHNldC4gKi8KKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJfQorCQl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJCS8qIEludGVycnVwdHMgYW5kIG90aGVyIHRhc2tzIGNhbiBzZW5kIHRvIGFuZCByZWNlaXZlIGZyb20gdGhlIHF1ZXVlCisJCW5vdyB0aGUgY3JpdGljYWwgc2VjdGlvbiBoYXMgYmVlbiBleGl0ZWQuICovCisKKwkJdlRhc2tTdXNwZW5kQWxsKCk7CisJCXBydkxvY2tRdWV1ZSggcHhRdWV1ZSApOworCisJCS8qIFVwZGF0ZSB0aGUgdGltZW91dCBzdGF0ZSB0byBzZWUgaWYgaXQgaGFzIGV4cGlyZWQgeWV0LiAqLworCQlpZiggeFRhc2tDaGVja0ZvclRpbWVPdXQoICZ4VGltZU91dCwgJnhUaWNrc1RvV2FpdCApID09IHBkRkFMU0UgKQorCQl7CisJCQlpZiggcHJ2SXNRdWV1ZUZ1bGwoIHB4UXVldWUgKSAhPSBwZEZBTFNFICkKKwkJCXsKKwkJCQl0cmFjZUJMT0NLSU5HX09OX1FVRVVFX1NFTkQoIHB4UXVldWUgKTsKKwkJCQl2VGFza1BsYWNlT25FdmVudExpc3QoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1NlbmQgKSwgeFRpY2tzVG9XYWl0ICk7CisKKwkJCQkvKiBVbmxvY2tpbmcgdGhlIHF1ZXVlIG1lYW5zIHF1ZXVlIGV2ZW50cyBjYW4gZWZmZWN0IHRoZQorCQkJCWV2ZW50IGxpc3QuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGludGVycnVwdHMgb2NjdXJyaW5nIG5vdworCQkJCXJlbW92ZSB0aGlzIHRhc2sgZnJvbSB0aGUgZXZlbnQgbGlzdCBhZ2FpbiAtIGJ1dCBhcyB0aGUKKwkJCQlzY2hlZHVsZXIgaXMgc3VzcGVuZGVkIHRoZSB0YXNrIHdpbGwgZ28gb250byB0aGUgcGVuZGluZworCQkJCXJlYWR5IGxhc3QgaW5zdGVhZCBvZiB0aGUgYWN0dWFsIHJlYWR5IGxpc3QuICovCisJCQkJcHJ2VW5sb2NrUXVldWUoIHB4UXVldWUgKTsKKworCQkJCS8qIFJlc3VtaW5nIHRoZSBzY2hlZHVsZXIgd2lsbCBtb3ZlIHRhc2tzIGZyb20gdGhlIHBlbmRpbmcKKwkJCQlyZWFkeSBsaXN0IGludG8gdGhlIHJlYWR5IGxpc3QgLSBzbyBpdCBpcyBmZWFzaWJsZSB0aGF0IHRoaXMKKwkJCQl0YXNrIGlzIGFscmVhZHkgaW4gYSByZWFkeSBsaXN0IGJlZm9yZSBpdCB5aWVsZHMgLSBpbiB3aGljaAorCQkJCWNhc2UgdGhlIHlpZWxkIHdpbGwgbm90IGNhdXNlIGEgY29udGV4dCBzd2l0Y2ggdW5sZXNzIHRoZXJlCisJCQkJaXMgYWxzbyBhIGhpZ2hlciBwcmlvcml0eSB0YXNrIGluIHRoZSBwZW5kaW5nIHJlYWR5IGxpc3QuICovCisJCQkJaWYoIHhUYXNrUmVzdW1lQWxsKCkgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQlwb3J0WUlFTERfV0lUSElOX0FQSSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBUcnkgYWdhaW4uICovCisJCQkJcHJ2VW5sb2NrUXVldWUoIHB4UXVldWUgKTsKKwkJCQkoIHZvaWQgKSB4VGFza1Jlc3VtZUFsbCgpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLyogVGhlIHRpbWVvdXQgaGFzIGV4cGlyZWQuICovCisJCQlwcnZVbmxvY2tRdWV1ZSggcHhRdWV1ZSApOworCQkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKworCQkJdHJhY2VRVUVVRV9TRU5EX0ZBSUxFRCggcHhRdWV1ZSApOworCQkJcmV0dXJuIGVyclFVRVVFX0ZVTEw7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4UXVldWVHZW5lcmljU2VuZEZyb21JU1IoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICogY29uc3QgcHZJdGVtVG9RdWV1ZSwgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4sIGNvbnN0IEJhc2VUeXBlX3QgeENvcHlQb3NpdGlvbiApCit7CitCYXNlVHlwZV90IHhSZXR1cm47CitVQmFzZVR5cGVfdCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzOworUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZTsKKworCWNvbmZpZ0FTU0VSVCggcHhRdWV1ZSApOworCWNvbmZpZ0FTU0VSVCggISggKCBwdkl0ZW1Ub1F1ZXVlID09IE5VTEwgKSAmJiAoIHB4UXVldWUtPnV4SXRlbVNpemUgIT0gKCBVQmFzZVR5cGVfdCApIDBVICkgKSApOworCWNvbmZpZ0FTU0VSVCggISggKCB4Q29weVBvc2l0aW9uID09IHF1ZXVlT1ZFUldSSVRFICkgJiYgKCBweFF1ZXVlLT51eExlbmd0aCAhPSAxICkgKSApOworCisJLyogUlRPUyBwb3J0cyB0aGF0IHN1cHBvcnQgaW50ZXJydXB0IG5lc3RpbmcgaGF2ZSB0aGUgY29uY2VwdCBvZiBhIG1heGltdW0KKwlzeXN0ZW0gY2FsbCAob3IgbWF4aW11bSBBUEkgY2FsbCkgaW50ZXJydXB0IHByaW9yaXR5LiAgSW50ZXJydXB0cyB0aGF0IGFyZQorCWFib3ZlIHRoZSBtYXhpbXVtIHN5c3RlbSBjYWxsIHByaW9yaXR5IGFyZSBrZXB0IHBlcm1hbmVudGx5IGVuYWJsZWQsIGV2ZW4KKwl3aGVuIHRoZSBSVE9TIGtlcm5lbCBpcyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sIGJ1dCBjYW5ub3QgbWFrZSBhbnkgY2FsbHMgdG8KKwlGcmVlUlRPUyBBUEkgZnVuY3Rpb25zLiAgSWYgY29uZmlnQVNTRVJUKCkgaXMgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oCisJdGhlbiBwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCkgd2lsbCByZXN1bHQgaW4gYW4gYXNzZXJ0aW9uCisJZmFpbHVyZSBpZiBhIEZyZWVSVE9TIEFQSSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbgorCWFzc2lnbmVkIGEgcHJpb3JpdHkgYWJvdmUgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eS4KKwlPbmx5IEZyZWVSVE9TIGZ1bmN0aW9ucyB0aGF0IGVuZCBpbiBGcm9tSVNSIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHRzCisJdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQgYSBwcmlvcml0eSBhdCBvciAobG9naWNhbGx5KSBiZWxvdyB0aGUgbWF4aW11bQorCXN5c3RlbSBjYWxsCWludGVycnVwdCBwcmlvcml0eS4gIEZyZWVSVE9TIG1haW50YWlucyBhIHNlcGFyYXRlIGludGVycnVwdAorCXNhZmUgQVBJIHRvIGVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLgorCU1vcmUgaW5mb3JtYXRpb24gKGFsYmVpdCBDb3J0ZXgtTSBzcGVjaWZpYykgaXMgcHJvdmlkZWQgb24gdGhlIGZvbGxvd2luZworCWxpbms6IGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwlwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCk7CisKKwkvKiBTaW1pbGFyIHRvIHhRdWV1ZUdlbmVyaWNTZW5kLCBleGNlcHQgd2l0aG91dCBibG9ja2luZyBpZiB0aGVyZSBpcyBubyByb29tCisJaW4gdGhlIHF1ZXVlLiAgQWxzbyBkb24ndCBkaXJlY3RseSB3YWtlIGEgdGFzayB0aGF0IHdhcyBibG9ja2VkIG9uIGEgcXVldWUKKwlyZWFkLCBpbnN0ZWFkIHJldHVybiBhIGZsYWcgdG8gc2F5IHdoZXRoZXIgYSBjb250ZXh0IHN3aXRjaCBpcyByZXF1aXJlZCBvcgorCW5vdCAoaS5lLiBoYXMgYSB0YXNrIHdpdGggYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB1cyBiZWVuIHdva2VuIGJ5IHRoaXMKKwlwb3N0KS4gKi8KKwl1eFNhdmVkSW50ZXJydXB0U3RhdHVzID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCXsKKwkJaWYoICggcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmcgPCBweFF1ZXVlLT51eExlbmd0aCApIHx8ICggeENvcHlQb3NpdGlvbiA9PSBxdWV1ZU9WRVJXUklURSApICkKKwkJeworCQkJY29uc3QgaW50OF90IGNUeExvY2sgPSBweFF1ZXVlLT5jVHhMb2NrOworCisJCQl0cmFjZVFVRVVFX1NFTkRfRlJPTV9JU1IoIHB4UXVldWUgKTsKKworCQkJLyogU2VtYXBob3JlcyB1c2UgeFF1ZXVlR2l2ZUZyb21JU1IoKSwgc28gcHhRdWV1ZSB3aWxsIG5vdCBiZSBhCisJCQlzZW1hcGhvcmUgb3IgbXV0ZXguICBUaGF0IG1lYW5zIHBydkNvcHlEYXRhVG9RdWV1ZSgpIGNhbm5vdCByZXN1bHQKKwkJCWluIGEgdGFzayBkaXNpbmhlcml0aW5nIGEgcHJpb3JpdHkgYW5kIHBydkNvcHlEYXRhVG9RdWV1ZSgpIGNhbiBiZQorCQkJY2FsbGVkIGhlcmUgZXZlbiB0aG91Z2ggdGhlIGRpc2luaGVyaXQgZnVuY3Rpb24gZG9lcyBub3QgY2hlY2sgaWYKKwkJCXRoZSBzY2hlZHVsZXIgaXMgc3VzcGVuZGVkIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIHJlYWR5IGxpc3RzLiAqLworCQkJKCB2b2lkICkgcHJ2Q29weURhdGFUb1F1ZXVlKCBweFF1ZXVlLCBwdkl0ZW1Ub1F1ZXVlLCB4Q29weVBvc2l0aW9uICk7CisKKwkJCS8qIFRoZSBldmVudCBsaXN0IGlzIG5vdCBhbHRlcmVkIGlmIHRoZSBxdWV1ZSBpcyBsb2NrZWQuICBUaGlzIHdpbGwKKwkJCWJlIGRvbmUgd2hlbiB0aGUgcXVldWUgaXMgdW5sb2NrZWQgbGF0ZXIuICovCisJCQlpZiggY1R4TG9jayA9PSBxdWV1ZVVOTE9DS0VEICkKKwkJCXsKKwkJCQkjaWYgKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkKKwkJCQl7CisJCQkJCWlmKCBweFF1ZXVlLT5weFF1ZXVlU2V0Q29udGFpbmVyICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQlpZiggcHJ2Tm90aWZ5UXVldWVTZXRDb250YWluZXIoIHB4UXVldWUsIHhDb3B5UG9zaXRpb24gKSAhPSBwZEZBTFNFICkKKwkJCQkJCXsKKwkJCQkJCQkvKiBUaGUgcXVldWUgaXMgYSBtZW1iZXIgb2YgYSBxdWV1ZSBzZXQsIGFuZCBwb3N0aW5nCisJCQkJCQkJdG8gdGhlIHF1ZXVlIHNldCBjYXVzZWQgYSBoaWdoZXIgcHJpb3JpdHkgdGFzayB0bworCQkJCQkJCXVuYmxvY2suICBBIGNvbnRleHQgc3dpdGNoIGlzIHJlcXVpcmVkLiAqLworCQkJCQkJCWlmKCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICE9IE5VTEwgKQorCQkJCQkJCXsKKwkJCQkJCQkJKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZFRSVUU7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWYoIGxpc3RMSVNUX0lTX0VNUFRZKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKSA9PSBwZEZBTFNFICkKKwkJCQkJCXsKKwkJCQkJCQlpZiggeFRhc2tSZW1vdmVGcm9tRXZlbnRMaXN0KCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKSAhPSBwZEZBTFNFICkKKwkJCQkJCQl7CisJCQkJCQkJCS8qIFRoZSB0YXNrIHdhaXRpbmcgaGFzIGEgaGlnaGVyIHByaW9yaXR5IHNvCisJCQkJCQkJCXJlY29yZCB0aGF0IGEgY29udGV4dCBzd2l0Y2ggaXMgcmVxdWlyZWQuICovCisJCQkJCQkJCWlmKCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICE9IE5VTEwgKQorCQkJCQkJCQl7CisJCQkJCQkJCQkqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkVFJVRTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsKKwkJCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkjZWxzZSAvKiBjb25maWdVU0VfUVVFVUVfU0VUUyAqLworCQkJCXsKKwkJCQkJaWYoIGxpc3RMSVNUX0lTX0VNUFRZKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKSA9PSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJaWYoIHhUYXNrUmVtb3ZlRnJvbUV2ZW50TGlzdCggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgIT0gcGRGQUxTRSApCisJCQkJCQl7CisJCQkJCQkJLyogVGhlIHRhc2sgd2FpdGluZyBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgc28gcmVjb3JkIHRoYXQgYQorCQkJCQkJCWNvbnRleHQJc3dpdGNoIGlzIHJlcXVpcmVkLiAqLworCQkJCQkJCWlmKCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICE9IE5VTEwgKQorCQkJCQkJCXsKKwkJCQkJCQkJKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZFRSVUU7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJfQorCQkJCSNlbmRpZiAvKiBjb25maWdVU0VfUVVFVUVfU0VUUyAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIEluY3JlbWVudCB0aGUgbG9jayBjb3VudCBzbyB0aGUgdGFzayB0aGF0IHVubG9ja3MgdGhlIHF1ZXVlCisJCQkJa25vd3MgdGhhdCBkYXRhIHdhcyBwb3N0ZWQgd2hpbGUgaXQgd2FzIGxvY2tlZC4gKi8KKwkJCQlweFF1ZXVlLT5jVHhMb2NrID0gKCBpbnQ4X3QgKSAoIGNUeExvY2sgKyAxICk7CisJCQl9CisKKwkJCXhSZXR1cm4gPSBwZFBBU1M7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0cmFjZVFVRVVFX1NFTkRfRlJPTV9JU1JfRkFJTEVEKCBweFF1ZXVlICk7CisJCQl4UmV0dXJuID0gZXJyUVVFVUVfRlVMTDsKKwkJfQorCX0KKwlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgKTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFF1ZXVlR2l2ZUZyb21JU1IoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBCYXNlVHlwZV90ICogY29uc3QgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApCit7CitCYXNlVHlwZV90IHhSZXR1cm47CitVQmFzZVR5cGVfdCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzOworUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZTsKKworCS8qIFNpbWlsYXIgdG8geFF1ZXVlR2VuZXJpY1NlbmRGcm9tSVNSKCkgYnV0IHVzZWQgd2l0aCBzZW1hcGhvcmVzIHdoZXJlIHRoZQorCWl0ZW0gc2l6ZSBpcyAwLiAgRG9uJ3QgZGlyZWN0bHkgd2FrZSBhIHRhc2sgdGhhdCB3YXMgYmxvY2tlZCBvbiBhIHF1ZXVlCisJcmVhZCwgaW5zdGVhZCByZXR1cm4gYSBmbGFnIHRvIHNheSB3aGV0aGVyIGEgY29udGV4dCBzd2l0Y2ggaXMgcmVxdWlyZWQgb3IKKwlub3QgKGkuZS4gaGFzIGEgdGFzayB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gdXMgYmVlbiB3b2tlbiBieSB0aGlzCisJcG9zdCkuICovCisKKwljb25maWdBU1NFUlQoIHB4UXVldWUgKTsKKworCS8qIHhRdWV1ZUdlbmVyaWNTZW5kRnJvbUlTUigpIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgeFF1ZXVlR2l2ZUZyb21JU1IoKQorCWlmIHRoZSBpdGVtIHNpemUgaXMgbm90IDAuICovCisJY29uZmlnQVNTRVJUKCBweFF1ZXVlLT51eEl0ZW1TaXplID09IDAgKTsKKworCS8qIE5vcm1hbGx5IGEgbXV0ZXggd291bGQgbm90IGJlIGdpdmVuIGZyb20gYW4gaW50ZXJydXB0LCBlc3BlY2lhbGx5IGlmCisJdGhlcmUgaXMgYSBtdXRleCBob2xkZXIsIGFzIHByaW9yaXR5IGluaGVyaXRhbmNlIG1ha2VzIG5vIHNlbnNlIGZvciBhbgorCWludGVycnVwdHMsIG9ubHkgdGFza3MuICovCisJY29uZmlnQVNTRVJUKCAhKCAoIHB4UXVldWUtPnV4UXVldWVUeXBlID09IHF1ZXVlUVVFVUVfSVNfTVVURVggKSAmJiAoIHB4UXVldWUtPnB4TXV0ZXhIb2xkZXIgIT0gTlVMTCApICkgKTsKKworCS8qIFJUT1MgcG9ydHMgdGhhdCBzdXBwb3J0IGludGVycnVwdCBuZXN0aW5nIGhhdmUgdGhlIGNvbmNlcHQgb2YgYSBtYXhpbXVtCisJc3lzdGVtIGNhbGwgKG9yIG1heGltdW0gQVBJIGNhbGwpIGludGVycnVwdCBwcmlvcml0eS4gIEludGVycnVwdHMgdGhhdCBhcmUKKwlhYm92ZSB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eSBhcmUga2VwdCBwZXJtYW5lbnRseSBlbmFibGVkLCBldmVuCisJd2hlbiB0aGUgUlRPUyBrZXJuZWwgaXMgaW4gYSBjcml0aWNhbCBzZWN0aW9uLCBidXQgY2Fubm90IG1ha2UgYW55IGNhbGxzIHRvCisJRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucy4gIElmIGNvbmZpZ0FTU0VSVCgpIGlzIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaAorCXRoZW4gcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIHdpbGwgcmVzdWx0IGluIGFuIGFzc2VydGlvbgorCWZhaWx1cmUgaWYgYSBGcmVlUlRPUyBBUEkgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IHRoYXQgaGFzIGJlZW4KKwlhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlIHRoZSBjb25maWd1cmVkIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkuCisJT25seSBGcmVlUlRPUyBmdW5jdGlvbnMgdGhhdCBlbmQgaW4gRnJvbUlTUiBjYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0cworCXRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgKGxvZ2ljYWxseSkgYmVsb3cgdGhlIG1heGltdW0KKwlzeXN0ZW0gY2FsbAlpbnRlcnJ1cHQgcHJpb3JpdHkuICBGcmVlUlRPUyBtYWludGFpbnMgYSBzZXBhcmF0ZSBpbnRlcnJ1cHQKKwlzYWZlIEFQSSB0byBlbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIGFzIHNpbXBsZSBhcyBwb3NzaWJsZS4KKwlNb3JlIGluZm9ybWF0aW9uIChhbGJlaXQgQ29ydGV4LU0gc3BlY2lmaWMpIGlzIHByb3ZpZGVkIG9uIHRoZSBmb2xsb3dpbmcKKwlsaW5rOiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCisJcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpOworCisJdXhTYXZlZEludGVycnVwdFN0YXR1cyA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCWNvbnN0IFVCYXNlVHlwZV90IHV4TWVzc2FnZXNXYWl0aW5nID0gcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmc7CisKKwkJLyogV2hlbiB0aGUgcXVldWUgaXMgdXNlZCB0byBpbXBsZW1lbnQgYSBzZW1hcGhvcmUgbm8gZGF0YSBpcyBldmVyCisJCW1vdmVkIHRocm91Z2ggdGhlIHF1ZXVlIGJ1dCBpdCBpcyBzdGlsbCB2YWxpZCB0byBzZWUgaWYgdGhlIHF1ZXVlICdoYXMKKwkJc3BhY2UnLiAqLworCQlpZiggdXhNZXNzYWdlc1dhaXRpbmcgPCBweFF1ZXVlLT51eExlbmd0aCApCisJCXsKKwkJCWNvbnN0IGludDhfdCBjVHhMb2NrID0gcHhRdWV1ZS0+Y1R4TG9jazsKKworCQkJdHJhY2VRVUVVRV9TRU5EX0ZST01fSVNSKCBweFF1ZXVlICk7CisKKwkJCS8qIEEgdGFzayBjYW4gb25seSBoYXZlIGFuIGluaGVyaXRlZCBwcmlvcml0eSBpZiBpdCBpcyBhIG11dGV4CisJCQlob2xkZXIgLSBhbmQgaWYgdGhlcmUgaXMgYSBtdXRleCBob2xkZXIgdGhlbiB0aGUgbXV0ZXggY2Fubm90IGJlCisJCQlnaXZlbiBmcm9tIGFuIElTUi4gIEFzIHRoaXMgaXMgdGhlIElTUiB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBpdAorCQkJY2FuIGJlIGFzc3VtZWQgdGhlcmUgaXMgbm8gbXV0ZXggaG9sZGVyIGFuZCBubyBuZWVkIHRvIGRldGVybWluZSBpZgorCQkJcHJpb3JpdHkgZGlzaW5oZXJpdGFuY2UgaXMgbmVlZGVkLiAgU2ltcGx5IGluY3JlYXNlIHRoZSBjb3VudCBvZgorCQkJbWVzc2FnZXMgKHNlbWFwaG9yZXMpIGF2YWlsYWJsZS4gKi8KKwkJCXB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nID0gdXhNZXNzYWdlc1dhaXRpbmcgKyAoIFVCYXNlVHlwZV90ICkgMTsKKworCQkJLyogVGhlIGV2ZW50IGxpc3QgaXMgbm90IGFsdGVyZWQgaWYgdGhlIHF1ZXVlIGlzIGxvY2tlZC4gIFRoaXMgd2lsbAorCQkJYmUgZG9uZSB3aGVuIHRoZSBxdWV1ZSBpcyB1bmxvY2tlZCBsYXRlci4gKi8KKwkJCWlmKCBjVHhMb2NrID09IHF1ZXVlVU5MT0NLRUQgKQorCQkJeworCQkJCSNpZiAoIGNvbmZpZ1VTRV9RVUVVRV9TRVRTID09IDEgKQorCQkJCXsKKwkJCQkJaWYoIHB4UXVldWUtPnB4UXVldWVTZXRDb250YWluZXIgIT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCWlmKCBwcnZOb3RpZnlRdWV1ZVNldENvbnRhaW5lciggcHhRdWV1ZSwgcXVldWVTRU5EX1RPX0JBQ0sgKSAhPSBwZEZBTFNFICkKKwkJCQkJCXsKKwkJCQkJCQkvKiBUaGUgc2VtYXBob3JlIGlzIGEgbWVtYmVyIG9mIGEgcXVldWUgc2V0LCBhbmQKKwkJCQkJCQlwb3N0aW5nCXRvIHRoZSBxdWV1ZSBzZXQgY2F1c2VkIGEgaGlnaGVyIHByaW9yaXR5CisJCQkJCQkJdGFzayB0bwl1bmJsb2NrLiAgQSBjb250ZXh0IHN3aXRjaCBpcyByZXF1aXJlZC4gKi8KKwkJCQkJCQlpZiggcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiAhPSBOVUxMICkKKwkJCQkJCQl7CisJCQkJCQkJCSpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuID0gcGRUUlVFOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgPT0gcGRGQUxTRSApCisJCQkJCQl7CisJCQkJCQkJaWYoIHhUYXNrUmVtb3ZlRnJvbUV2ZW50TGlzdCggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgIT0gcGRGQUxTRSApCisJCQkJCQkJeworCQkJCQkJCQkvKiBUaGUgdGFzayB3YWl0aW5nIGhhcyBhIGhpZ2hlciBwcmlvcml0eSBzbworCQkJCQkJCQlyZWNvcmQgdGhhdCBhIGNvbnRleHQgc3dpdGNoIGlzIHJlcXVpcmVkLiAqLworCQkJCQkJCQlpZiggcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiAhPSBOVUxMICkKKwkJCQkJCQkJeworCQkJCQkJCQkJKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZFRSVUU7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJI2Vsc2UgLyogY29uZmlnVVNFX1FVRVVFX1NFVFMgKi8KKwkJCQl7CisJCQkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgPT0gcGRGQUxTRSApCisJCQkJCXsKKwkJCQkJCWlmKCB4VGFza1JlbW92ZUZyb21FdmVudExpc3QoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1JlY2VpdmUgKSApICE9IHBkRkFMU0UgKQorCQkJCQkJeworCQkJCQkJCS8qIFRoZSB0YXNrIHdhaXRpbmcgaGFzIGEgaGlnaGVyIHByaW9yaXR5IHNvIHJlY29yZCB0aGF0IGEKKwkJCQkJCQljb250ZXh0CXN3aXRjaCBpcyByZXF1aXJlZC4gKi8KKwkJCQkJCQlpZiggcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiAhPSBOVUxMICkKKwkJCQkJCQl7CisJCQkJCQkJCSpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuID0gcGRUUlVFOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkjZW5kaWYgLyogY29uZmlnVVNFX1FVRVVFX1NFVFMgKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBJbmNyZW1lbnQgdGhlIGxvY2sgY291bnQgc28gdGhlIHRhc2sgdGhhdCB1bmxvY2tzIHRoZSBxdWV1ZQorCQkJCWtub3dzIHRoYXQgZGF0YSB3YXMgcG9zdGVkIHdoaWxlIGl0IHdhcyBsb2NrZWQuICovCisJCQkJcHhRdWV1ZS0+Y1R4TG9jayA9ICggaW50OF90ICkgKCBjVHhMb2NrICsgMSApOworCQkJfQorCisJCQl4UmV0dXJuID0gcGRQQVNTOworCQl9CisJCWVsc2UKKwkJeworCQkJdHJhY2VRVUVVRV9TRU5EX0ZST01fSVNSX0ZBSUxFRCggcHhRdWV1ZSApOworCQkJeFJldHVybiA9IGVyclFVRVVFX0ZVTEw7CisJCX0KKwl9CisJcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzICk7CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhRdWV1ZVJlY2VpdmUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCB2b2lkICogY29uc3QgcHZCdWZmZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKK3sKK0Jhc2VUeXBlX3QgeEVudHJ5VGltZVNldCA9IHBkRkFMU0U7CitUaW1lT3V0X3QgeFRpbWVPdXQ7CitRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworCisJLyogQ2hlY2sgdGhlIHBvaW50ZXIgaXMgbm90IE5VTEwuICovCisJY29uZmlnQVNTRVJUKCAoIHB4UXVldWUgKSApOworCisJLyogVGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRhdGEgaXMgcmVjZWl2ZWQgY2FuIG9ubHkgYmUgTlVMTCBpZiB0aGUgZGF0YSBzaXplCisJaXMgemVybyAoc28gbm8gZGF0YSBpcyBjb3BpZWQgaW50byB0aGUgYnVmZmVyLiAqLworCWNvbmZpZ0FTU0VSVCggISggKCAoIHB2QnVmZmVyICkgPT0gTlVMTCApICYmICggKCBweFF1ZXVlICktPnV4SXRlbVNpemUgIT0gKCBVQmFzZVR5cGVfdCApIDBVICkgKSApOworCisJLyogQ2Fubm90IGJsb2NrIGlmIHRoZSBzY2hlZHVsZXIgaXMgc3VzcGVuZGVkLiAqLworCSNpZiAoICggSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlID09IDEgKSB8fCAoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApICkKKwl7CisJCWNvbmZpZ0FTU0VSVCggISggKCB4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgPT0gdGFza1NDSEVEVUxFUl9TVVNQRU5ERUQgKSAmJiAoIHhUaWNrc1RvV2FpdCAhPSAwICkgKSApOworCX0KKwkjZW5kaWYKKworCS8qIFRoaXMgZnVuY3Rpb24gcmVsYXhlcyB0aGUgY29kaW5nIHN0YW5kYXJkIHNvbWV3aGF0IHRvIGFsbG93IHJldHVybgorCXN0YXRlbWVudHMgd2l0aGluIHRoZSBmdW5jdGlvbiBpdHNlbGYuICBUaGlzIGlzIGRvbmUgaW4gdGhlIGludGVyZXN0CisJb2YgZXhlY3V0aW9uIHRpbWUgZWZmaWNpZW5jeS4gKi8KKworCWZvciggOzsgKQorCXsKKwkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJCXsKKwkJCWNvbnN0IFVCYXNlVHlwZV90IHV4TWVzc2FnZXNXYWl0aW5nID0gcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmc7CisKKwkJCS8qIElzIHRoZXJlIGRhdGEgaW4gdGhlIHF1ZXVlIG5vdz8gIFRvIGJlIHJ1bm5pbmcgdGhlIGNhbGxpbmcgdGFzaworCQkJbXVzdCBiZSB0aGUgaGlnaGVzdCBwcmlvcml0eSB0YXNrIHdhbnRpbmcgdG8gYWNjZXNzIHRoZSBxdWV1ZS4gKi8KKwkJCWlmKCB1eE1lc3NhZ2VzV2FpdGluZyA+ICggVUJhc2VUeXBlX3QgKSAwICkKKwkJCXsKKwkJCQkvKiBEYXRhIGF2YWlsYWJsZSwgcmVtb3ZlIG9uZSBpdGVtLiAqLworCQkJCXBydkNvcHlEYXRhRnJvbVF1ZXVlKCBweFF1ZXVlLCBwdkJ1ZmZlciApOworCQkJCXRyYWNlUVVFVUVfUkVDRUlWRSggcHhRdWV1ZSApOworCQkJCXB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nID0gdXhNZXNzYWdlc1dhaXRpbmcgLSAoIFVCYXNlVHlwZV90ICkgMTsKKworCQkJCS8qIFRoZXJlIGlzIG5vdyBzcGFjZSBpbiB0aGUgcXVldWUsIHdlcmUgYW55IHRhc2tzIHdhaXRpbmcgdG8KKwkJCQlwb3N0IHRvIHRoZSBxdWV1ZT8gIElmIHNvLCB1bmJsb2NrIHRoZSBoaWdoZXN0IHByaW9yaXR5IHdhaXRpbmcKKwkJCQl0YXNrLiAqLworCQkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvU2VuZCApICkgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQlpZiggeFRhc2tSZW1vdmVGcm9tRXZlbnRMaXN0KCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9TZW5kICkgKSAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJcXVldWVZSUVMRF9JRl9VU0lOR19QUkVFTVBUSU9OKCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKworCQkJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisJCQkJcmV0dXJuIHBkUEFTUzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiggeFRpY2tzVG9XYWl0ID09ICggVGlja1R5cGVfdCApIDAgKQorCQkJCXsKKwkJCQkJLyogVGhlIHF1ZXVlIHdhcyBlbXB0eSBhbmQgbm8gYmxvY2sgdGltZSBpcyBzcGVjaWZpZWQgKG9yCisJCQkJCXRoZSBibG9jayB0aW1lIGhhcyBleHBpcmVkKSBzbyBsZWF2ZSBub3cuICovCisJCQkJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisJCQkJCXRyYWNlUVVFVUVfUkVDRUlWRV9GQUlMRUQoIHB4UXVldWUgKTsKKwkJCQkJcmV0dXJuIGVyclFVRVVFX0VNUFRZOworCQkJCX0KKwkJCQllbHNlIGlmKCB4RW50cnlUaW1lU2V0ID09IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJLyogVGhlIHF1ZXVlIHdhcyBlbXB0eSBhbmQgYSBibG9jayB0aW1lIHdhcyBzcGVjaWZpZWQgc28KKwkJCQkJY29uZmlndXJlIHRoZSB0aW1lb3V0IHN0cnVjdHVyZS4gKi8KKwkJCQkJdlRhc2tJbnRlcm5hbFNldFRpbWVPdXRTdGF0ZSggJnhUaW1lT3V0ICk7CisJCQkJCXhFbnRyeVRpbWVTZXQgPSBwZFRSVUU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIEVudHJ5IHRpbWUgd2FzIGFscmVhZHkgc2V0LiAqLworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJLyogSW50ZXJydXB0cyBhbmQgb3RoZXIgdGFza3MgY2FuIHNlbmQgdG8gYW5kIHJlY2VpdmUgZnJvbSB0aGUgcXVldWUKKwkJbm93IHRoZSBjcml0aWNhbCBzZWN0aW9uIGhhcyBiZWVuIGV4aXRlZC4gKi8KKworCQl2VGFza1N1c3BlbmRBbGwoKTsKKwkJcHJ2TG9ja1F1ZXVlKCBweFF1ZXVlICk7CisKKwkJLyogVXBkYXRlIHRoZSB0aW1lb3V0IHN0YXRlIHRvIHNlZSBpZiBpdCBoYXMgZXhwaXJlZCB5ZXQuICovCisJCWlmKCB4VGFza0NoZWNrRm9yVGltZU91dCggJnhUaW1lT3V0LCAmeFRpY2tzVG9XYWl0ICkgPT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIFRoZSB0aW1lb3V0IGhhcyBub3QgZXhwaXJlZC4gIElmIHRoZSBxdWV1ZSBpcyBzdGlsbCBlbXB0eSBwbGFjZQorCQkJdGhlIHRhc2sgb24gdGhlIGxpc3Qgb2YgdGFza3Mgd2FpdGluZyB0byByZWNlaXZlIGZyb20gdGhlIHF1ZXVlLiAqLworCQkJaWYoIHBydklzUXVldWVFbXB0eSggcHhRdWV1ZSApICE9IHBkRkFMU0UgKQorCQkJeworCQkJCXRyYWNlQkxPQ0tJTkdfT05fUVVFVUVfUkVDRUlWRSggcHhRdWV1ZSApOworCQkJCXZUYXNrUGxhY2VPbkV2ZW50TGlzdCggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApLCB4VGlja3NUb1dhaXQgKTsKKwkJCQlwcnZVbmxvY2tRdWV1ZSggcHhRdWV1ZSApOworCQkJCWlmKCB4VGFza1Jlc3VtZUFsbCgpID09IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJcG9ydFlJRUxEX1dJVEhJTl9BUEkoKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBUaGUgcXVldWUgY29udGFpbnMgZGF0YSBhZ2Fpbi4gIExvb3AgYmFjayB0byB0cnkgYW5kIHJlYWQgdGhlCisJCQkJZGF0YS4gKi8KKwkJCQlwcnZVbmxvY2tRdWV1ZSggcHhRdWV1ZSApOworCQkJCSggdm9pZCApIHhUYXNrUmVzdW1lQWxsKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBUaW1lZCBvdXQuICBJZiB0aGVyZSBpcyBubyBkYXRhIGluIHRoZSBxdWV1ZSBleGl0LCBvdGhlcndpc2UgbG9vcAorCQkJYmFjayBhbmQgYXR0ZW1wdCB0byByZWFkIHRoZSBkYXRhLiAqLworCQkJcHJ2VW5sb2NrUXVldWUoIHB4UXVldWUgKTsKKwkJCSggdm9pZCApIHhUYXNrUmVzdW1lQWxsKCk7CisKKwkJCWlmKCBwcnZJc1F1ZXVlRW1wdHkoIHB4UXVldWUgKSAhPSBwZEZBTFNFICkKKwkJCXsKKwkJCQl0cmFjZVFVRVVFX1JFQ0VJVkVfRkFJTEVEKCBweFF1ZXVlICk7CisJCQkJcmV0dXJuIGVyclFVRVVFX0VNUFRZOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhRdWV1ZVNlbWFwaG9yZVRha2UoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCit7CitCYXNlVHlwZV90IHhFbnRyeVRpbWVTZXQgPSBwZEZBTFNFOworVGltZU91dF90IHhUaW1lT3V0OworUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZTsKKworI2lmKCBjb25maWdVU0VfTVVURVhFUyA9PSAxICkKKwlCYXNlVHlwZV90IHhJbmhlcml0YW5jZU9jY3VycmVkID0gcGRGQUxTRTsKKyNlbmRpZgorCisJLyogQ2hlY2sgdGhlIHF1ZXVlIHBvaW50ZXIgaXMgbm90IE5VTEwuICovCisJY29uZmlnQVNTRVJUKCAoIHB4UXVldWUgKSApOworCisJLyogQ2hlY2sgdGhpcyByZWFsbHkgaXMgYSBzZW1hcGhvcmUsIGluIHdoaWNoIGNhc2UgdGhlIGl0ZW0gc2l6ZSB3aWxsIGJlCisJMC4gKi8KKwljb25maWdBU1NFUlQoIHB4UXVldWUtPnV4SXRlbVNpemUgPT0gMCApOworCisJLyogQ2Fubm90IGJsb2NrIGlmIHRoZSBzY2hlZHVsZXIgaXMgc3VzcGVuZGVkLiAqLworCSNpZiAoICggSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlID09IDEgKSB8fCAoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApICkKKwl7CisJCWNvbmZpZ0FTU0VSVCggISggKCB4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgPT0gdGFza1NDSEVEVUxFUl9TVVNQRU5ERUQgKSAmJiAoIHhUaWNrc1RvV2FpdCAhPSAwICkgKSApOworCX0KKwkjZW5kaWYKKworCisJLyogVGhpcyBmdW5jdGlvbiByZWxheGVzIHRoZSBjb2Rpbmcgc3RhbmRhcmQgc29tZXdoYXQgdG8gYWxsb3cgcmV0dXJuCisJc3RhdGVtZW50cyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZi4gIFRoaXMgaXMgZG9uZSBpbiB0aGUgaW50ZXJlc3QKKwlvZiBleGVjdXRpb24gdGltZSBlZmZpY2llbmN5LiAqLworCisJZm9yKCA7OyApCisJeworCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJeworCQkJLyogU2VtYXBob3JlcyBhcmUgcXVldWVzIHdpdGggYW4gaXRlbSBzaXplIG9mIDAsIGFuZCB3aGVyZSB0aGUKKwkJCW51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgcXVldWUgaXMgdGhlIHNlbWFwaG9yZSdzIGNvdW50IHZhbHVlLiAqLworCQkJY29uc3QgVUJhc2VUeXBlX3QgdXhTZW1hcGhvcmVDb3VudCA9IHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nOworCisJCQkvKiBJcyB0aGVyZSBkYXRhIGluIHRoZSBxdWV1ZSBub3c/ICBUbyBiZSBydW5uaW5nIHRoZSBjYWxsaW5nIHRhc2sKKwkJCW11c3QgYmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdGFzayB3YW50aW5nIHRvIGFjY2VzcyB0aGUgcXVldWUuICovCisJCQlpZiggdXhTZW1hcGhvcmVDb3VudCA+ICggVUJhc2VUeXBlX3QgKSAwICkKKwkJCXsKKwkJCQl0cmFjZVFVRVVFX1JFQ0VJVkUoIHB4UXVldWUgKTsKKworCQkJCS8qIFNlbWFwaG9yZXMgYXJlIHF1ZXVlcyB3aXRoIGEgZGF0YSBzaXplIG9mIHplcm8gYW5kIHdoZXJlIHRoZQorCQkJCW1lc3NhZ2VzIHdhaXRpbmcgaXMgdGhlIHNlbWFwaG9yZSdzIGNvdW50LiAgUmVkdWNlIHRoZSBjb3VudC4gKi8KKwkJCQlweFF1ZXVlLT51eE1lc3NhZ2VzV2FpdGluZyA9IHV4U2VtYXBob3JlQ291bnQgLSAoIFVCYXNlVHlwZV90ICkgMTsKKworCQkJCSNpZiAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKQorCQkJCXsKKwkJCQkJaWYoIHB4UXVldWUtPnV4UXVldWVUeXBlID09IHF1ZXVlUVVFVUVfSVNfTVVURVggKQorCQkJCQl7CisJCQkJCQkvKiBSZWNvcmQgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGltcGxlbWVudAorCQkJCQkJcHJpb3JpdHkgaW5oZXJpdGFuY2Ugc2hvdWxkIGl0IGJlY29tZSBuZWNlc3NhcnkuICovCisJCQkJCQlweFF1ZXVlLT5weE11dGV4SG9sZGVyID0gKCBpbnQ4X3QgKiApIHB2VGFza0luY3JlbWVudE11dGV4SGVsZENvdW50KCk7IC8qbGludCAhZTk2MSBDYXN0IGlzIG5vdCByZWR1bmRhbnQgYXMgVGFza0hhbmRsZV90IGlzIGEgdHlwZWRlZi4gKi8KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkjZW5kaWYgLyogY29uZmlnVVNFX01VVEVYRVMgKi8KKworCQkJCS8qIENoZWNrIHRvIHNlZSBpZiBvdGhlciB0YXNrcyBhcmUgYmxvY2tlZCB3YWl0aW5nIHRvIGdpdmUgdGhlCisJCQkJc2VtYXBob3JlLCBhbmQgaWYgc28sIHVuYmxvY2sgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgc3VjaCB0YXNrLiAqLworCQkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvU2VuZCApICkgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQlpZiggeFRhc2tSZW1vdmVGcm9tRXZlbnRMaXN0KCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9TZW5kICkgKSAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJcXVldWVZSUVMRF9JRl9VU0lOR19QUkVFTVBUSU9OKCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKworCQkJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisJCQkJcmV0dXJuIHBkUEFTUzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiggeFRpY2tzVG9XYWl0ID09ICggVGlja1R5cGVfdCApIDAgKQorCQkJCXsKKwkJCQkJLyogRm9yIGluaGVyaXRhbmNlIHRvIGhhdmUgb2NjdXJyZWQgdGhlcmUgbXVzdCBoYXZlIGJlZW4gYW4KKwkJCQkJaW5pdGlhbCB0aW1lb3V0LCBhbmQgYW4gYWRqdXN0ZWQgdGltZW91dCBjYW5ub3QgYmVjb21lIDAsIGFzCisJCQkJCWlmIGl0IHdlcmUgMCB0aGUgZnVuY3Rpb24gd291bGQgaGF2ZSBleGl0ZWQuICovCisJCQkJCSNpZiggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCisJCQkJCXsKKwkJCQkJCWNvbmZpZ0FTU0VSVCggeEluaGVyaXRhbmNlT2NjdXJyZWQgPT0gcGRGQUxTRSApOworCQkJCQl9CisJCQkJCSNlbmRpZiAvKiBjb25maWdVU0VfTVVURVhFUyAqLworCisJCQkJCS8qIFRoZSBzZW1hcGhvcmUgY291bnQgd2FzIDAgYW5kIG5vIGJsb2NrIHRpbWUgaXMgc3BlY2lmaWVkCisJCQkJCShvciB0aGUgYmxvY2sgdGltZSBoYXMgZXhwaXJlZCkgc28gZXhpdCBub3cuICovCisJCQkJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisJCQkJCXRyYWNlUVVFVUVfUkVDRUlWRV9GQUlMRUQoIHB4UXVldWUgKTsKKwkJCQkJcmV0dXJuIGVyclFVRVVFX0VNUFRZOworCQkJCX0KKwkJCQllbHNlIGlmKCB4RW50cnlUaW1lU2V0ID09IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJLyogVGhlIHNlbWFwaG9yZSBjb3VudCB3YXMgMCBhbmQgYSBibG9jayB0aW1lIHdhcyBzcGVjaWZpZWQKKwkJCQkJc28gY29uZmlndXJlIHRoZSB0aW1lb3V0IHN0cnVjdHVyZSByZWFkeSB0byBibG9jay4gKi8KKwkJCQkJdlRhc2tJbnRlcm5hbFNldFRpbWVPdXRTdGF0ZSggJnhUaW1lT3V0ICk7CisJCQkJCXhFbnRyeVRpbWVTZXQgPSBwZFRSVUU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIEVudHJ5IHRpbWUgd2FzIGFscmVhZHkgc2V0LiAqLworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJLyogSW50ZXJydXB0cyBhbmQgb3RoZXIgdGFza3MgY2FuIGdpdmUgdG8gYW5kIHRha2UgZnJvbSB0aGUgc2VtYXBob3JlCisJCW5vdyB0aGUgY3JpdGljYWwgc2VjdGlvbiBoYXMgYmVlbiBleGl0ZWQuICovCisKKwkJdlRhc2tTdXNwZW5kQWxsKCk7CisJCXBydkxvY2tRdWV1ZSggcHhRdWV1ZSApOworCisJCS8qIFVwZGF0ZSB0aGUgdGltZW91dCBzdGF0ZSB0byBzZWUgaWYgaXQgaGFzIGV4cGlyZWQgeWV0LiAqLworCQlpZiggeFRhc2tDaGVja0ZvclRpbWVPdXQoICZ4VGltZU91dCwgJnhUaWNrc1RvV2FpdCApID09IHBkRkFMU0UgKQorCQl7CisJCQkvKiBBIGJsb2NrIHRpbWUgaXMgc3BlY2lmaWVkIGFuZCBub3QgZXhwaXJlZC4gIElmIHRoZSBzZW1hcGhvcmUKKwkJCWNvdW50IGlzIDAgdGhlbiBlbnRlciB0aGUgQmxvY2tlZCBzdGF0ZSB0byB3YWl0IGZvciBhIHNlbWFwaG9yZSB0bworCQkJYmVjb21lIGF2YWlsYWJsZS4gIEFzIHNlbWFwaG9yZXMgYXJlIGltcGxlbWVudGVkIHdpdGggcXVldWVzIHRoZQorCQkJcXVldWUgYmVpbmcgZW1wdHkgaXMgZXF1aXZhbGVudCB0byB0aGUgc2VtYXBob3JlIGNvdW50IGJlaW5nIDAuICovCisJCQlpZiggcHJ2SXNRdWV1ZUVtcHR5KCBweFF1ZXVlICkgIT0gcGRGQUxTRSApCisJCQl7CisJCQkJdHJhY2VCTE9DS0lOR19PTl9RVUVVRV9SRUNFSVZFKCBweFF1ZXVlICk7CisKKwkJCQkjaWYgKCBjb25maWdVU0VfTVVURVhFUyA9PSAxICkKKwkJCQl7CisJCQkJCWlmKCBweFF1ZXVlLT51eFF1ZXVlVHlwZSA9PSBxdWV1ZVFVRVVFX0lTX01VVEVYICkKKwkJCQkJeworCQkJCQkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJCQkJCQl7CisJCQkJCQkJeEluaGVyaXRhbmNlT2NjdXJyZWQgPSB4VGFza1ByaW9yaXR5SW5oZXJpdCggKCB2b2lkICogKSBweFF1ZXVlLT5weE11dGV4SG9sZGVyICk7CisJCQkJCQl9CisJCQkJCQl0YXNrRVhJVF9DUklUSUNBTCgpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJfQorCQkJCSNlbmRpZgorCisJCQkJdlRhc2tQbGFjZU9uRXZlbnRMaXN0KCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICksIHhUaWNrc1RvV2FpdCApOworCQkJCXBydlVubG9ja1F1ZXVlKCBweFF1ZXVlICk7CisJCQkJaWYoIHhUYXNrUmVzdW1lQWxsKCkgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQlwb3J0WUlFTERfV0lUSElOX0FQSSgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIFRoZXJlIHdhcyBubyB0aW1lb3V0IGFuZCB0aGUgc2VtYXBob3JlIGNvdW50IHdhcyBub3QgMCwgc28KKwkJCQlhdHRlbXB0IHRvIHRha2UgdGhlIHNlbWFwaG9yZSBhZ2Fpbi4gKi8KKwkJCQlwcnZVbmxvY2tRdWV1ZSggcHhRdWV1ZSApOworCQkJCSggdm9pZCApIHhUYXNrUmVzdW1lQWxsKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBUaW1lZCBvdXQuICovCisJCQlwcnZVbmxvY2tRdWV1ZSggcHhRdWV1ZSApOworCQkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKworCQkJLyogSWYgdGhlIHNlbWFwaG9yZSBjb3VudCBpcyAwIGV4aXQgbm93IGFzIHRoZSB0aW1lb3V0IGhhcworCQkJZXhwaXJlZC4gIE90aGVyd2lzZSByZXR1cm4gdG8gYXR0ZW1wdCB0byB0YWtlIHRoZSBzZW1hcGhvcmUgdGhhdCBpcworCQkJa25vd24gdG8gYmUgYXZhaWxhYmxlLiAgQXMgc2VtYXBob3JlcyBhcmUgaW1wbGVtZW50ZWQgYnkgcXVldWVzIHRoZQorCQkJcXVldWUgYmVpbmcgZW1wdHkgaXMgZXF1aXZhbGVudCB0byB0aGUgc2VtYXBob3JlIGNvdW50IGJlaW5nIDAuICovCisJCQlpZiggcHJ2SXNRdWV1ZUVtcHR5KCBweFF1ZXVlICkgIT0gcGRGQUxTRSApCisJCQl7CisJCQkJI2lmICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCisJCQkJeworCQkJCQkvKiB4SW5oZXJpdGFuY2VPY2N1cnJlZCBjb3VsZCBvbmx5IGhhdmUgYmUgc2V0IGlmCisJCQkJCXB4UXVldWUtPnV4UXVldWVUeXBlID09IHF1ZXVlUVVFVUVfSVNfTVVURVggc28gbm8gbmVlZCB0bworCQkJCQl0ZXN0IHRoZSBtdXRleCB0eXBlIGFnYWluIHRvIGNoZWNrIGl0IGlzIGFjdHVhbGx5IGEgbXV0ZXguICovCisJCQkJCWlmKCB4SW5oZXJpdGFuY2VPY2N1cnJlZCAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJCQkJCQl7CisJCQkJCQkJVUJhc2VUeXBlX3QgdXhIaWdoZXN0V2FpdGluZ1ByaW9yaXR5OworCisJCQkJCQkJLyogVGhpcyB0YXNrIGJsb2NraW5nIG9uIHRoZSBtdXRleCBjYXVzZWQgYW5vdGhlcgorCQkJCQkJCXRhc2sgdG8gaW5oZXJpdCB0aGlzIHRhc2sncyBwcmlvcml0eS4gIE5vdyB0aGlzIHRhc2sKKwkJCQkJCQloYXMgdGltZWQgb3V0IHRoZSBwcmlvcml0eSBzaG91bGQgYmUgZGlzaW5oZXJpdGVkCisJCQkJCQkJYWdhaW4sIGJ1dCBvbmx5IGFzIGxvdyBhcyB0aGUgbmV4dCBoaWdoZXN0IHByaW9yaXR5CisJCQkJCQkJdGFzayB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoZSBzYW1lIG11dGV4LiAqLworCQkJCQkJCXV4SGlnaGVzdFdhaXRpbmdQcmlvcml0eSA9IHBydkdldERpc2luaGVyaXRQcmlvcml0eUFmdGVyVGltZW91dCggcHhRdWV1ZSApOworCQkJCQkJCXZUYXNrUHJpb3JpdHlEaXNpbmhlcml0QWZ0ZXJUaW1lb3V0KCAoIHZvaWQgKiApIHB4UXVldWUtPnB4TXV0ZXhIb2xkZXIsIHV4SGlnaGVzdFdhaXRpbmdQcmlvcml0eSApOworCQkJCQkJfQorCQkJCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkjZW5kaWYgLyogY29uZmlnVVNFX01VVEVYRVMgKi8KKworCQkJCXRyYWNlUVVFVUVfUkVDRUlWRV9GQUlMRUQoIHB4UXVldWUgKTsKKwkJCQlyZXR1cm4gZXJyUVVFVUVfRU1QVFk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFF1ZXVlUGVlayggUXVldWVIYW5kbGVfdCB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQoreworQmFzZVR5cGVfdCB4RW50cnlUaW1lU2V0ID0gcGRGQUxTRTsKK1RpbWVPdXRfdCB4VGltZU91dDsKK2ludDhfdCAqcGNPcmlnaW5hbFJlYWRQb3NpdGlvbjsKK1F1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CisKKwkvKiBDaGVjayB0aGUgcG9pbnRlciBpcyBub3QgTlVMTC4gKi8KKwljb25maWdBU1NFUlQoICggcHhRdWV1ZSApICk7CisKKwkvKiBUaGUgYnVmZmVyIGludG8gd2hpY2ggZGF0YSBpcyByZWNlaXZlZCBjYW4gb25seSBiZSBOVUxMIGlmIHRoZSBkYXRhIHNpemUKKwlpcyB6ZXJvIChzbyBubyBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBidWZmZXIuICovCisJY29uZmlnQVNTRVJUKCAhKCAoICggcHZCdWZmZXIgKSA9PSBOVUxMICkgJiYgKCAoIHB4UXVldWUgKS0+dXhJdGVtU2l6ZSAhPSAoIFVCYXNlVHlwZV90ICkgMFUgKSApICk7CisKKwkvKiBDYW5ub3QgYmxvY2sgaWYgdGhlIHNjaGVkdWxlciBpcyBzdXNwZW5kZWQuICovCisJI2lmICggKCBJTkNMVURFX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUgPT0gMSApIHx8ICggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkgKQorCXsKKwkJY29uZmlnQVNTRVJUKCAhKCAoIHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSA9PSB0YXNrU0NIRURVTEVSX1NVU1BFTkRFRCApICYmICggeFRpY2tzVG9XYWl0ICE9IDAgKSApICk7CisJfQorCSNlbmRpZgorCisKKwkvKiBUaGlzIGZ1bmN0aW9uIHJlbGF4ZXMgdGhlIGNvZGluZyBzdGFuZGFyZCBzb21ld2hhdCB0byBhbGxvdyByZXR1cm4KKwlzdGF0ZW1lbnRzIHdpdGhpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgVGhpcyBpcyBkb25lIGluIHRoZSBpbnRlcmVzdAorCW9mIGV4ZWN1dGlvbiB0aW1lIGVmZmljaWVuY3kuICovCisKKwlmb3IoIDs7ICkKKwl7CisJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQl7CisJCQljb25zdCBVQmFzZVR5cGVfdCB1eE1lc3NhZ2VzV2FpdGluZyA9IHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nOworCisJCQkvKiBJcyB0aGVyZSBkYXRhIGluIHRoZSBxdWV1ZSBub3c/ICBUbyBiZSBydW5uaW5nIHRoZSBjYWxsaW5nIHRhc2sKKwkJCW11c3QgYmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdGFzayB3YW50aW5nIHRvIGFjY2VzcyB0aGUgcXVldWUuICovCisJCQlpZiggdXhNZXNzYWdlc1dhaXRpbmcgPiAoIFVCYXNlVHlwZV90ICkgMCApCisJCQl7CisJCQkJLyogUmVtZW1iZXIgdGhlIHJlYWQgcG9zaXRpb24gc28gaXQgY2FuIGJlIHJlc2V0IGFmdGVyIHRoZSBkYXRhCisJCQkJaXMgcmVhZCBmcm9tIHRoZSBxdWV1ZSBhcyB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgcGVla2luZyB0aGUKKwkJCQlkYXRhLCBub3QgcmVtb3ZpbmcgaXQuICovCisJCQkJcGNPcmlnaW5hbFJlYWRQb3NpdGlvbiA9IHB4UXVldWUtPnUucGNSZWFkRnJvbTsKKworCQkJCXBydkNvcHlEYXRhRnJvbVF1ZXVlKCBweFF1ZXVlLCBwdkJ1ZmZlciApOworCQkJCXRyYWNlUVVFVUVfUEVFSyggcHhRdWV1ZSApOworCisJCQkJLyogVGhlIGRhdGEgaXMgbm90IGJlaW5nIHJlbW92ZWQsIHNvIHJlc2V0IHRoZSByZWFkIHBvaW50ZXIuICovCisJCQkJcHhRdWV1ZS0+dS5wY1JlYWRGcm9tID0gcGNPcmlnaW5hbFJlYWRQb3NpdGlvbjsKKworCQkJCS8qIFRoZSBkYXRhIGlzIGJlaW5nIGxlZnQgaW4gdGhlIHF1ZXVlLCBzbyBzZWUgaWYgdGhlcmUgYXJlCisJCQkJYW55IG90aGVyIHRhc2tzIHdhaXRpbmcgZm9yIHRoZSBkYXRhLiAqLworCQkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQlpZiggeFRhc2tSZW1vdmVGcm9tRXZlbnRMaXN0KCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKSAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJLyogVGhlIHRhc2sgd2FpdGluZyBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGlzIHRhc2suICovCisJCQkJCQlxdWV1ZVlJRUxEX0lGX1VTSU5HX1BSRUVNUFRJT04oKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCisJCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKwkJCQlyZXR1cm4gcGRQQVNTOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKCB4VGlja3NUb1dhaXQgPT0gKCBUaWNrVHlwZV90ICkgMCApCisJCQkJeworCQkJCQkvKiBUaGUgcXVldWUgd2FzIGVtcHR5IGFuZCBubyBibG9jayB0aW1lIGlzIHNwZWNpZmllZCAob3IKKwkJCQkJdGhlIGJsb2NrIHRpbWUgaGFzIGV4cGlyZWQpIHNvIGxlYXZlIG5vdy4gKi8KKwkJCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKwkJCQkJdHJhY2VRVUVVRV9QRUVLX0ZBSUxFRCggcHhRdWV1ZSApOworCQkJCQlyZXR1cm4gZXJyUVVFVUVfRU1QVFk7CisJCQkJfQorCQkJCWVsc2UgaWYoIHhFbnRyeVRpbWVTZXQgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQkvKiBUaGUgcXVldWUgd2FzIGVtcHR5IGFuZCBhIGJsb2NrIHRpbWUgd2FzIHNwZWNpZmllZCBzbworCQkJCQljb25maWd1cmUgdGhlIHRpbWVvdXQgc3RydWN0dXJlIHJlYWR5IHRvIGVudGVyIHRoZSBibG9ja2VkCisJCQkJCXN0YXRlLiAqLworCQkJCQl2VGFza0ludGVybmFsU2V0VGltZU91dFN0YXRlKCAmeFRpbWVPdXQgKTsKKwkJCQkJeEVudHJ5VGltZVNldCA9IHBkVFJVRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogRW50cnkgdGltZSB3YXMgYWxyZWFkeSBzZXQuICovCisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKworCQkvKiBJbnRlcnJ1cHRzIGFuZCBvdGhlciB0YXNrcyBjYW4gc2VuZCB0byBhbmQgcmVjZWl2ZSBmcm9tIHRoZSBxdWV1ZQorCQlub3cgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaGFzIGJlZW4gZXhpdGVkLiAqLworCisJCXZUYXNrU3VzcGVuZEFsbCgpOworCQlwcnZMb2NrUXVldWUoIHB4UXVldWUgKTsKKworCQkvKiBVcGRhdGUgdGhlIHRpbWVvdXQgc3RhdGUgdG8gc2VlIGlmIGl0IGhhcyBleHBpcmVkIHlldC4gKi8KKwkJaWYoIHhUYXNrQ2hlY2tGb3JUaW1lT3V0KCAmeFRpbWVPdXQsICZ4VGlja3NUb1dhaXQgKSA9PSBwZEZBTFNFICkKKwkJeworCQkJLyogVGltZW91dCBoYXMgbm90IGV4cGlyZWQgeWV0LCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgZGF0YSBpbiB0aGUKKwkJCXF1ZXVlIG5vdywgYW5kIGlmIG5vdCBlbnRlciB0aGUgQmxvY2tlZCBzdGF0ZSB0byB3YWl0IGZvciBkYXRhLiAqLworCQkJaWYoIHBydklzUXVldWVFbXB0eSggcHhRdWV1ZSApICE9IHBkRkFMU0UgKQorCQkJeworCQkJCXRyYWNlQkxPQ0tJTkdfT05fUVVFVUVfUEVFSyggcHhRdWV1ZSApOworCQkJCXZUYXNrUGxhY2VPbkV2ZW50TGlzdCggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApLCB4VGlja3NUb1dhaXQgKTsKKwkJCQlwcnZVbmxvY2tRdWV1ZSggcHhRdWV1ZSApOworCQkJCWlmKCB4VGFza1Jlc3VtZUFsbCgpID09IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJcG9ydFlJRUxEX1dJVEhJTl9BUEkoKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBUaGVyZSBpcyBkYXRhIGluIHRoZSBxdWV1ZSBub3csIHNvIGRvbid0IGVudGVyIHRoZSBibG9ja2VkCisJCQkJc3RhdGUsIGluc3RlYWQgcmV0dXJuIHRvIHRyeSBhbmQgb2J0YWluIHRoZSBkYXRhLiAqLworCQkJCXBydlVubG9ja1F1ZXVlKCBweFF1ZXVlICk7CisJCQkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFRoZSB0aW1lb3V0IGhhcyBleHBpcmVkLiAgSWYgdGhlcmUgaXMgc3RpbGwgbm8gZGF0YSBpbiB0aGUgcXVldWUKKwkJCWV4aXQsIG90aGVyd2lzZSBnbyBiYWNrIGFuZCB0cnkgdG8gcmVhZCB0aGUgZGF0YSBhZ2Fpbi4gKi8KKwkJCXBydlVubG9ja1F1ZXVlKCBweFF1ZXVlICk7CisJCQkoIHZvaWQgKSB4VGFza1Jlc3VtZUFsbCgpOworCisJCQlpZiggcHJ2SXNRdWV1ZUVtcHR5KCBweFF1ZXVlICkgIT0gcGRGQUxTRSApCisJCQl7CisJCQkJdHJhY2VRVUVVRV9QRUVLX0ZBSUxFRCggcHhRdWV1ZSApOworCQkJCXJldHVybiBlcnJRVUVVRV9FTVBUWTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4UXVldWVSZWNlaXZlRnJvbUlTUiggUXVldWVIYW5kbGVfdCB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKQoreworQmFzZVR5cGVfdCB4UmV0dXJuOworVUJhc2VUeXBlX3QgdXhTYXZlZEludGVycnVwdFN0YXR1czsKK1F1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CisKKwljb25maWdBU1NFUlQoIHB4UXVldWUgKTsKKwljb25maWdBU1NFUlQoICEoICggcHZCdWZmZXIgPT0gTlVMTCApICYmICggcHhRdWV1ZS0+dXhJdGVtU2l6ZSAhPSAoIFVCYXNlVHlwZV90ICkgMFUgKSApICk7CisKKwkvKiBSVE9TIHBvcnRzIHRoYXQgc3VwcG9ydCBpbnRlcnJ1cHQgbmVzdGluZyBoYXZlIHRoZSBjb25jZXB0IG9mIGEgbWF4aW11bQorCXN5c3RlbSBjYWxsIChvciBtYXhpbXVtIEFQSSBjYWxsKSBpbnRlcnJ1cHQgcHJpb3JpdHkuICBJbnRlcnJ1cHRzIHRoYXQgYXJlCisJYWJvdmUgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkgYXJlIGtlcHQgcGVybWFuZW50bHkgZW5hYmxlZCwgZXZlbgorCXdoZW4gdGhlIFJUT1Mga2VybmVsIGlzIGluIGEgY3JpdGljYWwgc2VjdGlvbiwgYnV0IGNhbm5vdCBtYWtlIGFueSBjYWxscyB0bworCUZyZWVSVE9TIEFQSSBmdW5jdGlvbnMuICBJZiBjb25maWdBU1NFUlQoKSBpcyBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmgKKwl0aGVuIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSB3aWxsIHJlc3VsdCBpbiBhbiBhc3NlcnRpb24KKwlmYWlsdXJlIGlmIGEgRnJlZVJUT1MgQVBJIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCB0aGF0IGhhcyBiZWVuCisJYXNzaWduZWQgYSBwcmlvcml0eSBhYm92ZSB0aGUgY29uZmlndXJlZCBtYXhpbXVtIHN5c3RlbSBjYWxsIHByaW9yaXR5LgorCU9ubHkgRnJlZVJUT1MgZnVuY3Rpb25zIHRoYXQgZW5kIGluIEZyb21JU1IgY2FuIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdHMKKwl0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGF0IG9yIChsb2dpY2FsbHkpIGJlbG93IHRoZSBtYXhpbXVtCisJc3lzdGVtIGNhbGwJaW50ZXJydXB0IHByaW9yaXR5LiAgRnJlZVJUT1MgbWFpbnRhaW5zIGEgc2VwYXJhdGUgaW50ZXJydXB0CisJc2FmZSBBUEkgdG8gZW5zdXJlIGludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBhcyBzaW1wbGUgYXMgcG9zc2libGUuCisJTW9yZSBpbmZvcm1hdGlvbiAoYWxiZWl0IENvcnRleC1NIHNwZWNpZmljKSBpcyBwcm92aWRlZCBvbiB0aGUgZm9sbG93aW5nCisJbGluazogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCAqLworCXBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKTsKKworCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CisJeworCQljb25zdCBVQmFzZVR5cGVfdCB1eE1lc3NhZ2VzV2FpdGluZyA9IHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nOworCisJCS8qIENhbm5vdCBibG9jayBpbiBhbiBJU1IsIHNvIGNoZWNrIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlLiAqLworCQlpZiggdXhNZXNzYWdlc1dhaXRpbmcgPiAoIFVCYXNlVHlwZV90ICkgMCApCisJCXsKKwkJCWNvbnN0IGludDhfdCBjUnhMb2NrID0gcHhRdWV1ZS0+Y1J4TG9jazsKKworCQkJdHJhY2VRVUVVRV9SRUNFSVZFX0ZST01fSVNSKCBweFF1ZXVlICk7CisKKwkJCXBydkNvcHlEYXRhRnJvbVF1ZXVlKCBweFF1ZXVlLCBwdkJ1ZmZlciApOworCQkJcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmcgPSB1eE1lc3NhZ2VzV2FpdGluZyAtICggVUJhc2VUeXBlX3QgKSAxOworCisJCQkvKiBJZiB0aGUgcXVldWUgaXMgbG9ja2VkIHRoZSBldmVudCBsaXN0IHdpbGwgbm90IGJlIG1vZGlmaWVkLgorCQkJSW5zdGVhZCB1cGRhdGUgdGhlIGxvY2sgY291bnQgc28gdGhlIHRhc2sgdGhhdCB1bmxvY2tzIHRoZSBxdWV1ZQorCQkJd2lsbCBrbm93IHRoYXQgYW4gSVNSIGhhcyByZW1vdmVkIGRhdGEgd2hpbGUgdGhlIHF1ZXVlIHdhcworCQkJbG9ja2VkLiAqLworCQkJaWYoIGNSeExvY2sgPT0gcXVldWVVTkxPQ0tFRCApCisJCQl7CisJCQkJaWYoIGxpc3RMSVNUX0lTX0VNUFRZKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9TZW5kICkgKSA9PSBwZEZBTFNFICkKKwkJCQl7CisJCQkJCWlmKCB4VGFza1JlbW92ZUZyb21FdmVudExpc3QoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1NlbmQgKSApICE9IHBkRkFMU0UgKQorCQkJCQl7CisJCQkJCQkvKiBUaGUgdGFzayB3YWl0aW5nIGhhcyBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHVzIHNvCisJCQkJCQlmb3JjZSBhIGNvbnRleHQgc3dpdGNoLiAqLworCQkJCQkJaWYoIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gIT0gTlVMTCApCisJCQkJCQl7CisJCQkJCQkJKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZFRSVUU7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogSW5jcmVtZW50IHRoZSBsb2NrIGNvdW50IHNvIHRoZSB0YXNrIHRoYXQgdW5sb2NrcyB0aGUgcXVldWUKKwkJCQlrbm93cyB0aGF0IGRhdGEgd2FzIHJlbW92ZWQgd2hpbGUgaXQgd2FzIGxvY2tlZC4gKi8KKwkJCQlweFF1ZXVlLT5jUnhMb2NrID0gKCBpbnQ4X3QgKSAoIGNSeExvY2sgKyAxICk7CisJCQl9CisKKwkJCXhSZXR1cm4gPSBwZFBBU1M7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4UmV0dXJuID0gcGRGQUlMOworCQkJdHJhY2VRVUVVRV9SRUNFSVZFX0ZST01fSVNSX0ZBSUxFRCggcHhRdWV1ZSApOworCQl9CisJfQorCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdXhTYXZlZEludGVycnVwdFN0YXR1cyApOworCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4UXVldWVQZWVrRnJvbUlTUiggUXVldWVIYW5kbGVfdCB4UXVldWUsICB2b2lkICogY29uc3QgcHZCdWZmZXIgKQoreworQmFzZVR5cGVfdCB4UmV0dXJuOworVUJhc2VUeXBlX3QgdXhTYXZlZEludGVycnVwdFN0YXR1czsKK2ludDhfdCAqcGNPcmlnaW5hbFJlYWRQb3NpdGlvbjsKK1F1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CisKKwljb25maWdBU1NFUlQoIHB4UXVldWUgKTsKKwljb25maWdBU1NFUlQoICEoICggcHZCdWZmZXIgPT0gTlVMTCApICYmICggcHhRdWV1ZS0+dXhJdGVtU2l6ZSAhPSAoIFVCYXNlVHlwZV90ICkgMFUgKSApICk7CisJY29uZmlnQVNTRVJUKCBweFF1ZXVlLT51eEl0ZW1TaXplICE9IDAgKTsgLyogQ2FuJ3QgcGVlayBhIHNlbWFwaG9yZS4gKi8KKworCS8qIFJUT1MgcG9ydHMgdGhhdCBzdXBwb3J0IGludGVycnVwdCBuZXN0aW5nIGhhdmUgdGhlIGNvbmNlcHQgb2YgYSBtYXhpbXVtCisJc3lzdGVtIGNhbGwgKG9yIG1heGltdW0gQVBJIGNhbGwpIGludGVycnVwdCBwcmlvcml0eS4gIEludGVycnVwdHMgdGhhdCBhcmUKKwlhYm92ZSB0aGUgbWF4aW11bSBzeXN0ZW0gY2FsbCBwcmlvcml0eSBhcmUga2VwdCBwZXJtYW5lbnRseSBlbmFibGVkLCBldmVuCisJd2hlbiB0aGUgUlRPUyBrZXJuZWwgaXMgaW4gYSBjcml0aWNhbCBzZWN0aW9uLCBidXQgY2Fubm90IG1ha2UgYW55IGNhbGxzIHRvCisJRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucy4gIElmIGNvbmZpZ0FTU0VSVCgpIGlzIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaAorCXRoZW4gcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIHdpbGwgcmVzdWx0IGluIGFuIGFzc2VydGlvbgorCWZhaWx1cmUgaWYgYSBGcmVlUlRPUyBBUEkgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IHRoYXQgaGFzIGJlZW4KKwlhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlIHRoZSBjb25maWd1cmVkIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkuCisJT25seSBGcmVlUlRPUyBmdW5jdGlvbnMgdGhhdCBlbmQgaW4gRnJvbUlTUiBjYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0cworCXRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgKGxvZ2ljYWxseSkgYmVsb3cgdGhlIG1heGltdW0KKwlzeXN0ZW0gY2FsbAlpbnRlcnJ1cHQgcHJpb3JpdHkuICBGcmVlUlRPUyBtYWludGFpbnMgYSBzZXBhcmF0ZSBpbnRlcnJ1cHQKKwlzYWZlIEFQSSB0byBlbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIGFzIHNpbXBsZSBhcyBwb3NzaWJsZS4KKwlNb3JlIGluZm9ybWF0aW9uIChhbGJlaXQgQ29ydGV4LU0gc3BlY2lmaWMpIGlzIHByb3ZpZGVkIG9uIHRoZSBmb2xsb3dpbmcKKwlsaW5rOiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCisJcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpOworCisJdXhTYXZlZEludGVycnVwdFN0YXR1cyA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCS8qIENhbm5vdCBibG9jayBpbiBhbiBJU1IsIHNvIGNoZWNrIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlLiAqLworCQlpZiggcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmcgPiAoIFVCYXNlVHlwZV90ICkgMCApCisJCXsKKwkJCXRyYWNlUVVFVUVfUEVFS19GUk9NX0lTUiggcHhRdWV1ZSApOworCisJCQkvKiBSZW1lbWJlciB0aGUgcmVhZCBwb3NpdGlvbiBzbyBpdCBjYW4gYmUgcmVzZXQgYXMgbm90aGluZyBpcworCQkJYWN0dWFsbHkgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4gKi8KKwkJCXBjT3JpZ2luYWxSZWFkUG9zaXRpb24gPSBweFF1ZXVlLT51LnBjUmVhZEZyb207CisJCQlwcnZDb3B5RGF0YUZyb21RdWV1ZSggcHhRdWV1ZSwgcHZCdWZmZXIgKTsKKwkJCXB4UXVldWUtPnUucGNSZWFkRnJvbSA9IHBjT3JpZ2luYWxSZWFkUG9zaXRpb247CisKKwkJCXhSZXR1cm4gPSBwZFBBU1M7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4UmV0dXJuID0gcGRGQUlMOworCQkJdHJhY2VRVUVVRV9QRUVLX0ZST01fSVNSX0ZBSUxFRCggcHhRdWV1ZSApOworCQl9CisJfQorCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdXhTYXZlZEludGVycnVwdFN0YXR1cyApOworCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVUJhc2VUeXBlX3QgdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZyggY29uc3QgUXVldWVIYW5kbGVfdCB4UXVldWUgKQoreworVUJhc2VUeXBlX3QgdXhSZXR1cm47CisKKwljb25maWdBU1NFUlQoIHhRdWV1ZSApOworCisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJeworCQl1eFJldHVybiA9ICggKCBRdWV1ZV90ICogKSB4UXVldWUgKS0+dXhNZXNzYWdlc1dhaXRpbmc7CisJfQorCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwlyZXR1cm4gdXhSZXR1cm47Cit9IC8qbGludCAhZTgxOCBQb2ludGVyIGNhbm5vdCBiZSBkZWNsYXJlZCBjb25zdCBhcyB4UXVldWUgaXMgYSB0eXBlZGVmIG5vdCBwb2ludGVyLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1VCYXNlVHlwZV90IHV4UXVldWVTcGFjZXNBdmFpbGFibGUoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKK3sKK1VCYXNlVHlwZV90IHV4UmV0dXJuOworUXVldWVfdCAqcHhRdWV1ZTsKKworCXB4UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZTsKKwljb25maWdBU1NFUlQoIHB4UXVldWUgKTsKKworCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCXsKKwkJdXhSZXR1cm4gPSBweFF1ZXVlLT51eExlbmd0aCAtIHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nOworCX0KKwl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJcmV0dXJuIHV4UmV0dXJuOworfSAvKmxpbnQgIWU4MTggUG9pbnRlciBjYW5ub3QgYmUgZGVjbGFyZWQgY29uc3QgYXMgeFF1ZXVlIGlzIGEgdHlwZWRlZiBub3QgcG9pbnRlci4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitVQmFzZVR5cGVfdCB1eFF1ZXVlTWVzc2FnZXNXYWl0aW5nRnJvbUlTUiggY29uc3QgUXVldWVIYW5kbGVfdCB4UXVldWUgKQoreworVUJhc2VUeXBlX3QgdXhSZXR1cm47CisKKwljb25maWdBU1NFUlQoIHhRdWV1ZSApOworCisJdXhSZXR1cm4gPSAoICggUXVldWVfdCAqICkgeFF1ZXVlICktPnV4TWVzc2FnZXNXYWl0aW5nOworCisJcmV0dXJuIHV4UmV0dXJuOworfSAvKmxpbnQgIWU4MTggUG9pbnRlciBjYW5ub3QgYmUgZGVjbGFyZWQgY29uc3QgYXMgeFF1ZXVlIGlzIGEgdHlwZWRlZiBub3QgcG9pbnRlci4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZRdWV1ZURlbGV0ZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKQoreworUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZTsKKworCWNvbmZpZ0FTU0VSVCggcHhRdWV1ZSApOworCXRyYWNlUVVFVUVfREVMRVRFKCBweFF1ZXVlICk7CisKKwkjaWYgKCBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFID4gMCApCisJeworCQl2UXVldWVVbnJlZ2lzdGVyUXVldWUoIHB4UXVldWUgKTsKKwl9CisJI2VuZGlmCisKKwkjaWYoICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAwICkgKQorCXsKKwkJLyogVGhlIHF1ZXVlIGNhbiBvbmx5IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgLSBmcmVlIGl0CisJCWFnYWluLiAqLworCQl2UG9ydEZyZWUoIHB4UXVldWUgKTsKKwl9CisJI2VsaWYoICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCXsKKwkJLyogVGhlIHF1ZXVlIGNvdWxkIGhhdmUgYmVlbiBhbGxvY2F0ZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgc28KKwkJY2hlY2sgYmVmb3JlIGF0dGVtcHRpbmcgdG8gZnJlZSB0aGUgbWVtb3J5LiAqLworCQlpZiggcHhRdWV1ZS0+dWNTdGF0aWNhbGx5QWxsb2NhdGVkID09ICggdWludDhfdCApIHBkRkFMU0UgKQorCQl7CisJCQl2UG9ydEZyZWUoIHB4UXVldWUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKwkjZWxzZQorCXsKKwkJLyogVGhlIHF1ZXVlIG11c3QgaGF2ZSBiZWVuIHN0YXRpY2FsbHkgYWxsb2NhdGVkLCBzbyBpcyBub3QgZ29pbmcgdG8gYmUKKwkJZGVsZXRlZC4gIEF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHRoZSB1bnVzZWQgcGFyYW1ldGVyLiAqLworCQkoIHZvaWQgKSBweFF1ZXVlOworCX0KKwkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gKi8KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisKKwlVQmFzZVR5cGVfdCB1eFF1ZXVlR2V0UXVldWVOdW1iZXIoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKKwl7CisJCXJldHVybiAoICggUXVldWVfdCAqICkgeFF1ZXVlICktPnV4UXVldWVOdW1iZXI7CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCisJdm9pZCB2UXVldWVTZXRRdWV1ZU51bWJlciggUXVldWVIYW5kbGVfdCB4UXVldWUsIFVCYXNlVHlwZV90IHV4UXVldWVOdW1iZXIgKQorCXsKKwkJKCAoIFF1ZXVlX3QgKiApIHhRdWV1ZSApLT51eFF1ZXVlTnVtYmVyID0gdXhRdWV1ZU51bWJlcjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisKKwl1aW50OF90IHVjUXVldWVHZXRRdWV1ZVR5cGUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKKwl7CisJCXJldHVybiAoICggUXVldWVfdCAqICkgeFF1ZXVlICktPnVjUXVldWVUeXBlOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCisKKwlzdGF0aWMgVUJhc2VUeXBlX3QgcHJ2R2V0RGlzaW5oZXJpdFByaW9yaXR5QWZ0ZXJUaW1lb3V0KCBjb25zdCBRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSApCisJeworCVVCYXNlVHlwZV90IHV4SGlnaGVzdFByaW9yaXR5T2ZXYWl0aW5nVGFza3M7CisKKwkJLyogSWYgYSB0YXNrIHdhaXRpbmcgZm9yIGEgbXV0ZXggY2F1c2VzIHRoZSBtdXRleCBob2xkZXIgdG8gaW5oZXJpdCBhCisJCXByaW9yaXR5LCBidXQgdGhlIHdhaXRpbmcgdGFzayB0aW1lcyBvdXQsIHRoZW4gdGhlIGhvbGRlciBzaG91bGQKKwkJZGlzaW5oZXJpdCB0aGUgcHJpb3JpdHkgLSBidXQgb25seSBkb3duIHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IG9mIGFueQorCQlvdGhlciB0YXNrcyB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGUgc2FtZSBtdXRleC4gIEZvciB0aGlzIHB1cnBvc2UsCisJCXJldHVybiB0aGUgcHJpb3JpdHkgb2YgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdGFzayB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoZQorCQltdXRleC4gKi8KKwkJaWYoIGxpc3RDVVJSRU5UX0xJU1RfTEVOR1RIKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKSA+IDAgKQorCQl7CisJCQl1eEhpZ2hlc3RQcmlvcml0eU9mV2FpdGluZ1Rhc2tzID0gY29uZmlnTUFYX1BSSU9SSVRJRVMgLSBsaXN0R0VUX0lURU1fVkFMVUVfT0ZfSEVBRF9FTlRSWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl1eEhpZ2hlc3RQcmlvcml0eU9mV2FpdGluZ1Rhc2tzID0gdHNrSURMRV9QUklPUklUWTsKKwkJfQorCisJCXJldHVybiB1eEhpZ2hlc3RQcmlvcml0eU9mV2FpdGluZ1Rhc2tzOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9NVVRFWEVTICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIEJhc2VUeXBlX3QgcHJ2Q29weURhdGFUb1F1ZXVlKCBRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSwgY29uc3Qgdm9pZCAqcHZJdGVtVG9RdWV1ZSwgY29uc3QgQmFzZVR5cGVfdCB4UG9zaXRpb24gKQoreworQmFzZVR5cGVfdCB4UmV0dXJuID0gcGRGQUxTRTsKK1VCYXNlVHlwZV90IHV4TWVzc2FnZXNXYWl0aW5nOworCisJLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisKKwl1eE1lc3NhZ2VzV2FpdGluZyA9IHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nOworCisJaWYoIHB4UXVldWUtPnV4SXRlbVNpemUgPT0gKCBVQmFzZVR5cGVfdCApIDAgKQorCXsKKwkJI2lmICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCisJCXsKKwkJCWlmKCBweFF1ZXVlLT51eFF1ZXVlVHlwZSA9PSBxdWV1ZVFVRVVFX0lTX01VVEVYICkKKwkJCXsKKwkJCQkvKiBUaGUgbXV0ZXggaXMgbm8gbG9uZ2VyIGJlaW5nIGhlbGQuICovCisJCQkJeFJldHVybiA9IHhUYXNrUHJpb3JpdHlEaXNpbmhlcml0KCAoIHZvaWQgKiApIHB4UXVldWUtPnB4TXV0ZXhIb2xkZXIgKTsKKwkJCQlweFF1ZXVlLT5weE11dGV4SG9sZGVyID0gTlVMTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ1VTRV9NVVRFWEVTICovCisJfQorCWVsc2UgaWYoIHhQb3NpdGlvbiA9PSBxdWV1ZVNFTkRfVE9fQkFDSyApCisJeworCQkoIHZvaWQgKSBtZW1jcHkoICggdm9pZCAqICkgcHhRdWV1ZS0+cGNXcml0ZVRvLCBwdkl0ZW1Ub1F1ZXVlLCAoIHNpemVfdCApIHB4UXVldWUtPnV4SXRlbVNpemUgKTsgLypsaW50ICFlOTYxICFlNDE4IE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBvcnRzLCBwbHVzIHByZXZpb3VzIGxvZ2ljIGVuc3VyZXMgYSBudWxsIHBvaW50ZXIgY2FuIG9ubHkgYmUgcGFzc2VkIHRvIG1lbWNweSgpIGlmIHRoZSBjb3B5IHNpemUgaXMgMC4gKi8KKwkJcHhRdWV1ZS0+cGNXcml0ZVRvICs9IHB4UXVldWUtPnV4SXRlbVNpemU7CisJCWlmKCBweFF1ZXVlLT5wY1dyaXRlVG8gPj0gcHhRdWV1ZS0+cGNUYWlsICkgLypsaW50ICFlOTQ2IE1JU1JBIGV4Y2VwdGlvbiBqdXN0aWZpZWQgYXMgY29tcGFyaXNvbiBvZiBwb2ludGVycyBpcyB0aGUgY2xlYW5lc3Qgc29sdXRpb24uICovCisJCXsKKwkJCXB4UXVldWUtPnBjV3JpdGVUbyA9IHB4UXVldWUtPnBjSGVhZDsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkoIHZvaWQgKSBtZW1jcHkoICggdm9pZCAqICkgcHhRdWV1ZS0+dS5wY1JlYWRGcm9tLCBwdkl0ZW1Ub1F1ZXVlLCAoIHNpemVfdCApIHB4UXVldWUtPnV4SXRlbVNpemUgKTsgLypsaW50ICFlOTYxIE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBvcnRzLiAqLworCQlweFF1ZXVlLT51LnBjUmVhZEZyb20gLT0gcHhRdWV1ZS0+dXhJdGVtU2l6ZTsKKwkJaWYoIHB4UXVldWUtPnUucGNSZWFkRnJvbSA8IHB4UXVldWUtPnBjSGVhZCApIC8qbGludCAhZTk0NiBNSVNSQSBleGNlcHRpb24ganVzdGlmaWVkIGFzIGNvbXBhcmlzb24gb2YgcG9pbnRlcnMgaXMgdGhlIGNsZWFuZXN0IHNvbHV0aW9uLiAqLworCQl7CisJCQlweFF1ZXVlLT51LnBjUmVhZEZyb20gPSAoIHB4UXVldWUtPnBjVGFpbCAtIHB4UXVldWUtPnV4SXRlbVNpemUgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCWlmKCB4UG9zaXRpb24gPT0gcXVldWVPVkVSV1JJVEUgKQorCQl7CisJCQlpZiggdXhNZXNzYWdlc1dhaXRpbmcgPiAoIFVCYXNlVHlwZV90ICkgMCApCisJCQl7CisJCQkJLyogQW4gaXRlbSBpcyBub3QgYmVpbmcgYWRkZWQgYnV0IG92ZXJ3cml0dGVuLCBzbyBzdWJ0cmFjdAorCQkJCW9uZSBmcm9tIHRoZSByZWNvcmRlZCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHF1ZXVlIHNvIHdoZW4KKwkJCQlvbmUgaXMgYWRkZWQgYWdhaW4gYmVsb3cgdGhlIG51bWJlciBvZiByZWNvcmRlZCBpdGVtcyByZW1haW5zCisJCQkJY29ycmVjdC4gKi8KKwkJCQktLXV4TWVzc2FnZXNXYWl0aW5nOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKworCXB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nID0gdXhNZXNzYWdlc1dhaXRpbmcgKyAoIFVCYXNlVHlwZV90ICkgMTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydkNvcHlEYXRhRnJvbVF1ZXVlKCBRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSwgdm9pZCAqIGNvbnN0IHB2QnVmZmVyICkKK3sKKwlpZiggcHhRdWV1ZS0+dXhJdGVtU2l6ZSAhPSAoIFVCYXNlVHlwZV90ICkgMCApCisJeworCQlweFF1ZXVlLT51LnBjUmVhZEZyb20gKz0gcHhRdWV1ZS0+dXhJdGVtU2l6ZTsKKwkJaWYoIHB4UXVldWUtPnUucGNSZWFkRnJvbSA+PSBweFF1ZXVlLT5wY1RhaWwgKSAvKmxpbnQgIWU5NDYgTUlTUkEgZXhjZXB0aW9uIGp1c3RpZmllZCBhcyB1c2Ugb2YgdGhlIHJlbGF0aW9uYWwgb3BlcmF0b3IgaXMgdGhlIGNsZWFuZXN0IHNvbHV0aW9ucy4gKi8KKwkJeworCQkJcHhRdWV1ZS0+dS5wY1JlYWRGcm9tID0gcHhRdWV1ZS0+cGNIZWFkOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJCSggdm9pZCApIG1lbWNweSggKCB2b2lkICogKSBwdkJ1ZmZlciwgKCB2b2lkICogKSBweFF1ZXVlLT51LnBjUmVhZEZyb20sICggc2l6ZV90ICkgcHhRdWV1ZS0+dXhJdGVtU2l6ZSApOyAvKmxpbnQgIWU5NjEgIWU0MTggTUlTUkEgZXhjZXB0aW9uIGFzIHRoZSBjYXN0cyBhcmUgb25seSByZWR1bmRhbnQgZm9yIHNvbWUgcG9ydHMuICBBbHNvIHByZXZpb3VzIGxvZ2ljIGVuc3VyZXMgYSBudWxsIHBvaW50ZXIgY2FuIG9ubHkgYmUgcGFzc2VkIHRvIG1lbWNweSgpIHdoZW4gdGhlIGNvdW50IGlzIDAuICovCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlVubG9ja1F1ZXVlKCBRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSApCit7CisJLyogVEhJUyBGVU5DVElPTiBNVVNUIEJFIENBTExFRCBXSVRIIFRIRSBTQ0hFRFVMRVIgU1VTUEVOREVELiAqLworCisJLyogVGhlIGxvY2sgY291bnRzIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZXh0cmEgZGF0YSBpdGVtcyBwbGFjZWQgb3IKKwlyZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHdoaWxlIHRoZSBxdWV1ZSB3YXMgbG9ja2VkLiAgV2hlbiBhIHF1ZXVlIGlzCisJbG9ja2VkIGl0ZW1zIGNhbiBiZSBhZGRlZCBvciByZW1vdmVkLCBidXQgdGhlIGV2ZW50IGxpc3RzIGNhbm5vdCBiZQorCXVwZGF0ZWQuICovCisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJeworCQlpbnQ4X3QgY1R4TG9jayA9IHB4UXVldWUtPmNUeExvY2s7CisKKwkJLyogU2VlIGlmIGRhdGEgd2FzIGFkZGVkIHRvIHRoZSBxdWV1ZSB3aGlsZSBpdCB3YXMgbG9ja2VkLiAqLworCQl3aGlsZSggY1R4TG9jayA+IHF1ZXVlTE9DS0VEX1VOTU9ESUZJRUQgKQorCQl7CisJCQkvKiBEYXRhIHdhcyBwb3N0ZWQgd2hpbGUgdGhlIHF1ZXVlIHdhcyBsb2NrZWQuICBBcmUgYW55IHRhc2tzCisJCQlibG9ja2VkIHdhaXRpbmcgZm9yIGRhdGEgdG8gYmVjb21lIGF2YWlsYWJsZT8gKi8KKwkJCSNpZiAoIGNvbmZpZ1VTRV9RVUVVRV9TRVRTID09IDEgKQorCQkJeworCQkJCWlmKCBweFF1ZXVlLT5weFF1ZXVlU2V0Q29udGFpbmVyICE9IE5VTEwgKQorCQkJCXsKKwkJCQkJaWYoIHBydk5vdGlmeVF1ZXVlU2V0Q29udGFpbmVyKCBweFF1ZXVlLCBxdWV1ZVNFTkRfVE9fQkFDSyApICE9IHBkRkFMU0UgKQorCQkJCQl7CisJCQkJCQkvKiBUaGUgcXVldWUgaXMgYSBtZW1iZXIgb2YgYSBxdWV1ZSBzZXQsIGFuZCBwb3N0aW5nIHRvCisJCQkJCQl0aGUgcXVldWUgc2V0IGNhdXNlZCBhIGhpZ2hlciBwcmlvcml0eSB0YXNrIHRvIHVuYmxvY2suCisJCQkJCQlBIGNvbnRleHQgc3dpdGNoIGlzIHJlcXVpcmVkLiAqLworCQkJCQkJdlRhc2tNaXNzZWRZaWVsZCgpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIFRhc2tzIHRoYXQgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQgbGlzdCB3aWxsIGdldAorCQkJCQlhZGRlZCB0byB0aGUgcGVuZGluZyByZWFkeSBsaXN0IGFzIHRoZSBzY2hlZHVsZXIgaXMgc3RpbGwKKwkJCQkJc3VzcGVuZGVkLiAqLworCQkJCQlpZiggbGlzdExJU1RfSVNfRU1QVFkoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1JlY2VpdmUgKSApID09IHBkRkFMU0UgKQorCQkJCQl7CisJCQkJCQlpZiggeFRhc2tSZW1vdmVGcm9tRXZlbnRMaXN0KCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKSAhPSBwZEZBTFNFICkKKwkJCQkJCXsKKwkJCQkJCQkvKiBUaGUgdGFzayB3YWl0aW5nIGhhcyBhIGhpZ2hlciBwcmlvcml0eSBzbyByZWNvcmQgdGhhdCBhCisJCQkJCQkJY29udGV4dAlzd2l0Y2ggaXMgcmVxdWlyZWQuICovCisJCQkJCQkJdlRhc2tNaXNzZWRZaWVsZCgpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJI2Vsc2UgLyogY29uZmlnVVNFX1FVRVVFX1NFVFMgKi8KKwkJCXsKKwkJCQkvKiBUYXNrcyB0aGF0IGFyZSByZW1vdmVkIGZyb20gdGhlIGV2ZW50IGxpc3Qgd2lsbCBnZXQgYWRkZWQgdG8KKwkJCQl0aGUgcGVuZGluZyByZWFkeSBsaXN0IGFzIHRoZSBzY2hlZHVsZXIgaXMgc3RpbGwgc3VzcGVuZGVkLiAqLworCQkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQlpZiggeFRhc2tSZW1vdmVGcm9tRXZlbnRMaXN0KCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKSAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJLyogVGhlIHRhc2sgd2FpdGluZyBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgc28gcmVjb3JkIHRoYXQKKwkJCQkJCWEgY29udGV4dCBzd2l0Y2ggaXMgcmVxdWlyZWQuICovCisJCQkJCQl2VGFza01pc3NlZFlpZWxkKCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJI2VuZGlmIC8qIGNvbmZpZ1VTRV9RVUVVRV9TRVRTICovCisKKwkJCS0tY1R4TG9jazsKKwkJfQorCisJCXB4UXVldWUtPmNUeExvY2sgPSBxdWV1ZVVOTE9DS0VEOworCX0KKwl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJLyogRG8gdGhlIHNhbWUgZm9yIHRoZSBSeCBsb2NrLiAqLworCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCXsKKwkJaW50OF90IGNSeExvY2sgPSBweFF1ZXVlLT5jUnhMb2NrOworCisJCXdoaWxlKCBjUnhMb2NrID4gcXVldWVMT0NLRURfVU5NT0RJRklFRCApCisJCXsKKwkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvU2VuZCApICkgPT0gcGRGQUxTRSApCisJCQl7CisJCQkJaWYoIHhUYXNrUmVtb3ZlRnJvbUV2ZW50TGlzdCggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvU2VuZCApICkgIT0gcGRGQUxTRSApCisJCQkJeworCQkJCQl2VGFza01pc3NlZFlpZWxkKCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisKKwkJCQktLWNSeExvY2s7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlweFF1ZXVlLT5jUnhMb2NrID0gcXVldWVVTkxPQ0tFRDsKKwl9CisJdGFza0VYSVRfQ1JJVElDQUwoKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgQmFzZVR5cGVfdCBwcnZJc1F1ZXVlRW1wdHkoIGNvbnN0IFF1ZXVlX3QgKnB4UXVldWUgKQoreworQmFzZVR5cGVfdCB4UmV0dXJuOworCisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJeworCQlpZiggcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmcgPT0gKCBVQmFzZVR5cGVfdCApICAwICkKKwkJeworCQkJeFJldHVybiA9IHBkVFJVRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXhSZXR1cm4gPSBwZEZBTFNFOworCQl9CisJfQorCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhRdWV1ZUlzUXVldWVFbXB0eUZyb21JU1IoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKK3sKK0Jhc2VUeXBlX3QgeFJldHVybjsKKworCWNvbmZpZ0FTU0VSVCggeFF1ZXVlICk7CisJaWYoICggKCBRdWV1ZV90ICogKSB4UXVldWUgKS0+dXhNZXNzYWdlc1dhaXRpbmcgPT0gKCBVQmFzZVR5cGVfdCApIDAgKQorCXsKKwkJeFJldHVybiA9IHBkVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IHBkRkFMU0U7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9IC8qbGludCAhZTgxOCB4UXVldWUgY291bGQgbm90IGJlIHBvaW50ZXIgdG8gY29uc3QgYmVjYXVzZSBpdCBpcyBhIHR5cGVkZWYuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIEJhc2VUeXBlX3QgcHJ2SXNRdWV1ZUZ1bGwoIGNvbnN0IFF1ZXVlX3QgKnB4UXVldWUgKQoreworQmFzZVR5cGVfdCB4UmV0dXJuOworCisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJeworCQlpZiggcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmcgPT0gcHhRdWV1ZS0+dXhMZW5ndGggKQorCQl7CisJCQl4UmV0dXJuID0gcGRUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJeFJldHVybiA9IHBkRkFMU0U7CisJCX0KKwl9CisJdGFza0VYSVRfQ1JJVElDQUwoKTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFF1ZXVlSXNRdWV1ZUZ1bGxGcm9tSVNSKCBjb25zdCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApCit7CitCYXNlVHlwZV90IHhSZXR1cm47CisKKwljb25maWdBU1NFUlQoIHhRdWV1ZSApOworCWlmKCAoICggUXVldWVfdCAqICkgeFF1ZXVlICktPnV4TWVzc2FnZXNXYWl0aW5nID09ICggKCBRdWV1ZV90ICogKSB4UXVldWUgKS0+dXhMZW5ndGggKQorCXsKKwkJeFJldHVybiA9IHBkVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IHBkRkFMU0U7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9IC8qbGludCAhZTgxOCB4UXVldWUgY291bGQgbm90IGJlIHBvaW50ZXIgdG8gY29uc3QgYmVjYXVzZSBpdCBpcyBhIHR5cGVkZWYuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX0NPX1JPVVRJTkVTID09IDEgKQorCisJQmFzZVR5cGVfdCB4UXVldWVDUlNlbmQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICpwdkl0ZW1Ub1F1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKwlRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworCisJCS8qIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5IGZ1bGwgd2UgbWF5IGhhdmUgdG8gYmxvY2suICBBIGNyaXRpY2FsIHNlY3Rpb24KKwkJaXMgcmVxdWlyZWQgdG8gcHJldmVudCBhbiBpbnRlcnJ1cHQgcmVtb3Zpbmcgc29tZXRoaW5nIGZyb20gdGhlIHF1ZXVlCisJCWJldHdlZW4gdGhlIGNoZWNrIHRvIHNlZSBpZiB0aGUgcXVldWUgaXMgZnVsbCBhbmQgYmxvY2tpbmcgb24gdGhlIHF1ZXVlLiAqLworCQlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJCXsKKwkJCWlmKCBwcnZJc1F1ZXVlRnVsbCggcHhRdWV1ZSApICE9IHBkRkFMU0UgKQorCQkJeworCQkJCS8qIFRoZSBxdWV1ZSBpcyBmdWxsIC0gZG8gd2Ugd2FudCB0byBibG9jayBvciBqdXN0IGxlYXZlIHdpdGhvdXQKKwkJCQlwb3N0aW5nPyAqLworCQkJCWlmKCB4VGlja3NUb1dhaXQgPiAoIFRpY2tUeXBlX3QgKSAwICkKKwkJCQl7CisJCQkJCS8qIEFzIHRoaXMgaXMgY2FsbGVkIGZyb20gYSBjb3JvdXRpbmUgd2UgY2Fubm90IGJsb2NrIGRpcmVjdGx5LCBidXQKKwkJCQkJcmV0dXJuIGluZGljYXRpbmcgdGhhdCB3ZSBuZWVkIHRvIGJsb2NrLiAqLworCQkJCQl2Q29Sb3V0aW5lQWRkVG9EZWxheWVkTGlzdCggeFRpY2tzVG9XYWl0LCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9TZW5kICkgKTsKKwkJCQkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisJCQkJCXJldHVybiBlcnJRVUVVRV9CTE9DS0VEOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwkJCQkJcmV0dXJuIGVyclFVRVVFX0ZVTEw7CisJCQkJfQorCQkJfQorCQl9CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCisJCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwkJeworCQkJaWYoIHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nIDwgcHhRdWV1ZS0+dXhMZW5ndGggKQorCQkJeworCQkJCS8qIFRoZXJlIGlzIHJvb20gaW4gdGhlIHF1ZXVlLCBjb3B5IHRoZSBkYXRhIGludG8gdGhlIHF1ZXVlLiAqLworCQkJCXBydkNvcHlEYXRhVG9RdWV1ZSggcHhRdWV1ZSwgcHZJdGVtVG9RdWV1ZSwgcXVldWVTRU5EX1RPX0JBQ0sgKTsKKwkJCQl4UmV0dXJuID0gcGRQQVNTOworCisJCQkJLyogV2VyZSBhbnkgY28tcm91dGluZXMgd2FpdGluZyBmb3IgZGF0YSB0byBiZWNvbWUgYXZhaWxhYmxlPyAqLworCQkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQkvKiBJbiB0aGlzIGluc3RhbmNlIHRoZSBjby1yb3V0aW5lIGNvdWxkIGJlIHBsYWNlZCBkaXJlY3RseQorCQkJCQlpbnRvIHRoZSByZWFkeSBsaXN0IGFzIHdlIGFyZSB3aXRoaW4gYSBjcml0aWNhbCBzZWN0aW9uLgorCQkJCQlJbnN0ZWFkIHRoZSBzYW1lIHBlbmRpbmcgcmVhZHkgbGlzdCBtZWNoYW5pc20gaXMgdXNlZCBhcyBpZgorCQkJCQl0aGUgZXZlbnQgd2VyZSBjYXVzZWQgZnJvbSB3aXRoaW4gYW4gaW50ZXJydXB0LiAqLworCQkJCQlpZiggeENvUm91dGluZVJlbW92ZUZyb21FdmVudExpc3QoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1JlY2VpdmUgKSApICE9IHBkRkFMU0UgKQorCQkJCQl7CisJCQkJCQkvKiBUaGUgY28tcm91dGluZSB3YWl0aW5nIGhhcyBhIGhpZ2hlciBwcmlvcml0eSBzbyByZWNvcmQKKwkJCQkJCXRoYXQgYSB5aWVsZCBtaWdodCBiZSBhcHByb3ByaWF0ZS4gKi8KKwkJCQkJCXhSZXR1cm4gPSBlcnJRVUVVRV9ZSUVMRDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXhSZXR1cm4gPSBlcnJRVUVVRV9GVUxMOworCQkJfQorCQl9CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9DT19ST1VUSU5FUyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9DT19ST1VUSU5FUyA9PSAxICkKKworCUJhc2VUeXBlX3QgeFF1ZXVlQ1JSZWNlaXZlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgdm9pZCAqcHZCdWZmZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKKwl7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CisKKwkJLyogSWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkgZW1wdHkgd2UgbWF5IGhhdmUgdG8gYmxvY2suICBBIGNyaXRpY2FsIHNlY3Rpb24KKwkJaXMgcmVxdWlyZWQgdG8gcHJldmVudCBhbiBpbnRlcnJ1cHQgYWRkaW5nIHNvbWV0aGluZyB0byB0aGUgcXVldWUKKwkJYmV0d2VlbiB0aGUgY2hlY2sgdG8gc2VlIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSBhbmQgYmxvY2tpbmcgb24gdGhlIHF1ZXVlLiAqLworCQlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJCXsKKwkJCWlmKCBweFF1ZXVlLT51eE1lc3NhZ2VzV2FpdGluZyA9PSAoIFVCYXNlVHlwZV90ICkgMCApCisJCQl7CisJCQkJLyogVGhlcmUgYXJlIG5vIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZSwgZG8gd2Ugd2FudCB0byBibG9jayBvciBqdXN0CisJCQkJbGVhdmUgd2l0aCBub3RoaW5nPyAqLworCQkJCWlmKCB4VGlja3NUb1dhaXQgPiAoIFRpY2tUeXBlX3QgKSAwICkKKwkJCQl7CisJCQkJCS8qIEFzIHRoaXMgaXMgYSBjby1yb3V0aW5lIHdlIGNhbm5vdCBibG9jayBkaXJlY3RseSwgYnV0IHJldHVybgorCQkJCQlpbmRpY2F0aW5nIHRoYXQgd2UgbmVlZCB0byBibG9jay4gKi8KKwkJCQkJdkNvUm91dGluZUFkZFRvRGVsYXllZExpc3QoIHhUaWNrc1RvV2FpdCwgJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICk7CisJCQkJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCQkJCQlyZXR1cm4gZXJyUVVFVUVfQkxPQ0tFRDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisJCQkJCXJldHVybiBlcnJRVUVVRV9GVUxMOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisKKwkJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCQl7CisJCQlpZiggcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmcgPiAoIFVCYXNlVHlwZV90ICkgMCApCisJCQl7CisJCQkJLyogRGF0YSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgcXVldWUuICovCisJCQkJcHhRdWV1ZS0+dS5wY1JlYWRGcm9tICs9IHB4UXVldWUtPnV4SXRlbVNpemU7CisJCQkJaWYoIHB4UXVldWUtPnUucGNSZWFkRnJvbSA+PSBweFF1ZXVlLT5wY1RhaWwgKQorCQkJCXsKKwkJCQkJcHhRdWV1ZS0+dS5wY1JlYWRGcm9tID0gcHhRdWV1ZS0+cGNIZWFkOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJCS0tKCBweFF1ZXVlLT51eE1lc3NhZ2VzV2FpdGluZyApOworCQkJCSggdm9pZCApIG1lbWNweSggKCB2b2lkICogKSBwdkJ1ZmZlciwgKCB2b2lkICogKSBweFF1ZXVlLT51LnBjUmVhZEZyb20sICggdW5zaWduZWQgKSBweFF1ZXVlLT51eEl0ZW1TaXplICk7CisKKwkJCQl4UmV0dXJuID0gcGRQQVNTOworCisJCQkJLyogV2VyZSBhbnkgY28tcm91dGluZXMgd2FpdGluZyBmb3Igc3BhY2UgdG8gYmVjb21lIGF2YWlsYWJsZT8gKi8KKwkJCQlpZiggbGlzdExJU1RfSVNfRU1QVFkoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1NlbmQgKSApID09IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJLyogSW4gdGhpcyBpbnN0YW5jZSB0aGUgY28tcm91dGluZSBjb3VsZCBiZSBwbGFjZWQgZGlyZWN0bHkKKwkJCQkJaW50byB0aGUgcmVhZHkgbGlzdCBhcyB3ZSBhcmUgd2l0aGluIGEgY3JpdGljYWwgc2VjdGlvbi4KKwkJCQkJSW5zdGVhZCB0aGUgc2FtZSBwZW5kaW5nIHJlYWR5IGxpc3QgbWVjaGFuaXNtIGlzIHVzZWQgYXMgaWYKKwkJCQkJdGhlIGV2ZW50IHdlcmUgY2F1c2VkIGZyb20gd2l0aGluIGFuIGludGVycnVwdC4gKi8KKwkJCQkJaWYoIHhDb1JvdXRpbmVSZW1vdmVGcm9tRXZlbnRMaXN0KCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9TZW5kICkgKSAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJeFJldHVybiA9IGVyclFVRVVFX1lJRUxEOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJeFJldHVybiA9IHBkRkFJTDsKKwkJCX0KKwkJfQorCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfQ09fUk9VVElORVMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfQ09fUk9VVElORVMgPT0gMSApCisKKwlCYXNlVHlwZV90IHhRdWV1ZUNSU2VuZEZyb21JU1IoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICpwdkl0ZW1Ub1F1ZXVlLCBCYXNlVHlwZV90IHhDb1JvdXRpbmVQcmV2aW91c2x5V29rZW4gKQorCXsKKwlRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworCisJCS8qIENhbm5vdCBibG9jayB3aXRoaW4gYW4gSVNSIHNvIGlmIHRoZXJlIGlzIG5vIHNwYWNlIG9uIHRoZSBxdWV1ZSB0aGVuCisJCWV4aXQgd2l0aG91dCBkb2luZyBhbnl0aGluZy4gKi8KKwkJaWYoIHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nIDwgcHhRdWV1ZS0+dXhMZW5ndGggKQorCQl7CisJCQlwcnZDb3B5RGF0YVRvUXVldWUoIHB4UXVldWUsIHB2SXRlbVRvUXVldWUsIHF1ZXVlU0VORF9UT19CQUNLICk7CisKKwkJCS8qIFdlIG9ubHkgd2FudCB0byB3YWtlIG9uZSBjby1yb3V0aW5lIHBlciBJU1IsIHNvIGNoZWNrIHRoYXQgYQorCQkJY28tcm91dGluZSBoYXMgbm90IGFscmVhZHkgYmVlbiB3b2tlbi4gKi8KKwkJCWlmKCB4Q29Sb3V0aW5lUHJldmlvdXNseVdva2VuID09IHBkRkFMU0UgKQorCQkJeworCQkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgPT0gcGRGQUxTRSApCisJCQkJeworCQkJCQlpZiggeENvUm91dGluZVJlbW92ZUZyb21FdmVudExpc3QoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1JlY2VpdmUgKSApICE9IHBkRkFMU0UgKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gcGRUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisKKwkJcmV0dXJuIHhDb1JvdXRpbmVQcmV2aW91c2x5V29rZW47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX0NPX1JPVVRJTkVTICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX0NPX1JPVVRJTkVTID09IDEgKQorCisJQmFzZVR5cGVfdCB4UXVldWVDUlJlY2VpdmVGcm9tSVNSKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgdm9pZCAqcHZCdWZmZXIsIEJhc2VUeXBlX3QgKnB4Q29Sb3V0aW5lV29rZW4gKQorCXsKKwlCYXNlVHlwZV90IHhSZXR1cm47CisJUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZTsKKworCQkvKiBXZSBjYW5ub3QgYmxvY2sgZnJvbSBhbiBJU1IsIHNvIGNoZWNrIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlLiBJZgorCQlub3QgdGhlbiBqdXN0IGxlYXZlIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuICovCisJCWlmKCBweFF1ZXVlLT51eE1lc3NhZ2VzV2FpdGluZyA+ICggVUJhc2VUeXBlX3QgKSAwICkKKwkJeworCQkJLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBxdWV1ZS4gKi8KKwkJCXB4UXVldWUtPnUucGNSZWFkRnJvbSArPSBweFF1ZXVlLT51eEl0ZW1TaXplOworCQkJaWYoIHB4UXVldWUtPnUucGNSZWFkRnJvbSA+PSBweFF1ZXVlLT5wY1RhaWwgKQorCQkJeworCQkJCXB4UXVldWUtPnUucGNSZWFkRnJvbSA9IHB4UXVldWUtPnBjSGVhZDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCQktLSggcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmcgKTsKKwkJCSggdm9pZCApIG1lbWNweSggKCB2b2lkICogKSBwdkJ1ZmZlciwgKCB2b2lkICogKSBweFF1ZXVlLT51LnBjUmVhZEZyb20sICggdW5zaWduZWQgKSBweFF1ZXVlLT51eEl0ZW1TaXplICk7CisKKwkJCWlmKCAoICpweENvUm91dGluZVdva2VuICkgPT0gcGRGQUxTRSApCisJCQl7CisJCQkJaWYoIGxpc3RMSVNUX0lTX0VNUFRZKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9TZW5kICkgKSA9PSBwZEZBTFNFICkKKwkJCQl7CisJCQkJCWlmKCB4Q29Sb3V0aW5lUmVtb3ZlRnJvbUV2ZW50TGlzdCggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvU2VuZCApICkgIT0gcGRGQUxTRSApCisJCQkJCXsKKwkJCQkJCSpweENvUm91dGluZVdva2VuID0gcGRUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCisJCQl4UmV0dXJuID0gcGRQQVNTOworCQl9CisJCWVsc2UKKwkJeworCQkJeFJldHVybiA9IHBkRkFJTDsKKwkJfQorCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9DT19ST1VUSU5FUyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwICkKKworCXZvaWQgdlF1ZXVlQWRkVG9SZWdpc3RyeSggUXVldWVIYW5kbGVfdCB4UXVldWUsIGNvbnN0IGNoYXIgKnBjUXVldWVOYW1lICkgLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisJeworCVVCYXNlVHlwZV90IHV4OworCisJCS8qIFNlZSBpZiB0aGVyZSBpcyBhbiBlbXB0eSBzcGFjZSBpbiB0aGUgcmVnaXN0cnkuICBBIE5VTEwgbmFtZSBkZW5vdGVzCisJCWEgZnJlZSBzbG90LiAqLworCQlmb3IoIHV4ID0gKCBVQmFzZVR5cGVfdCApIDBVOyB1eCA8ICggVUJhc2VUeXBlX3QgKSBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFOyB1eCsrICkKKwkJeworCQkJaWYoIHhRdWV1ZVJlZ2lzdHJ5WyB1eCBdLnBjUXVldWVOYW1lID09IE5VTEwgKQorCQkJeworCQkJCS8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHF1ZXVlLiAqLworCQkJCXhRdWV1ZVJlZ2lzdHJ5WyB1eCBdLnBjUXVldWVOYW1lID0gcGNRdWV1ZU5hbWU7CisJCQkJeFF1ZXVlUmVnaXN0cnlbIHV4IF0ueEhhbmRsZSA9IHhRdWV1ZTsKKworCQkJCXRyYWNlUVVFVUVfUkVHSVNUUllfQUREKCB4UXVldWUsIHBjUXVldWVOYW1lICk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisJfQorCisjZW5kaWYgLyogY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwICkKKworCWNvbnN0IGNoYXIgKnBjUXVldWVHZXROYW1lKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApIC8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworCXsKKwlVQmFzZVR5cGVfdCB1eDsKKwljb25zdCBjaGFyICpwY1JldHVybiA9IE5VTEw7IC8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworCisJCS8qIE5vdGUgdGhlcmUgaXMgbm90aGluZyBoZXJlIHRvIHByb3RlY3QgYWdhaW5zdCBhbm90aGVyIHRhc2sgYWRkaW5nIG9yCisJCXJlbW92aW5nIGVudHJpZXMgZnJvbSB0aGUgcmVnaXN0cnkgd2hpbGUgaXQgaXMgYmVpbmcgc2VhcmNoZWQuICovCisJCWZvciggdXggPSAoIFVCYXNlVHlwZV90ICkgMFU7IHV4IDwgKCBVQmFzZVR5cGVfdCApIGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkU7IHV4KysgKQorCQl7CisJCQlpZiggeFF1ZXVlUmVnaXN0cnlbIHV4IF0ueEhhbmRsZSA9PSB4UXVldWUgKQorCQkJeworCQkJCXBjUmV0dXJuID0geFF1ZXVlUmVnaXN0cnlbIHV4IF0ucGNRdWV1ZU5hbWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHBjUmV0dXJuOworCX0gLypsaW50ICFlODE4IHhRdWV1ZSBjYW5ub3QgYmUgYSBwb2ludGVyIHRvIGNvbnN0IGJlY2F1c2UgaXQgaXMgYSB0eXBlZGVmLiAqLworCisjZW5kaWYgLyogY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwICkKKworCXZvaWQgdlF1ZXVlVW5yZWdpc3RlclF1ZXVlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApCisJeworCVVCYXNlVHlwZV90IHV4OworCisJCS8qIFNlZSBpZiB0aGUgaGFuZGxlIG9mIHRoZSBxdWV1ZSBiZWluZyB1bnJlZ2lzdGVyZWQgaW4gYWN0dWFsbHkgaW4gdGhlCisJCXJlZ2lzdHJ5LiAqLworCQlmb3IoIHV4ID0gKCBVQmFzZVR5cGVfdCApIDBVOyB1eCA8ICggVUJhc2VUeXBlX3QgKSBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFOyB1eCsrICkKKwkJeworCQkJaWYoIHhRdWV1ZVJlZ2lzdHJ5WyB1eCBdLnhIYW5kbGUgPT0geFF1ZXVlICkKKwkJCXsKKwkJCQkvKiBTZXQgdGhlIG5hbWUgdG8gTlVMTCB0byBzaG93IHRoYXQgdGhpcyBzbG90IGlmIGZyZWUgYWdhaW4uICovCisJCQkJeFF1ZXVlUmVnaXN0cnlbIHV4IF0ucGNRdWV1ZU5hbWUgPSBOVUxMOworCisJCQkJLyogU2V0IHRoZSBoYW5kbGUgdG8gTlVMTCB0byBlbnN1cmUgdGhlIHNhbWUgcXVldWUgaGFuZGxlIGNhbm5vdAorCQkJCWFwcGVhciBpbiB0aGUgcmVnaXN0cnkgdHdpY2UgaWYgaXQgaXMgYWRkZWQsIHJlbW92ZWQsIHRoZW4KKwkJCQlhZGRlZCBhZ2Fpbi4gKi8KKwkJCQl4UXVldWVSZWdpc3RyeVsgdXggXS54SGFuZGxlID0gKCBRdWV1ZUhhbmRsZV90ICkgMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKworCX0gLypsaW50ICFlODE4IHhRdWV1ZSBjb3VsZCBub3QgYmUgcG9pbnRlciB0byBjb25zdCBiZWNhdXNlIGl0IGlzIGEgdHlwZWRlZi4gKi8KKworI2VuZGlmIC8qIGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfVElNRVJTID09IDEgKQorCisJdm9pZCB2UXVldWVXYWl0Rm9yTWVzc2FnZVJlc3RyaWN0ZWQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCwgY29uc3QgQmFzZVR5cGVfdCB4V2FpdEluZGVmaW5pdGVseSApCisJeworCVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CisKKwkJLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBhcHBsaWNhdGlvbiBjb2RlIGhlbmNlIHRoZQorCQknUmVzdHJpY3RlZCcgaW4gaXRzIG5hbWUuICBJdCBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gIEl0IGlzCisJCWRlc2lnbmVkIGZvciB1c2UgYnkga2VybmVsIGNvZGUsIGFuZCBoYXMgc3BlY2lhbCBjYWxsaW5nIHJlcXVpcmVtZW50cy4KKwkJSXQgY2FuIHJlc3VsdCBpbiB2TGlzdEluc2VydCgpIGJlaW5nIGNhbGxlZCBvbiBhIGxpc3QgdGhhdCBjYW4gb25seQorCQlwb3NzaWJseSBldmVyIGhhdmUgb25lIGl0ZW0gaW4gaXQsIHNvIHRoZSBsaXN0IHdpbGwgYmUgZmFzdCwgYnV0IGV2ZW4KKwkJc28gaXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBzY2hlZHVsZXIgbG9ja2VkIGFuZCBub3QgZnJvbSBhIGNyaXRpY2FsCisJCXNlY3Rpb24uICovCisKKwkJLyogT25seSBkbyBhbnl0aGluZyBpZiB0aGVyZSBhcmUgbm8gbWVzc2FnZXMgaW4gdGhlIHF1ZXVlLiAgVGhpcyBmdW5jdGlvbgorCQl3aWxsIG5vdCBhY3R1YWxseSBjYXVzZSB0aGUgdGFzayB0byBibG9jaywganVzdCBwbGFjZSBpdCBvbiBhIGJsb2NrZWQKKwkJbGlzdC4gIEl0IHdpbGwgbm90IGJsb2NrIHVudGlsIHRoZSBzY2hlZHVsZXIgaXMgdW5sb2NrZWQgLSBhdCB3aGljaAorCQl0aW1lIGEgeWllbGQgd2lsbCBiZSBwZXJmb3JtZWQuICBJZiBhbiBpdGVtIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSB3aGlsZQorCQl0aGUgcXVldWUgaXMgbG9ja2VkLCBhbmQgdGhlIGNhbGxpbmcgdGFzayBibG9ja3Mgb24gdGhlIHF1ZXVlLCB0aGVuIHRoZQorCQljYWxsaW5nIHRhc2sgd2lsbCBiZSBpbW1lZGlhdGVseSB1bmJsb2NrZWQgd2hlbiB0aGUgcXVldWUgaXMgdW5sb2NrZWQuICovCisJCXBydkxvY2tRdWV1ZSggcHhRdWV1ZSApOworCQlpZiggcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmcgPT0gKCBVQmFzZVR5cGVfdCApIDBVICkKKwkJeworCQkJLyogVGhlcmUgaXMgbm90aGluZyBpbiB0aGUgcXVldWUsIGJsb2NrIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4gKi8KKwkJCXZUYXNrUGxhY2VPbkV2ZW50TGlzdFJlc3RyaWN0ZWQoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1JlY2VpdmUgKSwgeFRpY2tzVG9XYWl0LCB4V2FpdEluZGVmaW5pdGVseSApOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJCXBydlVubG9ja1F1ZXVlKCBweFF1ZXVlICk7CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RJTUVSUyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCisJUXVldWVTZXRIYW5kbGVfdCB4UXVldWVDcmVhdGVTZXQoIGNvbnN0IFVCYXNlVHlwZV90IHV4RXZlbnRRdWV1ZUxlbmd0aCApCisJeworCVF1ZXVlU2V0SGFuZGxlX3QgcHhRdWV1ZTsKKworCQlweFF1ZXVlID0geFF1ZXVlR2VuZXJpY0NyZWF0ZSggdXhFdmVudFF1ZXVlTGVuZ3RoLCAoIFVCYXNlVHlwZV90ICkgc2l6ZW9mKCBRdWV1ZV90ICogKSwgcXVldWVRVUVVRV9UWVBFX1NFVCApOworCisJCXJldHVybiBweFF1ZXVlOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9RVUVVRV9TRVRTICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX1FVRVVFX1NFVFMgPT0gMSApCisKKwlCYXNlVHlwZV90IHhRdWV1ZUFkZFRvU2V0KCBRdWV1ZVNldE1lbWJlckhhbmRsZV90IHhRdWV1ZU9yU2VtYXBob3JlLCBRdWV1ZVNldEhhbmRsZV90IHhRdWV1ZVNldCApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKworCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJeworCQkJaWYoICggKCBRdWV1ZV90ICogKSB4UXVldWVPclNlbWFwaG9yZSApLT5weFF1ZXVlU2V0Q29udGFpbmVyICE9IE5VTEwgKQorCQkJeworCQkJCS8qIENhbm5vdCBhZGQgYSBxdWV1ZS9zZW1hcGhvcmUgdG8gbW9yZSB0aGFuIG9uZSBxdWV1ZSBzZXQuICovCisJCQkJeFJldHVybiA9IHBkRkFJTDsKKwkJCX0KKwkJCWVsc2UgaWYoICggKCBRdWV1ZV90ICogKSB4UXVldWVPclNlbWFwaG9yZSApLT51eE1lc3NhZ2VzV2FpdGluZyAhPSAoIFVCYXNlVHlwZV90ICkgMCApCisJCQl7CisJCQkJLyogQ2Fubm90IGFkZCBhIHF1ZXVlL3NlbWFwaG9yZSB0byBhIHF1ZXVlIHNldCBpZiB0aGVyZSBhcmUgYWxyZWFkeQorCQkJCWl0ZW1zIGluIHRoZSBxdWV1ZS9zZW1hcGhvcmUuICovCisJCQkJeFJldHVybiA9IHBkRkFJTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkoICggUXVldWVfdCAqICkgeFF1ZXVlT3JTZW1hcGhvcmUgKS0+cHhRdWV1ZVNldENvbnRhaW5lciA9IHhRdWV1ZVNldDsKKwkJCQl4UmV0dXJuID0gcGRQQVNTOworCQkJfQorCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1FVRVVFX1NFVFMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkKKworCUJhc2VUeXBlX3QgeFF1ZXVlUmVtb3ZlRnJvbVNldCggUXVldWVTZXRNZW1iZXJIYW5kbGVfdCB4UXVldWVPclNlbWFwaG9yZSwgUXVldWVTZXRIYW5kbGVfdCB4UXVldWVTZXQgKQorCXsKKwlCYXNlVHlwZV90IHhSZXR1cm47CisJUXVldWVfdCAqIGNvbnN0IHB4UXVldWVPclNlbWFwaG9yZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlT3JTZW1hcGhvcmU7CisKKwkJaWYoIHB4UXVldWVPclNlbWFwaG9yZS0+cHhRdWV1ZVNldENvbnRhaW5lciAhPSB4UXVldWVTZXQgKQorCQl7CisJCQkvKiBUaGUgcXVldWUgd2FzIG5vdCBhIG1lbWJlciBvZiB0aGUgc2V0LiAqLworCQkJeFJldHVybiA9IHBkRkFJTDsKKwkJfQorCQllbHNlIGlmKCBweFF1ZXVlT3JTZW1hcGhvcmUtPnV4TWVzc2FnZXNXYWl0aW5nICE9ICggVUJhc2VUeXBlX3QgKSAwICkKKwkJeworCQkJLyogSXQgaXMgZGFuZ2Vyb3VzIHRvIHJlbW92ZSBhIHF1ZXVlIGZyb20gYSBzZXQgd2hlbiB0aGUgcXVldWUgaXMKKwkJCW5vdCBlbXB0eSBiZWNhdXNlIHRoZSBxdWV1ZSBzZXQgd2lsbCBzdGlsbCBob2xkIHBlbmRpbmcgZXZlbnRzIGZvcgorCQkJdGhlIHF1ZXVlLiAqLworCQkJeFJldHVybiA9IHBkRkFJTDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQkJeworCQkJCS8qIFRoZSBxdWV1ZSBpcyBubyBsb25nZXIgY29udGFpbmVkIGluIHRoZSBzZXQuICovCisJCQkJcHhRdWV1ZU9yU2VtYXBob3JlLT5weFF1ZXVlU2V0Q29udGFpbmVyID0gTlVMTDsKKwkJCX0KKwkJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisJCQl4UmV0dXJuID0gcGRQQVNTOworCQl9CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfSAvKmxpbnQgIWU4MTggeFF1ZXVlU2V0IGNvdWxkIG5vdCBiZSBkZWNsYXJlZCBhcyBwb2ludGluZyB0byBjb25zdCBhcyBpdCBpcyBhIHR5cGVkZWYuICovCisKKyNlbmRpZiAvKiBjb25maWdVU0VfUVVFVUVfU0VUUyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9RVUVVRV9TRVRTID09IDEgKQorCisJUXVldWVTZXRNZW1iZXJIYW5kbGVfdCB4UXVldWVTZWxlY3RGcm9tU2V0KCBRdWV1ZVNldEhhbmRsZV90IHhRdWV1ZVNldCwgVGlja1R5cGVfdCBjb25zdCB4VGlja3NUb1dhaXQgKQorCXsKKwlRdWV1ZVNldE1lbWJlckhhbmRsZV90IHhSZXR1cm4gPSBOVUxMOworCisJCSggdm9pZCApIHhRdWV1ZVJlY2VpdmUoICggUXVldWVIYW5kbGVfdCApIHhRdWV1ZVNldCwgJnhSZXR1cm4sIHhUaWNrc1RvV2FpdCApOyAvKmxpbnQgIWU5NjEgQ2FzdGluZyBmcm9tIG9uZSB0eXBlZGVmIHRvIGFub3RoZXIgaXMgbm90IHJlZHVuZGFudC4gKi8KKwkJcmV0dXJuIHhSZXR1cm47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1FVRVVFX1NFVFMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkKKworCVF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgeFF1ZXVlU2VsZWN0RnJvbVNldEZyb21JU1IoIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0ICkKKwl7CisJUXVldWVTZXRNZW1iZXJIYW5kbGVfdCB4UmV0dXJuID0gTlVMTDsKKworCQkoIHZvaWQgKSB4UXVldWVSZWNlaXZlRnJvbUlTUiggKCBRdWV1ZUhhbmRsZV90ICkgeFF1ZXVlU2V0LCAmeFJldHVybiwgTlVMTCApOyAvKmxpbnQgIWU5NjEgQ2FzdGluZyBmcm9tIG9uZSB0eXBlZGVmIHRvIGFub3RoZXIgaXMgbm90IHJlZHVuZGFudC4gKi8KKwkJcmV0dXJuIHhSZXR1cm47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1FVRVVFX1NFVFMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkKKworCXN0YXRpYyBCYXNlVHlwZV90IHBydk5vdGlmeVF1ZXVlU2V0Q29udGFpbmVyKCBjb25zdCBRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSwgY29uc3QgQmFzZVR5cGVfdCB4Q29weVBvc2l0aW9uICkKKwl7CisJUXVldWVfdCAqcHhRdWV1ZVNldENvbnRhaW5lciA9IHB4UXVldWUtPnB4UXVldWVTZXRDb250YWluZXI7CisJQmFzZVR5cGVfdCB4UmV0dXJuID0gcGRGQUxTRTsKKworCQkvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZvcm0gYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCisJCWNvbmZpZ0FTU0VSVCggcHhRdWV1ZVNldENvbnRhaW5lciApOworCQljb25maWdBU1NFUlQoIHB4UXVldWVTZXRDb250YWluZXItPnV4TWVzc2FnZXNXYWl0aW5nIDwgcHhRdWV1ZVNldENvbnRhaW5lci0+dXhMZW5ndGggKTsKKworCQlpZiggcHhRdWV1ZVNldENvbnRhaW5lci0+dXhNZXNzYWdlc1dhaXRpbmcgPCBweFF1ZXVlU2V0Q29udGFpbmVyLT51eExlbmd0aCApCisJCXsKKwkJCWNvbnN0IGludDhfdCBjVHhMb2NrID0gcHhRdWV1ZVNldENvbnRhaW5lci0+Y1R4TG9jazsKKworCQkJdHJhY2VRVUVVRV9TRU5EKCBweFF1ZXVlU2V0Q29udGFpbmVyICk7CisKKwkJCS8qIFRoZSBkYXRhIGNvcGllZCBpcyB0aGUgaGFuZGxlIG9mIHRoZSBxdWV1ZSB0aGF0IGNvbnRhaW5zIGRhdGEuICovCisJCQl4UmV0dXJuID0gcHJ2Q29weURhdGFUb1F1ZXVlKCBweFF1ZXVlU2V0Q29udGFpbmVyLCAmcHhRdWV1ZSwgeENvcHlQb3NpdGlvbiApOworCisJCQlpZiggY1R4TG9jayA9PSBxdWV1ZVVOTE9DS0VEICkKKwkJCXsKKwkJCQlpZiggbGlzdExJU1RfSVNfRU1QVFkoICYoIHB4UXVldWVTZXRDb250YWluZXItPnhUYXNrc1dhaXRpbmdUb1JlY2VpdmUgKSApID09IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJaWYoIHhUYXNrUmVtb3ZlRnJvbUV2ZW50TGlzdCggJiggcHhRdWV1ZVNldENvbnRhaW5lci0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgIT0gcGRGQUxTRSApCisJCQkJCXsKKwkJCQkJCS8qIFRoZSB0YXNrIHdhaXRpbmcgaGFzIGEgaGlnaGVyIHByaW9yaXR5LiAqLworCQkJCQkJeFJldHVybiA9IHBkVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXB4UXVldWVTZXRDb250YWluZXItPmNUeExvY2sgPSAoIGludDhfdCApICggY1R4TG9jayArIDEgKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9RVUVVRV9TRVRTICovCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvcmVhZG1lLnR4dCBiL1NvdXJjZS9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDgwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcmVhZG1lLnR4dApAQCAtMCwwICsxLDE3IEBACitFYWNoIHJlYWwgdGltZSBrZXJuZWwgcG9ydCBjb25zaXN0cyBvZiB0aHJlZSBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlIGNvcmUga2VybmVsCitjb21wb25lbnRzIGFuZCBhcmUgY29tbW9uIHRvIGV2ZXJ5IHBvcnQsIGFuZCBvbmUgb3IgbW9yZSBmaWxlcyB0aGF0IGFyZSAKK3NwZWNpZmljIHRvIGEgcGFydGljdWxhciBtaWNyb2NvbnRyb2xsZXIgYW5kIG9yIGNvbXBpbGVyLgorCisrIFRoZSBGcmVlUlRPUy9Tb3VyY2UgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSB0aHJlZSBmaWxlcyB0aGF0IGFyZSBjb21tb24gdG8gCitldmVyeSBwb3J0IC0gbGlzdC5jLCBxdWV1ZS5jIGFuZCB0YXNrcy5jLiAgVGhlIGtlcm5lbCBpcyBjb250YWluZWQgd2l0aGluIHRoZXNlIAordGhyZWUgZmlsZXMuICBjcm91dGluZS5jIGltcGxlbWVudHMgdGhlIG9wdGlvbmFsIGNvLXJvdXRpbmUgZnVuY3Rpb25hbGl0eSAtIHdoaWNoCitpcyBub3JtYWxseSBvbmx5IHVzZWQgb24gdmVyeSBtZW1vcnkgbGltaXRlZCBzeXN0ZW1zLgorCisrIFRoZSBGcmVlUlRPUy9Tb3VyY2UvUG9ydGFibGUgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBmaWxlcyB0aGF0IGFyZSBzcGVjaWZpYyB0byAKK2EgcGFydGljdWxhciBtaWNyb2NvbnRyb2xsZXIgYW5kIG9yIGNvbXBpbGVyLgorCisrIFRoZSBGcmVlUlRPUy9Tb3VyY2UvaW5jbHVkZSBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHJlYWwgdGltZSBrZXJuZWwgaGVhZGVyIAorZmlsZXMuCisKK1NlZSB0aGUgcmVhZG1lIGZpbGUgaW4gdGhlIEZyZWVSVE9TL1NvdXJjZS9Qb3J0YWJsZSBkaXJlY3RvcnkgZm9yIG1vcmUgCitpbmZvcm1hdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Tb3VyY2Uvc3RfcmVhZG1lLnR4dCBiL1NvdXJjZS9zdF9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTJjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uvc3RfcmVhZG1lLnR4dApAQCAtMCwwICsxLDMzMiBAQAorCisgIEB2ZXJiYXRpbQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqICAgICAgICAgICBQb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcyBJbnRlcm5hdGlvbmFsIE4uVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgKiAgICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDE2IFJlYWwgVGltZSBFbmdpbmVlcnMgTHRkLCBBbGwgcmlnaHRzIHJlc2VydmVkCisgICoKKyAgKiBAZmlsZSAgICBzdF9yZWFkbWUudHh0CisgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KKyAgKiBAYnJpZWYgICBUaGlzIGZpbGUgbGlzdHMgdGhlIG1haW4gbW9kaWZpY2F0aW9uIGRvbmUgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIG9uCisgICogICAgICAgICAgRnJlZVJUT1MgZm9yIGludGVncmF0aW9uIHdpdGggU1RNMzJDdWJlIHNvbHV0aW9uLgorICAqICAgICAgICAgIEZvciBtb3JlIGRldGFpbHMgb24gRnJlZVJUT1MgaW1wbGVtZW50YXRpb24gb24gU1RNMzJDdWJlLCBwbGVhc2UgcmVmZXIKKyAgKiAgICAgICAgICB0byBVTTE3MjIgIkRldmVsb3BpbmcgQXBwbGljYXRpb25zIG9uIFNUTTMyQ3ViZSB3aXRoIEZyZWVSVE9TIgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCisgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICAqICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQGVuZHZlcmJhdGltCisKKz09PT09PT0KKworIyMjIDI5LU1hcnMtMjAxOSAjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKyBjbXNpc19vcy5jIDogRml4IGJ1ZyBpbiBvc1Bvb2xBbGxvYygpOiBtZW1vcnkgYmxvY2tzIGNhbid0IGJlIHJldXNlZCBhZnRlciBiZWluZyBmcmVlJ2QKKyAgKyBTb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vcywgU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MxLmMsIFNvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zMi5jLCBTb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuaDogcmVzdG9yZSBvcmlnaW5hbCBBcGFjaGUgbGljZW5zZSB0ZXJtcworICArIHN0X3JlYWRtZS50eHQ6IHVwZGF0ZSBsaWNlbnNlIHRlcm1zIHRvIEJTRC0zLUNsYXVzZQorCisKKyMjIyAxMy1BdWd1c3QtMjAxOCAjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKyBBZGQgZW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtaXNzaW5nIGZ1bmN0aW9uIG9zVGhyZWFkR2V0U3RhY2tTaXplKCkKKyAgICB0byBhdm9pZCBsaW5rIGVycm9ycyB3aGVuIHVzaW5nIENNU0lTLVJUT1MgVjIuCisKKyAgKyBVcGRhdGUgdGhlIEZyZWVSVE9TQ29uZmlnX3RlbXBsYXRlLmggd2l0aCBzcGVjaWZpYyBkZWZpbmVzIGZvciB0aGUKKyAgICBDTVNJUy1SVE9TIFYyLgorCisgICsgUmVuYW1lIHRoZSAiUlRFX1JUT1NfRnJlZVJUT1NfWFhYWCIgbWFjcm9zIHRvICJVU0VfRnJlZVJUT1NfWFhYWCIgaW4KKyAgICBjbXNpc19vczIuYy4KKworIyMjIDMwLUp1bHktMjAxOCAjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKyArIFVwZGF0ZSBMaWNlbnNlLnR4dCBmaWxlIHRvIE1JVCBsaWNlbnNlIGluc3RlYWQgb2YgR1BMdjIKKworIyMjIDIzLUp1bHktMjAxOCAjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKyArIEZpeCBjb21waWxlciB3YXJuaW5ncyB0aHJvd24gYnkgSUFSIGNvbXBpbGVyIDguMjAKKworICsgQWRkIE1QVSBzdXBwb3J0IGZvciB0aGUgQ003L3IwcDE6CisgIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCisgIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKKyAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKKyAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0YXNtLnMKKyAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAorICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKKyAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKKworIyMjIDA5LUFwcmlsLTIwMTggIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVwZGF0ZSB0aGUgRnJlZVJUT1MgYWdhaW5zdCB0aGUgbGF0ZXN0IHJlbGVhc2UgMTAuMC4xCisgIG1vcmUgZGV0YWlscyBhcmUgYXZhaWxhYmxlIGluOiBodHRwczovL3d3dy5mcmVlcnRvcy5vcmcvSGlzdG9yeS50eHQKKworICArIEludGVncmF0ZSBzdXBwb3J0IGZvciB0aWNrbGVzcyBtb2RlIGZvciBBUk1fQ00wIGNvcmU6CisgICAgLSBHQ0MvQVJNX0NNMC9wb3J0LmMKKyAgICAtIEdDQy9BUk1fQ00wL3BvcnRtYWNyby5oCisgICAgLSBJQVIvQVJNX0NNMC9wb3J0LmMKKyAgICAtIElBUi9BUk1fQ00wL3BvcnRtYWNyby5oCisgICAgLSBSVkRTL0FSTV9DTTAvcG9ydC5jCisKKyBJbnRlZ3JhdGUgQ01TSVMtUlRPU3YyIHdyYXBwZXIgYmFzZWQgb246IGh0dHBzOi8vZ2l0aHViLmNvbS9BUk0tc29mdHdhcmUvQ01TSVMtRnJlZVJUT1MvcmVsZWFzZXMvdGFnLzEwLjAuMQorICArIEFkZCBuZXcgZmlsZXM6CisgICAgLSBDTVNJU19SVE9TX1YyL2Ntc2lzX29zLmgKKyAgICAtIENNU0lTX1JUT1NfVjIvY21zaXNfb3MxLmMKKyAgICAtIENNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmMKKyAgICAtIENNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmgKKyAgICAgICJjbXNpc19vczEuYyIgYW5kICJjbXNpc19vczEuaCIgY29udGFpbnMgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgIENNU0lTLVJUT1N2MSxpLmUgYXMgcmVsZWFzZWQgYnkgQVJNLCB1c2luZyB0aGUgQ01TSVMtUlRPU1YyIEFQSS4KKworICArIFRoZSBTVCBjdXN0b21pemVkIENNU0lTLVJUT1N2MSBpcyBtYWludGFpbmVkIHVuZGVyOgorICAgIC0gQ01TSVNfUlRPUy9jbXNpc19vcy5jCisgICAgLSBDTVNJU19SVE9TL2Ntc2lzX29zLmgKKworICArIFdoZW4gdXNpbmcgQ01TSVMtUlRPU3YyIEFQSXMsIHRoZSBmb2xsb3dpbmcgRnJlZVJUT1MgZGVmaW5lcyBhcmUgcmVxdWlyZWQ6CisgICAgLSAjZGVmaW5lIGNvbmZpZ01BWF9QUklPUklUSUVTICAgICAgICAgICAgICAgICAgICAgNTYKKyAgICAtICNkZWZpbmUgY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAgICAgICAgICAwCisgICAgLSAjZGVmaW5lIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiAgMAorCisKKyMjIyAxMC1BdWd1c3QtMjAxNyAjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVXBkYXRlIEZyZWVSVE9TIHRvIHN1cHBvcnQgTVBVIGZlYXR1cmUgd2l0aCBJQVIgY29tcGlsZXIuCisKKyAgKyBBZGQgdGhlIGZvbGxvd2luZyBwb3J0czoKKyAgICAtIElBUi9BUk1fQ000X01QVQorICAgIC0gSUFSL0FSTV9DTTdfTVBVCisgICAgLSBSVkRTL0FSTV9DTTdfTVBVCisKKworIyMjIDAzLU1hcmNoLTIwMTcgIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT09CisgIFVwZGF0ZSBDTVNJUy1SVE9TIGRyaXZlcnMgdG8gc3VwcG9ydCBib3RoIENNU0lTIENvcmUgVjQueCBhbmQgVjUueAorCisgIEJ1ZyBmaXhlczoKKyAgKyBDTVNJUy1SVE9TOiBXcm9uZyByZXR1cm4gdmFsdWUgZm9yIG9zU2lnbmFsV2FpdCgpCisgICsgQ01TSVMtUlRPUzogTm90IGFsbCBxdWV1ZSBzaXplIGlzIDAgaW5pdGlhbGl6ZWQgd2l0aCBvc01haWxDQWxsb2MoKQorCisgIExpbWl0YXRpb246CisgICsgQ01TSVMtUlRPUzogb3NTaWduYWxXQWl0KCkgZnVuY3Rpb24gaXMgbm90IGZ1bGx5IGNvbXBsaWFudCB3aXRoIHRoZSBzcGVjaWZpY2F0aW9uCisKKworIyMjIDMwLVNlcHRlbWJlci0yMDE2ICMjIworPT09PT09PT09PT09PT09PT09PT09PT09PQorICBUaGUgcHVycG9zZSBvZiB0aGlzIHJlbGVhc2UgaXMgdG8gVXBncmFkZSB0byB1c2UgRnJlZVJUT1MgVjkuMC4wLCB0aGlzIHZlcnNpb24KKyAgaXMgYSBkcm9wLWluIGNvbXBhdGlibGUgcmVwbGFjZW1lbnQgZm9yIEZyZWVSVE9TIFY4LjIuMy4KKyAgRm9yIG1vcmUgZGV0YWlscyBwbGVhc2UgcmVmZXIgdG8gaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvSGlzdG9yeS50eHQKKworICArIEFkZCBzdXBwb3J0IHRvIHRpY2tsZXNzIG1vZGUgZm9yIE1QVSBwb3J0czoKKyAgICAtIEdDQy9BUk1fQ00zX01QVS9wb3J0LmMKKyAgICAtIEdDQy9BUk1fQ000X01QVS9wb3J0LmMKKyAgICAtIFJWRFMvQVJNX0NNNF9NUFUvcG9ydC5jCisKKyAgKyBVcGRhdGUgQ00wIHBvcnRzLCBhZGQgcG9zc2liaWxpdHkgdG8gdXNlIGEgdGltZWJhc2UgZGlmZmVyZW50IHRoYW4gU3lzdGljazoKKyAgICAtIElBUi9BUk1fQ00wL3BvcnQuYworICAgIC0gUlZEUy9BUk1fQ00wL3BvcnQuYworICAgIC0gR0NDL0FSTV9DTTAvcG9ydC5jCisKKyAgKyBGaXggY29tcGlsYXRpb24gZXJyb3IgaW4gQ00zX01QVSBhbmQgQ000X01QVSBwb3J0czoKKyAgICAtIEdDQy9BUk1fQ00zX01QVS9wb3J0bWFjcm8uaAorICAgIC0gR0NDL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCisgICAgLSBSVkRTL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCisgICAgLSBBZGQgIlNvdXJjZVxwb3J0YWJsZVxDb21tb25cIiBkaXJlY3RvcnkKKworICArIGNtc2lzX29zLmMKKyAgICAtIEFkZCBzdXBwb3J0IG9mIFN0YXRpY2FsbHkgQWxsb2NhdGVkIFN5c3RlbXMgaW50cm9kdWNlZCB3aXRoIEZyZWVSVE9TIFY5LjAuMAorICAgIC0gQWRkIG5ldyB3cmFwcGVycyBDTVNJUy1SVE9TIEFQSXMKKworICAgICAgICAgRnJlZVJUT1MgQVBJcyAgICAgICB8ICAgICBDTVNJUy1SVE9TIEFQSXMgICAgICAgIHwgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZygpIHwgIG9zTWVzc2FnZVdhaXRpbmcoKSAgICAgICAgfCAgUmV0dXJuIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgc3RvcmVkIGluIGEgcXVldWUKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHhUYXNrQWJvcnREZWxheSgpICAgICAgICB8ICBvc0Fib3J0RGVsYXkoKSAgICAgICAgICAgIHwgIEZvcmNlIGEgdGhyZWFkIHRvIGdldCBvdXQgdGhlIGJsb2NrZWQgc3RhdGUgaW1tZWRpYXRlbHkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHV4U2VtYXBob3JlR2V0Q291bnQoKSAgICB8ICBvc1NlbWFwaG9yZUdldENvdW50KCkgICAgIHwgIFJldHVybiB0aGUgY3VycmVudCBjb3VudCBvZiBhIHNlbWFwaG9yZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdXhRdWV1ZVNwYWNlc0F2YWlsYWJsZSgpIHwgIG9zTWVzc2FnZUF2YWlsYWJsZVNwYWNlKCkgfCAgUmV0dXJuIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gYSBtZXNzYWdlIHF1ZXVlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2UXVldWVEZWxldGUoKSAgICAgICAgICAgfCAgb3NNZXNzYWdlRGVsZXRlKCkgICAgICAgICB8ICBEZWxldGUgYSBtZXNzYWdlIFF1ZXVlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisjIyMgMjItSmFudWFyeS0yMDE2ICMjIworPT09PT09PT09PT09PT09PT09PT09PT0KKyAgVGhlIHB1cnBvc2Ugb2YgdGhpcyByZWxlYXNlIGlzIHRvIFVwZ3JhZGUgdG8gdXNlIEZyZWVSVE9TIFY4LjIuMy4KKyAgSXQgYWxzbyBwcm92aWRlcyBmaXhlcyBmb3IgbWlub3IgaXNzdWVzLgorCisgICsgY21zaXNfb3MuYworICAgIC0gSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zICJvc1NpZ25hbFNldCIgYW5kICJvc1NpZ25hbFdhaXQiIGFyZSBub3cgZGVsaW1pdGVkIGJ5CisgICAgICAgICAjZGVmaW5lIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMuCisgICAgLSBGdW5jdGlvbiAib3NUaW1lclN0YXJ0IiA6IGZpeCBmb3IgYW4gYXNzZXJ0IGlzc3VlIHdoZW4gY2FsbGVkIGZyb20gYW4gSVNSLgorICAgIC0gRnVuY3Rpb24gIm9zTWFpbENyZWF0ZSIgIDogaW50ZXJuYWwgdmFyaWFibGVzIGluaXRpYWxpemF0aW9uLgorICAgIC0gRnVuY3Rpb24gIm9zU2lnbmFsV2FpdCIgOiBzaWduYWxzIHZhbHVlIGlzIG5vdyBjb21wYXJlZCB2ZXJzdXMgaW50ZWdlciB6ZXJvIGZvciBlcnJvciBjaGVja2luZy4KKworICArIGZyZWVSVE9TIHNvdXJjZXMKKyAgICAtIEZyZWVSVE9TLmggZmlsZSA6IEFkZCBjb25maWd1cmF0aW9uIHNhbml0eSBjaGVjayBpbiBjYXNlIG9mIGNvbmZpZ1VTRV9SRUNVUlNJVkVfTVVURVhFUyAgc2V0CisgICAgICBhbmQgY29uZmlnVVNFX01VVEVYRVMgIG5vdCBzZXQuCisKKyAgKyBTVE1pY3JvZWxlY3Ryb25pY3MgbGljZW5zZSBzaW1wbGlmaWNhdGlvbnMsIHNlZSBsaWNlbnNlIGRpc2NsYWltZXIgd2l0aGluIHRoaXMgZmlsZSdzIGhlYWRlcgorCisKKyMjIyAyNy1NYXJjaC0yMDE1ICMjIworPT09PT09PT09PT09PT09PT09PT09CisgIFRoZSBwdXJwb3NlIG9mIHRoaXMgcmVsZWFzZSBpcyB0byBVcGdyYWRlIHRvIHVzZSBGcmVlUlRPUyBWOC4yLjEuCisKKyAgKyBNYWpvciBjaGFuZ2Ugb2YgdGhlIHZlcnNpb24gOC4yLjEgaXMgdGhlIHN1cHBvcnQgb2YgQ003IGNvcmUuCisgIEZvciBTVE0zMkY3NDZ4eC9TVE0zMkY3NTZ4eCBkZXZpY2VzLCBuZWVkIHRvIHVzZSBwb3J0IGZpbGVzIHVuZGVyIFNvdXJjZS9Qb3J0YWJsZS9YWFgvQVJNX0NNNy9yMHAxLAorICB3aGVyZSBYWFggcmVmZXJzIHRvIHRoZSBjb21waWxlciB1c2VkLgorCisgICsgSXQgYWxzbyBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBvc1NpZ25hbCBtYW5hZ2VtZW50IEFQSXMsIG9zU2lnbmFsU2V0KCkgYW5kIG9zU2lnbmFsV2FpdCgpLAorICBmaXhlcyBvc01hc3NhZ2UgcXVldWUgc2l6ZSwgb3NNYWlsUURlZiBtYWNybyBhbmQgb3NEZWxheVVudGlsIHBhcmFtZXRlcnMuCisKKyAgKyBJbiB0aGlzIHJlbGVhc2UgYW4gYWxpZ25tZW50IGhhcyBiZWVuIGRvbmUgaW4gQVJNX0NNNCBhbmQgQVJNX0NNMyBwb3J0LmMgdmVyc3VzIEFSTV9DTTAgcG9ydC5jCisgIHJlZ2FyZGluZyB0aGUgdXNlIG9mIG1hY3JvcyBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyBhbmQgY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HLCB0aGVzZSB0b3cgbWFjcm9zCisgIGFyZSBub3cgdGFraW5nIGFzIHBhcmFtZXRlciBhcyBwb2ludGVyIHRvIFRpY2tUeXBlX3QuCisKKyAgKyBjbXNpc19vcy5jCisgICAgLSBBZGQgaW1wbGVtZW50YXRpb24gb2Ygb3NTaWduYWxTZXQoKSBhbmQgb3NTaWduYWxXYWl0KCkgQVBJcworICAgIC0gRml4IG1hc3NhZ2UgcXVldWUgc2l6ZSBpbiBvc01lc3NhZ2VDcmVhdGUgQVBJCisgICAgLSBvc0RlbGF5VW50aWw6IHBhcmFtZXRlciBQcmV2aW91c1dha2VUaW1lIGlzIG5vdyBwYXNzZWQgYXMgYSBwb2ludGVyLgorICAgIC0gRW5hYmxpbmcgTWFpbCBxdWV1ZSBtYW5hZ2VtZW50IEFQSXMgKHRlbXBvcmFyeSByZW1vdmVkIGluIHByZXZpb3VzIHZlcnNpb24pLgorICAgIC0gRnVuY3Rpb24gIm9zVGhyZWFkR2V0UHJpb3JpdHkiIHVzZXMgbm93IHV4VGFza1ByaW9yaXR5R2V0RnJvbUlTUiBpZiBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgaGFuZGxlciwgaWYgbm90IHVzZSB1eFRhc2tQcmlvcml0eUdldC4KKworICArIGNtc2lzX29zLmgKKyAgICAtIG9zRmVhdHVyZV9XYWl0IGlzIGRlZmluZWQgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IG9zV2FpdCBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIChhcyBzcGVjaWZpZWQgYnkgY21zaXNfb3MgdGVtcGxhdGUgYnkgQVJNKQorICAgIC0gRml4IGNvbXBpbGF0aW9uIGlzc3VlIHdpdGggb3NNYWlsUURlZiBtYWNyby4KKyAgICAtIEVuYWJsaW5nIE1haWwgcXVldWUgbWFuYWdlbWVudCBBUElzICh0ZW1wb3JhcnkgcmVtb3ZlZCBpbiBwcmV2aW91cyB2ZXJzaW9uKQorCisgICsgZnJlZVJUT1Mgc291cmNlcworICAgIC0gQVJNX0NNMyBwb3J0LmMgYW5kIEFSTV9DTTQgcG9ydC5jOgorICAgICAgZnVuY3Rpb24gdlBvcnRTdXBwcmVzc1RpY2tzQW5kU2xlZXAgOiBjb25maWdQUkVfU0xFRVBfUFJPQ0VTU0lORyBhbmQgY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HIGFyZSBub3cgdGFraW5nCisgICAgICBhcyBwYXJhbWV0ZXIgYXMgcG9pbnRlciB0byBUaWNrVHlwZV90LgorICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBjaGFuZ2UgaXMgdG8gYWxpZ24gdGhlIENNMyBhbmQgQ000IGltcGxlbWVudGF0aW9uIHdpdGggQ00wIG9uZS4KKworICArIE5vdGUKKyAgICAtIG9zU2lnbmFsU2V0IHJldHVybnMgYW4gaW50MzJfdCB2YWx1ZSB3aGljaCBpcyBhIGEgc3RhdHVzIChvc09LIG9yIG9zRXJyb3IpCisgICAgICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBzaWduYWwgdmFsdWUgYXMgc3BlY2lmaWVkIGluIGNtc2lzX29zIHRlbXBsYXRlIGJ5IEFSTS4KKyAgICAgIFRoaXMgaXMgbWFpbmx5IGR1ZSB0byBmcmVlUlRPUyBpbXBsZW1lbnRhdGlvbiwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGFsaWduZWQgKHdpdGggdGhlIGNtc2lzIG9zIHRlbXBsYXRlIGJ5IEFSTSkgYXMgc29vbiBhcyB0aGUgZnJlZVJUT1MgbmV4dCB2ZXJzaW9uIHdpbGwgYWxsb3cgaXQuCisKKyAgICAtIG9zVGhyZWFkRGVmKCkgbWFjcm8gaXMgZGVmaW5lZCBpbiB0aGUgZnJlZVJUT1MgY21zaXNfb3MuaCB3cmFwcGVyIGFzIGZvbGxvdyA6CisgICAgICAgIG9zVGhyZWFkRGVmKG5hbWUsIHRocmVhZCwgcHJpb3JpdHksIGluc3RhbmNlcywgc3RhY2tzeikKKyAgICAgIHRoZSBtYWNybyBvc1RocmVhZERlZigpIGFzIGRlZmluZWQgaW4gQVJNIGNtc2lzX29zLmggaXMgZGVmaW5lZCB3aXRoIDQgcGFyYW1ldGVycyA6CisgICAgICBuYW1lIDogbmFtZSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgorICAgICAgcHJpb3JpdHkgOiBpbml0aWFsIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisgICAgICBpbnN0YW5jZXMgOiBudW1iZXIgb2YgcG9zc2libGUgdGhyZWFkIGluc3RhbmNlcy4KKyAgICAgIHN0YWNrc3ogOiBzdGFjayBzaXplIChpbiBieXRlcykgcmVxdWlyZW1lbnRzIGZvciB0aGUgdGhyZWFkIGZ1bmN0aW9uLgorCisgICAgLSBvc1RocmVhZERlZiBhcyBkZWZpbmVkIGluIHRoZSBBUk0gdGVtcGxhdGUgZmlsZSBjbXNpc19vcy5oIGFzc3VtZXMgdGhhdCB0aGUgdGhyZWFkIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHRocmVhZCBmdW5jdGlvbiBuYW1lLgorICAgICAgd2hlcmUgdGhlIGZyZWVSVE9TIGltcGxlbWVudGF0aW9uIGdpdmVzIHNlcGFyYXRlIHBhcmFtZXRlcnMgZm9yIHRoZSB0aHJlYWQgbmFtZSBhbmQgdGhlIHRocmVhZCBmdW5jdGlvbiBuYW1lLgorCisgICAgICBjYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGZyb20vdG8gYW5vdGhlciBPUyB0by9mcm9tIGZyZWVSVE9TIGNtc2lzX29zIHJlZ2FyZGluZyB0aGlzIG1hY3JvLgorCisgICAgICAgIHRoZSBtYWNybyBvc1RocmVhZERlZigpIGFzIGRlZmluZWQgaW4gQVJNIGNtc2lzX29zLmggdGVtcGxhdGUgaXMgZGVmaW5lZCB3aXRoIDQgcGFyYW1ldGVycyA6CisgICAgICAgICAgIG5hbWUgOiBuYW1lIG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisgICAgICAgICAgIHByaW9yaXR5IDogaW5pdGlhbCBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgorICAgICAgICAgICBpbnN0YW5jZXMgOiBudW1iZXIgb2YgcG9zc2libGUgdGhyZWFkIGluc3RhbmNlcy4KKyAgICAgICAgICAgc3RhY2tzeiA6IHN0YWNrIHNpemUgKGluIGJ5dGVzKSByZXF1aXJlbWVudHMgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisKKyAgICAgICAgdGhlIG1hY3JvIG9zVGhyZWFkRGVmKCkgYXMgZGVmaW5lZCBpbiBmcmVlUlRPUyBjbXNpc19vcy5oIGlzIGRlZmluZWQgd2l0aCA1IHBhcmFtZXRlcnMgOgorICAgICAgICAgICBuYW1lIDogbmFtZSBvZiB0aGUgdGhyZWFkICh1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kIHRyYWNlKS4KKyAgICAgICAgICAgdGhyZWFkIDogbmFtZSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uCisgICAgICAgICAgIHByaW9yaXR5IDogaW5pdGlhbCBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgorICAgICAgICAgICBpbnN0YW5jZXMgOiBudW1iZXIgb2YgcG9zc2libGUgdGhyZWFkIGluc3RhbmNlcy4KKyAgICAgICAgICAgc3RhY2tzeiA6IHN0YWNrIHNpemUgKGluIGJ5dGVzKSByZXF1aXJlbWVudHMgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCisKKworIyMjIDI1LURlY2VtYmVyLTIwMTQgIyMjCis9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVGhlIHB1cnBvc2Ugb2YgdGhpcyByZWxlYXNlIGlzIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvcnMgYW5kIHdhcm5pbmcuIEl0IGFsc28gcmVpbnRyb2R1Y2VzCisgIHRoZSBmdW5jdGlvbiBvc1RocmVhZElzU3VzcGVuZGVkKCkgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlZCBpbiB0aGUgdmVyc2lvbiBWMS4yLjAuCisKKyAgKyBjbXNpc19vcy5jCisgICAgICAtIG9zVGhyZWFkR2V0UHJpb3JpdHkoKSBhbmQgbWFrZUNtc2lzUHJpb3JpdHkoKTogcmVwbGFjZSBJTkNMVURFX3ZUYXNrUHJpb3JpdHlHZXQgYnkgdGhlIGNvcnJlY3QKKyAgICAgICAgIGZyZWVSVE9TIGNvbnN0YW50IHV4VGFza1ByaW9yaXR5R2V0LgorICAgICAgICAgVGhlIHZlcnNpb24gMS4yLjIgaXMgdXNpbmcgYSB3cm9uZyBjb25zdGFudCBJTkNMVURFX3ZUYXNrUHJpb3JpdHlHZXQsIHdoaWxlIHRoZSBjb3JyZWN0IGZyZWVSVE9TCisgICAgICAgICBjb25zdGFudCBpcyB1eFRhc2tQcmlvcml0eUdldC4KKyAgICAgICAgIFRoaXMgZml4IGVuc3VyZSBhIHNhZmUgdXNlIG9mIG9zVGhyZWFkR2V0UHJpb3JpdHkoKSBmdW5jdGlvbi4KKworICAgICAgLSBvc1RocmVhZElzU3VzcGVuZGVkKCk6IHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBpbiB2ZXJzaW9uIFYxLjIuMCwgaXQgaXMgbm93IGF2YWlsYWJsZSBnYWluLgorICAgICAgICAgVXNlciBjYW4gZWl0aGVyIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgVGhyZWFkIGlzIHN1c3BlbmRlZCBlaXRoZXIgdXNlIGZ1bmN0aW9uIG9zVGhyZWFkR2V0U3RhdGUsCisgICAgICAgICB3aGljaCBpcyBtb3JlIGdlbmVyaWMsIHRvIGNoZWNrIHRoZSBleGFjdCBzdGF0ZSBvZiBhIHRocmVhZC4KKworICAgICAgLSBvc1RocmVhZExpc3QoKTogdGhpcyBmdW5jdGlvbiBpcyBub3cgdGFraW5nIGFzIGFyZ3VtZW50IGEgcG9pbnRlciB0byB1aW50OF90IGluc3RlYWQgb2YgYSBwb2ludGVyIHRvIGludDhfdC4KKyAgICAgICAgIFRoZSBjaGFuZ2UgaXMgbWFkZSB0byByZW1vdmUgYSBjb21waWxhdGlvbiB3YXJuaW5nLgorCisgICAgICAtIG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUoKTogdGhlIHByb3RvdHlwZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIG9zTXV0ZXhJZCBvc1JlY3Vyc2l2ZU11dGV4Q3JlYXRlIChjb25zdCBvc011dGV4RGVmX3QgKm11dGV4X2RlZikKKyAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBtYWRlIHRvIG1ha2Ugb3NSZWN1cnNpdmVNdXRleENyZWF0ZSgpIGNvbXBhdGlibGUgd2l0aCBmdW5jdGlvbiBNdXRleENyZWF0ZSgpLgorICAgICAgICAgIEl0IGFsc28gYWxsb3cgdGhlIGJldHRlciB1c2Ugb2YgdGhlIGZ1bmN0aW9uIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG1hY3JvIG9zTXV0ZXgsIG5vdGUgdGhhdCBvc011dGV4IHJldHVybiBhCisgICAgICAgICAgImNvbnN0IG9zTXV0ZXhEZWZfdCAqbXV0ZXhfZGVmIi4KKyAgICAgICAgICBleGFtcGxlIDogb3NNdXRleDFJZCA9IG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUgKG9zTXV0ZXgoTXV0ZXgxKSk7CisKKyAgICAgIC0gRml4IGltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBvc1NlbWFwaG9yZVdhaXQoKSwgb3NNdXRleFJlbGVhc2UoKSBhbmQgb3NNdXRleFdhaXQoKSBieSB1c2luZyB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgIGZyZWVSVE9TIJNGcm9tSVNSlCBBUElzIHdoZW4gY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0LgorCisgICAgICAtIEZpeCBjb21waWxhdGlvbiB3YXJuaW5nIHdoZW4gdGhlIGNvbnN0YW50IElOQ0xVREVfZVRhc2tHZXRTdGF0ZSBpcyBub3QgZGVmaW5lZAorCisgICsgY21zaXNfb3MuaAorICAgICAgLSBvc1RocmVhZElzU3VzcGVuZGVkKCk6IGFkZCBmdW5jdGlvbiBwcm90b3R5cGUuCisgICAgICAtIG9zVGhyZWFkTGlzdCgpOiBmdW5jdGlvbiBwcm90b3R5cGUgbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGluIGNtc2lzX29zLmMgc2VjdGlvbi4KKyAgICAgIC0gb3NSZWN1cnNpdmVNdXRleENyZWF0ZSgpOiBmdW5jdGlvbiBtb2RpZmllZCBhcyBkZXNjcmliZWQgaW4gY21zaXNfb3MuYyBzZWN0aW9uLgorCisgICsgSW1wb3J0YW50IG5vdGU6CisgICAgTWFpbCBRdWV1ZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGNtc2lzX29zIHZlcnNpb24sIHdpbGwgYmUgYWRkZWQgaW4gdGhlIG5leHQgcmVsZWFzZS4KKworCisjIyMgMDQtRGVjZW1iZXItMjAxNCAjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PQorICArIGNtc2lzX29zLmMsIG9zU2VtYXBob3JlQ3JlYXRlKCk6IHVzZSB2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCkgaW5zdGVhZCBvZiB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCksCisgICAgdG8ga2VlcCBjb21wYXRpYmlsaXR5IHdpdGggYXBwbGljYXRpb24gY29kZSBkZXZlbG9wZWQgb24gRnJlZVJUT1MgVjcuNi4wLgorCisKKyMjIyAwNy1Ob3ZlbWJlci0yMDE0ICMjIworPT09PT09PT09PT09PT09PT09PT09PT09CisgICsgY21zaXNfb3MuaDogbW9kaWZ5IHRoZSBvc1RocmVhZFN0YXRlIGVudW0gdG8gZml4IHdhcm5pbmcgZ2VuZXJhdGVkIGJ5IEFSTUNDIGNvbXBpbGVyCisgICsgdGFzay5jOiBhZGQgcHJlcHJvY2Vzc29yIGNvbXBpbGF0aW9uIGNvbmRpdGlvbiBmb3IgcHJ2VGFza0lzVGFza1N1c3BlbmRlZCgpIGZ1bmN0aW9uCisgICAgICAgICAgICAoaXQncyBidWlsZCBvbmx5IHdoZW4gSU5DTFVERV92VGFza1N1c3BlbmQgb3B0aW9uIGlzIGVuYWJsZWQgaW4gRnJlZVJUT1NDb25maWcuaCBmaWxlKQorCisKKyMjIyAwNC1Ob3ZlbWJlci0yMDE0ICMjIworPT09PT09PT09PT09PT09PT09PT09PT09CisgICsgVXBncmFkZSB0byB1c2UgRnJlZVJUT1MgVjguMS4yIGFuZCBDTVNJUy1SVE9TIFYxLjAyLgorICArIGNtc2lzX29zLmMKKyAgICAgIC0gQWxtb3N0IG9mIENNU0lTLVJUT1MgQVBJcyBhcmUgaW1wbGVtZW50ZWQgZm9yIEZyZWVSVE9TCisgICAgICAtIEFkZGl0aW9uYWwgd3JhcHBlciBBUElzIGNyZWF0ZWQgZm9yIEZyZWVSVE9TCisKKyAgKyBJbXBvcnRhbnQgbm90ZToKKyAgICBXaGVuIHVwZ3JhZGluZyBleGlzdGluZyBhcHBsaWNhdGlvbiBjb2RlIHRvIHVzZSB0aGlzIGxhc3QgdmVyc2lvbiwgdGhlIGZvbGxvd2luZworICAgIHVwZGF0ZSBzaG91bGQgYmUgY29uc2lkZXJlZDoKKyAgICAgIC0gb3NUaHJlYWRJc1N1c3BlbmRlZCgpIGlzIG5vIGxvbmdlciBwdWJsaWMgQVBJIGluIEZyZWVSVE9TIGFuZCBpdCBzaG91bGQKKyAgICAgICAgYmUgcmVwbGFjZWQgYnkgdGhlIHdyYXBwaW5nIG9mIGVUYXNrR2V0U3RhdGUoKQorICAgICAgLSBvc0tlcm5lbFN0YXJ0KCkgQVBJIGNoYW5nZWQsIG11c3QgYmUgdXBkYXRlZAorICAgICAgLSB1cGRhdGUgRnJlZVJUT1NDb25maWcuaCBmaWxlLCB0YWtpbmcgRnJlZVJUT1NDb25maWdfdGVtcGxhdGUuaCBmaWxlIGFzIHJlZmVyZW5jZQorCisKKyMjIyAxMy1KdW5lLTIwMTQgIyMjCis9PT09PT09PT09PT09PT09PT09PQorICArIEZyZWVSVE9TQ29uZmlnX3RlbXBsYXRlLmg6IGFkZCB0aGlzIGRlZmluaXRpb24gI2RlZmluZSBJTkNMVURFX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGVuYWJsZSB0aGUgdXNlIG9mIHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSBBUEkgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY29kZS4KKworCisjIyMgMzAtQXByaWwtMjAxNCAjIyMKKz09PT09PT09PT09PT09PT09PT09PQorICArIGNtc2lzX29zLmM6IGFkZCBwcmVwcm9jZXNzb3IgY29tcGlsYXRpb24gY29uZGl0aW9uIHdoZW4gY2FsbGluZyBzb21lIEZyZWVSVE9TIEFQSXMsIHRvIGF2b2lkIGxpbmsKKyAgICAgICAgICAgICAgICBlcnJvcnMgd2l0aCBNREstQVJNIHdoZW4gc29tZSBGcmVlUlRPUyBmZWF0dXJlcyBhcmUgbm90IGVuYWJsZWQgaW4gRnJlZVJUT1NDb25maWcuaAorCisKKyMjIyAyMi1BcHJpbC0yMDE0ICMjIworPT09PT09PT09PT09PT09PT09PT09CisgICsgQWRkIFRpY2tsZXMgbW9kZSBmb3IgQ00wIHBvcnQgKElBUiwgR0NDLCBSVkRTKS4KKworCisjIyMgMTgtRmVicnVhcnktMjAxNCAjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PQorICAgKyBGcmVlUlRPUyBWNy42LjAgY3VzdG9taXplZCB2ZXJzaW9uIGZvciBTVE0zMkN1YmUgc29sdXRpb24uCisKKworICogPGgzPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gzPgorICovCmRpZmYgLS1naXQgYS9Tb3VyY2Uvc3RyZWFtX2J1ZmZlci5jIGIvU291cmNlL3N0cmVhbV9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAwNDVmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3N0cmVhbV9idWZmZXIuYwpAQCAtMCwwICsxLDExOTkgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQorICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiAgVGhhdCBzaG91bGQgb25seSBiZSBkb25lIHdoZW4KK3Rhc2suaCBpcyBpbmNsdWRlZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZpbGUuICovCisjZGVmaW5lIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKy8qIEZyZWVSVE9TIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInN0cmVhbV9idWZmZXIuaCIKKworI2lmKCBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TICE9IDEgKQorCSNlcnJvciBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TIG11c3QgYmUgc2V0IHRvIDEgdG8gYnVpbGQgc3RyZWFtX2J1ZmZlci5jCisjZW5kaWYKKworLyogTGludCBlOTYxIGFuZCBlNzUwIGFyZSBzdXBwcmVzc2VkIGFzIGEgTUlTUkEgZXhjZXB0aW9uIGp1c3RpZmllZCBiZWNhdXNlIHRoZQorTVBVIHBvcnRzIHJlcXVpcmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgdG8gYmUgZGVmaW5lZCBmb3IgdGhlCitoZWFkZXIgZmlsZXMgYWJvdmUsIGJ1dCBub3QgaW4gdGhpcyBmaWxlLCBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdAorcHJpdmlsZWdlZCBWcyB1bnByaXZpbGVnZWQgbGlua2FnZSBhbmQgcGxhY2VtZW50LiAqLworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIC8qbGludCAhZTk2MSAhZTc1MC4gKi8KKworLyogSWYgdGhlIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBhcHBsaWNhdGlvbiBzcGVjaWZpYyBSeCBub3RpZmljYXRpb24gbWFjcm9zLAorb3IgI2RlZmluZWQgdGhlIG5vdGlmaWNhdGlvbiBtYWNyb3MgYXdheSwgdGhlbSBwcm92aWRlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCit0aGF0IHVzZXMgdGFzayBub3RpZmljYXRpb25zLiAqLworLypsaW50IC1zYXZlIC1lOTAyNiBGdW5jdGlvbiBsaWtlIG1hY3JvcyBhbGxvd2VkIGFuZCBuZWVkZWQgaGVyZSBzbyB0aGV5IGNhbiBiZSBvdmVyaWRkZW4uICovCisjaWZuZGVmIHNiUkVDRUlWRV9DT01QTEVURUQKKwkjZGVmaW5lIHNiUkVDRUlWRV9DT01QTEVURUQoIHB4U3RyZWFtQnVmZmVyICkJCQkJCQkJCQkJXAorCQl2VGFza1N1c3BlbmRBbGwoKTsJCQkJCQkJCQkJCQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlpZiggKCBweFN0cmVhbUJ1ZmZlciApLT54VGFza1dhaXRpbmdUb1NlbmQgIT0gTlVMTCApCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJKCB2b2lkICkgeFRhc2tOb3RpZnkoICggcHhTdHJlYW1CdWZmZXIgKS0+eFRhc2tXYWl0aW5nVG9TZW5kLAkJCVwKKwkJCQkJCQkJCSAgKCB1aW50MzJfdCApIDAsCQkJCQkJCQkJXAorCQkJCQkJCQkJICBlTm9BY3Rpb24gKTsJCQkJCQkJCQkJXAorCQkJCSggcHhTdHJlYW1CdWZmZXIgKS0+eFRhc2tXYWl0aW5nVG9TZW5kID0gTlVMTDsJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKyNlbmRpZiAvKiBzYlJFQ0VJVkVfQ09NUExFVEVEICovCisKKyNpZm5kZWYgc2JSRUNFSVZFX0NPTVBMRVRFRF9GUk9NX0lTUgorCSNkZWZpbmUgc2JSRUNFSVZFX0NPTVBMRVRFRF9GUk9NX0lTUiggcHhTdHJlYW1CdWZmZXIsCQkJCQkJCQlcCisJCQkJCQkJCQkJICBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVVCYXNlVHlwZV90IHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXM7CQkJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgPSAoIFVCYXNlVHlwZV90ICkgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOwkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlpZiggKCBweFN0cmVhbUJ1ZmZlciApLT54VGFza1dhaXRpbmdUb1NlbmQgIT0gTlVMTCApCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJKCB2b2lkICkgeFRhc2tOb3RpZnlGcm9tSVNSKCAoIHB4U3RyZWFtQnVmZmVyICktPnhUYXNrV2FpdGluZ1RvU2VuZCwJXAorCQkJCQkJCQkJCQkgKCB1aW50MzJfdCApIDAsCQkJCQkJCVwKKwkJCQkJCQkJCQkJIGVOb0FjdGlvbiwJCQkJCQkJCQlcCisJCQkJCQkJCQkJCSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CQkJCVwKKwkJCQkoIHB4U3RyZWFtQnVmZmVyICktPnhUYXNrV2FpdGluZ1RvU2VuZCA9IE5VTEw7CQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdXhTYXZlZEludGVycnVwdFN0YXR1cyApOwkJCQkJXAorCX0KKyNlbmRpZiAvKiBzYlJFQ0VJVkVfQ09NUExFVEVEX0ZST01fSVNSICovCisKKy8qIElmIHRoZSB1c2VyIGhhcyBub3QgcHJvdmlkZWQgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgVHggbm90aWZpY2F0aW9uIG1hY3JvLAorb3IgI2RlZmluZWQgdGhlIG5vdGlmaWNhdGlvbiBtYWNybyBhd2F5LCB0aGVtIHByb3ZpZGUgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCit0aGF0IHVzZXMgdGFzayBub3RpZmljYXRpb25zLiAqLworI2lmbmRlZiBzYlNFTkRfQ09NUExFVEVECisJI2RlZmluZSBzYlNFTkRfQ09NUExFVEVEKCBweFN0cmVhbUJ1ZmZlciApCQkJCQkJCQkJCQlcCisJCXZUYXNrU3VzcGVuZEFsbCgpOwkJCQkJCQkJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWlmKCAoIHB4U3RyZWFtQnVmZmVyICktPnhUYXNrV2FpdGluZ1RvUmVjZWl2ZSAhPSBOVUxMICkJCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkoIHZvaWQgKSB4VGFza05vdGlmeSggKCBweFN0cmVhbUJ1ZmZlciApLT54VGFza1dhaXRpbmdUb1JlY2VpdmUsCQlcCisJCQkJCQkJCQkgICggdWludDMyX3QgKSAwLAkJCQkJCQkJCVwKKwkJCQkJCQkJCSAgZU5vQWN0aW9uICk7CQkJCQkJCQkJCVwKKwkJCQkoIHB4U3RyZWFtQnVmZmVyICktPnhUYXNrV2FpdGluZ1RvUmVjZWl2ZSA9IE5VTEw7CQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKyNlbmRpZiAvKiBzYlNFTkRfQ09NUExFVEVEICovCisKKyNpZm5kZWYgc2JTRU5EX0NPTVBMRVRFX0ZST01fSVNSCisJI2RlZmluZSBzYlNFTkRfQ09NUExFVEVfRlJPTV9JU1IoIHB4U3RyZWFtQnVmZmVyLCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVVCYXNlVHlwZV90IHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXM7CQkJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgPSAoIFVCYXNlVHlwZV90ICkgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOwkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlpZiggKCBweFN0cmVhbUJ1ZmZlciApLT54VGFza1dhaXRpbmdUb1JlY2VpdmUgIT0gTlVMTCApCQkJCQkJXAorCQkJewkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJKCB2b2lkICkgeFRhc2tOb3RpZnlGcm9tSVNSKCAoIHB4U3RyZWFtQnVmZmVyICktPnhUYXNrV2FpdGluZ1RvUmVjZWl2ZSwJXAorCQkJCQkJCQkJCQkgKCB1aW50MzJfdCApIDAsCQkJCQkJCVwKKwkJCQkJCQkJCQkJIGVOb0FjdGlvbiwJCQkJCQkJCQlcCisJCQkJCQkJCQkJCSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CQkJCVwKKwkJCQkoIHB4U3RyZWFtQnVmZmVyICktPnhUYXNrV2FpdGluZ1RvUmVjZWl2ZSA9IE5VTEw7CQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzICk7CQkJCQlcCisJfQorI2VuZGlmIC8qIHNiU0VORF9DT01QTEVURV9GUk9NX0lTUiAqLworLypsaW50IC1yZXN0b3JlICg5MDI2KSAqLworCisvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gaG9sZCB0aGUgbGVuZ3RoIG9mIGEgbWVzc2FnZSBpbiB0aGUgYnVmZmVyLiAqLworI2RlZmluZSBzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIICggc2l6ZW9mKCBzaXplX3QgKSApCisKKy8qIEJpdHMgc3RvcmVkIGluIHRoZSB1Y0ZsYWdzIGZpZWxkIG9mIHRoZSBzdHJlYW0gYnVmZmVyLiAqLworI2RlZmluZSBzYkZMQUdTX0lTX01FU1NBR0VfQlVGRkVSCQkoICggdWludDhfdCApIDEgKSAvKiBTZXQgaWYgdGhlIHN0cmVhbSBidWZmZXIgd2FzIGNyZWF0ZWQgYXMgYSBtZXNzYWdlIGJ1ZmZlciwgaW4gd2hpY2ggY2FzZSBpdCBob2xkcyBkaXNjcmV0ZSBtZXNzYWdlcyByYXRoZXIgdGhhbiBhIHN0cmVhbS4gKi8KKyNkZWZpbmUgc2JGTEFHU19JU19TVEFUSUNBTExZX0FMTE9DQVRFRCAoICggdWludDhfdCApIDIgKSAvKiBTZXQgaWYgdGhlIHN0cmVhbSBidWZmZXIgd2FzIGNyZWF0ZWQgdXNpbmcgc3RhdGljYWxseSBhbGxvY2F0ZWQgbWVtb3J5LiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3RydWN0dXJlIHRoYXQgaG9sZCBzdGF0ZSBpbmZvcm1hdGlvbiBvbiB0aGUgYnVmZmVyLiAqLwordHlwZWRlZiBzdHJ1Y3QgeFNUUkVBTV9CVUZGRVIgLypsaW50ICFlOTA1OCBTdHlsZSBjb252ZW50aW9uIHVzZXMgdGFnLiAqLworeworCXZvbGF0aWxlIHNpemVfdCB4VGFpbDsJCQkJLyogSW5kZXggdG8gdGhlIG5leHQgaXRlbSB0byByZWFkIHdpdGhpbiB0aGUgYnVmZmVyLiAqLworCXZvbGF0aWxlIHNpemVfdCB4SGVhZDsJCQkJLyogSW5kZXggdG8gdGhlIG5leHQgaXRlbSB0byB3cml0ZSB3aXRoaW4gdGhlIGJ1ZmZlci4gKi8KKwlzaXplX3QgeExlbmd0aDsJCQkJCQkvKiBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBwdWNCdWZmZXIuICovCisJc2l6ZV90IHhUcmlnZ2VyTGV2ZWxCeXRlczsJCQkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciBiZWZvcmUgYSB0YXNrIHRoYXQgaXMgd2FpdGluZyBmb3IgZGF0YSBpcyB1bmJsb2NrZWQuICovCisJdm9sYXRpbGUgVGFza0hhbmRsZV90IHhUYXNrV2FpdGluZ1RvUmVjZWl2ZTsgLyogSG9sZHMgdGhlIGhhbmRsZSBvZiBhIHRhc2sgd2FpdGluZyBmb3IgZGF0YSwgb3IgTlVMTCBpZiBubyB0YXNrcyBhcmUgd2FpdGluZy4gKi8KKwl2b2xhdGlsZSBUYXNrSGFuZGxlX3QgeFRhc2tXYWl0aW5nVG9TZW5kOwkvKiBIb2xkcyB0aGUgaGFuZGxlIG9mIGEgdGFzayB3YWl0aW5nIHRvIHNlbmQgZGF0YSB0byBhIG1lc3NhZ2UgYnVmZmVyIHRoYXQgaXMgZnVsbC4gKi8KKwl1aW50OF90ICpwdWNCdWZmZXI7CQkJCQkvKiBQb2ludHMgdG8gdGhlIGJ1ZmZlciBpdHNlbGYgLSB0aGF0IGlzIC0gdGhlIFJBTSB0aGF0IHN0b3JlcyB0aGUgZGF0YSBwYXNzZWQgdGhyb3VnaCB0aGUgYnVmZmVyLiAqLworCXVpbnQ4X3QgdWNGbGFnczsKKworCSNpZiAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwkJVUJhc2VUeXBlX3QgdXhTdHJlYW1CdWZmZXJOdW1iZXI7CQkvKiBVc2VkIGZvciB0cmFjaW5nIHB1cnBvc2VzLiAqLworCSNlbmRpZgorfSBTdHJlYW1CdWZmZXJfdDsKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIHRvIGJlIHJlYWQgZnJvbSB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgc2l6ZV90IHBydkJ5dGVzSW5CdWZmZXIoIGNvbnN0IFN0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogQWRkIHhDb3VudCBieXRlcyBmcm9tIHB1Y0RhdGEgaW50byB0aGUgcHhTdHJlYW1CdWZmZXIgbWVzc2FnZSBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgd2hpY2ggd2lsbCBlaXRoZXIgZXF1YWwgeENvdW50IGluIHRoZQorICogc3VjY2VzcyBjYXNlLCBvciAwIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHNwYWNlIGluIHRoZSBidWZmZXIgKGluIHdoaWNoIGNhc2UKKyAqIG5vIGRhdGEgaXMgd3JpdHRlbiBpbnRvIHRoZSBidWZmZXIpLgorICovCitzdGF0aWMgc2l6ZV90IHBydldyaXRlQnl0ZXNUb0J1ZmZlciggU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciwgY29uc3QgdWludDhfdCAqcHVjRGF0YSwgc2l6ZV90IHhDb3VudCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBJZiB0aGUgc3RyZWFtIGJ1ZmZlciBpcyBiZWluZyB1c2VkIGFzIGEgbWVzc2FnZSBidWZmZXIsIHRoZW4gcmVhZHMgYW4gZW50aXJlCisgKiBtZXNzYWdlIG91dCBvZiB0aGUgYnVmZmVyLiAgSWYgdGhlIHN0cmVhbSBidWZmZXIgaXMgYmVpbmcgdXNlZCBhcyBhIHN0cmVhbQorICogYnVmZmVyIHRoZW4gcmVhZCBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlIGZyb20gdGhlIGJ1ZmZlci4KKyAqIHBydlJlYWRCeXRlc0Zyb21CdWZmZXIoKSBpcyBjYWxsZWQgdG8gYWN0dWFsbHkgZXh0cmFjdCB0aGUgYnl0ZXMgZnJvbSB0aGUKKyAqIGJ1ZmZlcidzIGRhdGEgc3RvcmFnZSBhcmVhLgorICovCitzdGF0aWMgc2l6ZV90IHBydlJlYWRNZXNzYWdlRnJvbUJ1ZmZlciggU3RyZWFtQnVmZmVyX3QgKnB4U3RyZWFtQnVmZmVyLAorCQkJCQkJCQkJCXZvaWQgKnB2UnhEYXRhLAorCQkJCQkJCQkJCXNpemVfdCB4QnVmZmVyTGVuZ3RoQnl0ZXMsCisJCQkJCQkJCQkJc2l6ZV90IHhCeXRlc0F2YWlsYWJsZSwKKwkJCQkJCQkJCQlzaXplX3QgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogSWYgdGhlIHN0cmVhbSBidWZmZXIgaXMgYmVpbmcgdXNlZCBhcyBhIG1lc3NhZ2UgYnVmZmVyLCB0aGVuIHdyaXRlcyBhbiBlbnRpcmUKKyAqIG1lc3NhZ2UgdG8gdGhlIGJ1ZmZlci4gIElmIHRoZSBzdHJlYW0gYnVmZmVyIGlzIGJlaW5nIHVzZWQgYXMgYSBzdHJlYW0KKyAqIGJ1ZmZlciB0aGVuIHdyaXRlIGFzIG1hbnkgYnl0ZXMgYXMgcG9zc2libGUgdG8gdGhlIGJ1ZmZlci4KKyAqIHBydldyaXRlQnl0ZXN0b0J1ZmZlcigpIGlzIGNhbGxlZCB0byBhY3R1YWxseSBzZW5kIHRoZSBieXRlcyB0byB0aGUgYnVmZmVyJ3MKKyAqIGRhdGEgc3RvcmFnZSBhcmVhLgorICovCitzdGF0aWMgc2l6ZV90IHBydldyaXRlTWVzc2FnZVRvQnVmZmVyKCAgU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciwKKwkJCQkJCQkJCQljb25zdCB2b2lkICogcHZUeERhdGEsCisJCQkJCQkJCQkJc2l6ZV90IHhEYXRhTGVuZ3RoQnl0ZXMsCisJCQkJCQkJCQkJc2l6ZV90IHhTcGFjZSwKKwkJCQkJCQkJCQlzaXplX3QgeFJlcXVpcmVkU3BhY2UgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogUmVhZCB4TWF4Q291bnQgYnl0ZXMgZnJvbSB0aGUgcHhTdHJlYW1CdWZmZXIgbWVzc2FnZSBidWZmZXIgYW5kIHdyaXRlIHRoZW0KKyAqIHRvIHB1Y0RhdGEuCisgKi8KK3N0YXRpYyBzaXplX3QgcHJ2UmVhZEJ5dGVzRnJvbUJ1ZmZlciggU3RyZWFtQnVmZmVyX3QgKnB4U3RyZWFtQnVmZmVyLAorCQkJCQkJCQkJICB1aW50OF90ICpwdWNEYXRhLAorCQkJCQkJCQkJICBzaXplX3QgeE1heENvdW50LAorCQkJCQkJCQkJICBzaXplX3QgeEJ5dGVzQXZhaWxhYmxlICk7IFBSSVZJTEVHRURfRlVOQ1RJT04KKworLyoKKyAqIENhbGxlZCBieSBib3RoIHB4U3RyZWFtQnVmZmVyQ3JlYXRlKCkgYW5kIHB4U3RyZWFtQnVmZmVyQ3JlYXRlU3RhdGljKCkgdG8KKyAqIGluaXRpYWxpc2UgdGhlIG1lbWJlcnMgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgc3RyZWFtIGJ1ZmZlciBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIHBydkluaXRpYWxpc2VOZXdTdHJlYW1CdWZmZXIoIFN0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIsCisJCQkJCQkJCQkJICB1aW50OF90ICogY29uc3QgcHVjQnVmZmVyLAorCQkJCQkJCQkJCSAgc2l6ZV90IHhCdWZmZXJTaXplQnl0ZXMsCisJCQkJCQkJCQkJICBzaXplX3QgeFRyaWdnZXJMZXZlbEJ5dGVzLAorCQkJCQkJCQkJCSAgQmFzZVR5cGVfdCB4SXNNZXNzYWdlQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCisKKwlTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyR2VuZXJpY0NyZWF0ZSggc2l6ZV90IHhCdWZmZXJTaXplQnl0ZXMsIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsIEJhc2VUeXBlX3QgeElzTWVzc2FnZUJ1ZmZlciApCisJeworCXVpbnQ4X3QgKnB1Y0FsbG9jYXRlZE1lbW9yeTsKKworCQkvKiBJbiBjYXNlIHRoZSBzdHJlYW0gYnVmZmVyIGlzIGdvaW5nIHRvIGJlIHVzZWQgYXMgYSBtZXNzYWdlIGJ1ZmZlcgorCQkodGhhdCBpcywgaXQgd2lsbCBob2xkIGRpc2NyZXRlIG1lc3NhZ2VzIHdpdGggYSBsaXR0bGUgbWV0YSBkYXRhIHRoYXQKKwkJc2F5cyBob3cgYmlnIHRoZSBuZXh0IG1lc3NhZ2UgaXMpIGNoZWNrIHRoZSBidWZmZXIgd2lsbCBiZSBsYXJnZSBlbm91Z2gKKwkJdG8gaG9sZCBhdCBsZWFzdCBvbmUgbWVzc2FnZS4gKi8KKwkJY29uZmlnQVNTRVJUKCB4QnVmZmVyU2l6ZUJ5dGVzID4gc2JCWVRFU19UT19TVE9SRV9NRVNTQUdFX0xFTkdUSCApOworCQljb25maWdBU1NFUlQoIHhUcmlnZ2VyTGV2ZWxCeXRlcyA8PSB4QnVmZmVyU2l6ZUJ5dGVzICk7CisKKwkJLyogQSB0cmlnZ2VyIGxldmVsIG9mIDAgd291bGQgY2F1c2UgYSB3YWl0aW5nIHRhc2sgdG8gdW5ibG9jayBldmVuIHdoZW4KKwkJdGhlIGJ1ZmZlciB3YXMgZW1wdHkuICovCisJCWlmKCB4VHJpZ2dlckxldmVsQnl0ZXMgPT0gKCBzaXplX3QgKSAwICkKKwkJeworCQkJeFRyaWdnZXJMZXZlbEJ5dGVzID0gKCBzaXplX3QgKSAxOyAvKmxpbnQgIWU5MDQ0IFBhcmFtZXRlciBtb2RpZmllZCB0byBlbnN1cmUgaXQgZG9lc24ndCBoYXZlIGEgZGFuZ2Vyb3VzIHZhbHVlLiAqLworCQl9CisKKwkJLyogQSBzdHJlYW0gYnVmZmVyIHJlcXVpcmVzIGEgU3RyZWFtQnVmZmVyX3Qgc3RydWN0dXJlIGFuZCBhIGJ1ZmZlci4KKwkJQm90aCBhcmUgYWxsb2NhdGVkIGluIGEgc2luZ2xlIGNhbGwgdG8gcHZQb3J0TWFsbG9jKCkuICBUaGUKKwkJU3RyZWFtQnVmZmVyX3Qgc3RydWN0dXJlIGlzIHBsYWNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkKKwkJYW5kIHRoZSBidWZmZXIgZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlci4gIFRoZSByZXF1ZXN0ZWQgc2l6ZSBpcworCQlpbmNyZW1lbnRlZCBzbyB0aGUgZnJlZSBzcGFjZSBpcyByZXR1cm5lZCBhcyB0aGUgdXNlciB3b3VsZCBleHBlY3QgLQorCQl0aGlzIGlzIGEgcXVpcmsgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRoYXQgbWVhbnMgb3RoZXJ3aXNlIHRoZSBmcmVlCisJCXNwYWNlIHdvdWxkIGJlIHJlcG9ydGVkIGFzIG9uZSBieXRlIHNtYWxsZXIgdGhhbiB3b3VsZCBiZSBsb2dpY2FsbHkKKwkJZXhwZWN0ZWQuICovCisJCXhCdWZmZXJTaXplQnl0ZXMrKzsKKwkJcHVjQWxsb2NhdGVkTWVtb3J5ID0gKCB1aW50OF90ICogKSBwdlBvcnRNYWxsb2MoIHhCdWZmZXJTaXplQnl0ZXMgKyBzaXplb2YoIFN0cmVhbUJ1ZmZlcl90ICkgKTsgLypsaW50ICFlOTA3OSBtYWxsb2MoKSBvbmx5IHJldHVybnMgdm9pZCouICovCisKKwkJaWYoIHB1Y0FsbG9jYXRlZE1lbW9yeSAhPSBOVUxMICkKKwkJeworCQkJcHJ2SW5pdGlhbGlzZU5ld1N0cmVhbUJ1ZmZlciggKCBTdHJlYW1CdWZmZXJfdCAqICkgcHVjQWxsb2NhdGVkTWVtb3J5LCAvKiBTdHJ1Y3R1cmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAqLyAvKmxpbnQgIWU5MDg3IFNhZmUgY2FzdCBhcyBhbGxvY2F0ZWQgbWVtb3J5IGlzIGFsaWduZWQuICovIC8qbGludCAhZTgyNiBBcmVhIGlzIG5vdCB0b28gc21hbGwgYW5kIGFsaWdubWVudCBpcyBndWFyYW50ZWVkIHByb3ZpZGVkIG1hbGxvYygpIGJlaGF2ZXMgYXMgZXhwZWN0ZWQgYW5kIHJldHVybnMgYWxpZ25lZCBidWZmZXIuICovCisJCQkJCQkJCQkJICAgcHVjQWxsb2NhdGVkTWVtb3J5ICsgc2l6ZW9mKCBTdHJlYW1CdWZmZXJfdCApLCAgLyogU3RvcmFnZSBhcmVhIGZvbGxvd3MuICovIC8qbGludCAhZTkwMTYgSW5kZXhpbmcgcGFzdCBzdHJ1Y3R1cmUgdmFsaWQgZm9yIHVpbnQ4X3QgcG9pbnRlciwgYWxzbyBzdG9yYWdlIGFyZWEgaGFzIG5vIGFsaWdubWVudCByZXF1aXJlbWVudC4gKi8KKwkJCQkJCQkJCQkgICB4QnVmZmVyU2l6ZUJ5dGVzLAorCQkJCQkJCQkJCSAgIHhUcmlnZ2VyTGV2ZWxCeXRlcywKKwkJCQkJCQkJCQkgICB4SXNNZXNzYWdlQnVmZmVyICk7CisKKwkJCXRyYWNlU1RSRUFNX0JVRkZFUl9DUkVBVEUoICggKCBTdHJlYW1CdWZmZXJfdCAqICkgcHVjQWxsb2NhdGVkTWVtb3J5ICksIHhJc01lc3NhZ2VCdWZmZXIgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRyYWNlU1RSRUFNX0JVRkZFUl9DUkVBVEVfRkFJTEVEKCB4SXNNZXNzYWdlQnVmZmVyICk7CisJCX0KKworCQlyZXR1cm4gKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCAqICkgcHVjQWxsb2NhdGVkTWVtb3J5OyAvKmxpbnQgIWU5MDg3ICFlODI2IFNhZmUgY2FzdCBhcyBhbGxvY2F0ZWQgbWVtb3J5IGlzIGFsaWduZWQuICovCisJfQorCisjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisKKwlTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyR2VuZXJpY0NyZWF0ZVN0YXRpYyggc2l6ZV90IHhCdWZmZXJTaXplQnl0ZXMsCisJCQkJCQkJCQkJCQkJCSAgIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsCisJCQkJCQkJCQkJCQkJCSAgIEJhc2VUeXBlX3QgeElzTWVzc2FnZUJ1ZmZlciwKKwkJCQkJCQkJCQkJCQkJICAgdWludDhfdCAqIGNvbnN0IHB1Y1N0cmVhbUJ1ZmZlclN0b3JhZ2VBcmVhLAorCQkJCQkJCQkJCQkJCQkgICBTdGF0aWNTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RhdGljU3RyZWFtQnVmZmVyICkKKwl7CisJU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHB4U3RhdGljU3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU3NDAgIWU5MDg3IFNhZmUgY2FzdCBhcyBTdGF0aWNTdHJlYW1CdWZmZXJfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCisJU3RyZWFtQnVmZmVySGFuZGxlX3QgeFJldHVybjsKKworCQljb25maWdBU1NFUlQoIHB1Y1N0cmVhbUJ1ZmZlclN0b3JhZ2VBcmVhICk7CisJCWNvbmZpZ0FTU0VSVCggcHhTdGF0aWNTdHJlYW1CdWZmZXIgKTsKKwkJY29uZmlnQVNTRVJUKCB4VHJpZ2dlckxldmVsQnl0ZXMgPD0geEJ1ZmZlclNpemVCeXRlcyApOworCisJCS8qIEEgdHJpZ2dlciBsZXZlbCBvZiAwIHdvdWxkIGNhdXNlIGEgd2FpdGluZyB0YXNrIHRvIHVuYmxvY2sgZXZlbiB3aGVuCisJCXRoZSBidWZmZXIgd2FzIGVtcHR5LiAqLworCQlpZiggeFRyaWdnZXJMZXZlbEJ5dGVzID09ICggc2l6ZV90ICkgMCApCisJCXsKKwkJCXhUcmlnZ2VyTGV2ZWxCeXRlcyA9ICggc2l6ZV90ICkgMTsgLypsaW50ICFlOTA0NCBGdW5jdGlvbiBwYXJhbWV0ZXIgZGVsaWJlcmF0ZWx5IG1vZGlmaWVkIHRvIGVuc3VyZSBpdCBpcyBpbiByYW5nZS4gKi8KKwkJfQorCisJCS8qIEluIGNhc2UgdGhlIHN0cmVhbSBidWZmZXIgaXMgZ29pbmcgdG8gYmUgdXNlZCBhcyBhIG1lc3NhZ2UgYnVmZmVyCisJCSh0aGF0IGlzLCBpdCB3aWxsIGhvbGQgZGlzY3JldGUgbWVzc2FnZXMgd2l0aCBhIGxpdHRsZSBtZXRhIGRhdGEgdGhhdAorCQlzYXlzIGhvdyBiaWcgdGhlIG5leHQgbWVzc2FnZSBpcykgY2hlY2sgdGhlIGJ1ZmZlciB3aWxsIGJlIGxhcmdlIGVub3VnaAorCQl0byBob2xkIGF0IGxlYXN0IG9uZSBtZXNzYWdlLiAqLworCQljb25maWdBU1NFUlQoIHhCdWZmZXJTaXplQnl0ZXMgPiBzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIICk7CisKKwkJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKwkJeworCQkJLyogU2FuaXR5IGNoZWNrIHRoYXQgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIGRlY2xhcmUgYQorCQkJdmFyaWFibGUgb2YgdHlwZSBTdGF0aWNTdHJlYW1CdWZmZXJfdCBlcXVhbHMgdGhlIHNpemUgb2YgdGhlIHJlYWwKKwkJCW1lc3NhZ2UgYnVmZmVyIHN0cnVjdHVyZS4gKi8KKwkJCXZvbGF0aWxlIHNpemVfdCB4U2l6ZSA9IHNpemVvZiggU3RhdGljU3RyZWFtQnVmZmVyX3QgKTsKKwkJCWNvbmZpZ0FTU0VSVCggeFNpemUgPT0gc2l6ZW9mKCBTdHJlYW1CdWZmZXJfdCApICk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKwkJaWYoICggcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEgIT0gTlVMTCApICYmICggcHhTdGF0aWNTdHJlYW1CdWZmZXIgIT0gTlVMTCApICkKKwkJeworCQkJcHJ2SW5pdGlhbGlzZU5ld1N0cmVhbUJ1ZmZlciggcHhTdHJlYW1CdWZmZXIsCisJCQkJCQkJCQkJICBwdWNTdHJlYW1CdWZmZXJTdG9yYWdlQXJlYSwKKwkJCQkJCQkJCQkgIHhCdWZmZXJTaXplQnl0ZXMsCisJCQkJCQkJCQkJICB4VHJpZ2dlckxldmVsQnl0ZXMsCisJCQkJCQkJCQkJICB4SXNNZXNzYWdlQnVmZmVyICk7CisKKwkJCS8qIFJlbWVtYmVyIHRoaXMgd2FzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGluIGNhc2UgaXQgaXMgZXZlciBkZWxldGVkCisJCQlhZ2Fpbi4gKi8KKwkJCXB4U3RyZWFtQnVmZmVyLT51Y0ZsYWdzIHw9IHNiRkxBR1NfSVNfU1RBVElDQUxMWV9BTExPQ0FURUQ7CisKKwkJCXRyYWNlU1RSRUFNX0JVRkZFUl9DUkVBVEUoIHB4U3RyZWFtQnVmZmVyLCB4SXNNZXNzYWdlQnVmZmVyICk7CisKKwkJCXhSZXR1cm4gPSAoIFN0cmVhbUJ1ZmZlckhhbmRsZV90ICkgcHhTdGF0aWNTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgRGF0YSBoaWRpbmcgcmVxdWlyZXMgY2FzdCB0byBvcGFxdWUgdHlwZS4gKi8KKwkJfQorCQllbHNlCisJCXsKKwkJCXhSZXR1cm4gPSBOVUxMOworCQkJdHJhY2VTVFJFQU1fQlVGRkVSX0NSRUFURV9TVEFUSUNfRkFJTEVEKCB4UmV0dXJuLCB4SXNNZXNzYWdlQnVmZmVyICk7CisJCX0KKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2U3RyZWFtQnVmZmVyRGVsZXRlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKK3sKK1N0cmVhbUJ1ZmZlcl90ICogcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBTYWZlIGNhc3QgYXMgU3RyZWFtQnVmZmVySGFuZGxlX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLworCisJY29uZmlnQVNTRVJUKCBweFN0cmVhbUJ1ZmZlciApOworCisJdHJhY2VTVFJFQU1fQlVGRkVSX0RFTEVURSggeFN0cmVhbUJ1ZmZlciApOworCisJaWYoICggcHhTdHJlYW1CdWZmZXItPnVjRmxhZ3MgJiBzYkZMQUdTX0lTX1NUQVRJQ0FMTFlfQUxMT0NBVEVEICkgPT0gKCB1aW50OF90ICkgcGRGQUxTRSApCisJeworCQkjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCQl7CisJCQkvKiBCb3RoIHRoZSBzdHJ1Y3R1cmUgYW5kIHRoZSBidWZmZXIgd2VyZSBhbGxvY2F0ZWQgdXNpbmcgYSBzaW5nbGUgY2FsbAorCQkJdG8gcHZQb3J0TWFsbG9jKCksIGhlbmNlIG9ubHkgb25lIGNhbGwgdG8gdlBvcnRGcmVlKCkgaXMgcmVxdWlyZWQuICovCisJCQl2UG9ydEZyZWUoICggdm9pZCAqICkgcHhTdHJlYW1CdWZmZXIgKTsgLypsaW50ICFlOTA4NyBTdGFuZGFyZCBmcmVlKCkgc2VtYW50aWNzIHJlcXVpcmUgdm9pZCAqLCBwbHVzIHB4U3RyZWFtQnVmZmVyIHdhcyBhbGxvY2F0ZWQgYnkgcHZQb3J0TWFsbG9jKCkuICovCisJCX0KKwkJI2Vsc2UKKwkJeworCQkJLyogU2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBnZXQgaGVyZSwgdWNGbGFncyBtdXN0IGJlIGNvcnJ1cHQuCisJCQlGb3JjZSBhbiBhc3NlcnQuICovCisJCQljb25maWdBU1NFUlQoIHhTdHJlYW1CdWZmZXIgPT0gKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCApIH4wICk7CisJCX0KKwkJI2VuZGlmCisJfQorCWVsc2UKKwl7CisJCS8qIFRoZSBzdHJ1Y3R1cmUgYW5kIGJ1ZmZlciB3ZXJlIG5vdCBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgYW5kIGNhbm5vdCBiZQorCQlmcmVlZCAtIGp1c3Qgc2NydWIgdGhlIHN0cnVjdHVyZSBzbyBmdXR1cmUgdXNlIHdpbGwgYXNzZXJ0LiAqLworCQltZW1zZXQoIHB4U3RyZWFtQnVmZmVyLCAweDAwLCBzaXplb2YoIFN0cmVhbUJ1ZmZlcl90ICkgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVyUmVzZXQoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKQoreworU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgIWU5MDc5IFNhZmUgY2FzdCBhcyBTdHJlYW1CdWZmZXJIYW5kbGVfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCitCYXNlVHlwZV90IHhSZXR1cm4gPSBwZEZBSUwsIHhJc01lc3NhZ2VCdWZmZXI7CisKKyNpZiggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCVVCYXNlVHlwZV90IHV4U3RyZWFtQnVmZmVyTnVtYmVyOworI2VuZGlmCisKKwljb25maWdBU1NFUlQoIHB4U3RyZWFtQnVmZmVyICk7CisKKwkjaWYoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwl7CisJCS8qIFN0b3JlIHRoZSBzdHJlYW0gYnVmZmVyIG51bWJlciBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlCisJCXJlc2V0LiAqLworCQl1eFN0cmVhbUJ1ZmZlck51bWJlciA9IHB4U3RyZWFtQnVmZmVyLT51eFN0cmVhbUJ1ZmZlck51bWJlcjsKKwl9CisJI2VuZGlmCisKKwkvKiBDYW4gb25seSByZXNldCBhIG1lc3NhZ2UgYnVmZmVyIGlmIHRoZXJlIGFyZSBubyB0YXNrcyBibG9ja2VkIG9uIGl0LiAqLworCWlmKCBweFN0cmVhbUJ1ZmZlci0+eFRhc2tXYWl0aW5nVG9SZWNlaXZlID09IE5VTEwgKQorCXsKKwkJaWYoIHB4U3RyZWFtQnVmZmVyLT54VGFza1dhaXRpbmdUb1NlbmQgPT0gTlVMTCApCisJCXsKKwkJCWlmKCAoIHB4U3RyZWFtQnVmZmVyLT51Y0ZsYWdzICYgc2JGTEFHU19JU19NRVNTQUdFX0JVRkZFUiApICE9ICggdWludDhfdCApIDAgKQorCQkJeworCQkJCXhJc01lc3NhZ2VCdWZmZXIgPSBwZFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJeElzTWVzc2FnZUJ1ZmZlciA9IHBkRkFMU0U7CisJCQl9CisKKwkJCXBydkluaXRpYWxpc2VOZXdTdHJlYW1CdWZmZXIoIHB4U3RyZWFtQnVmZmVyLAorCQkJCQkJCQkJCSAgcHhTdHJlYW1CdWZmZXItPnB1Y0J1ZmZlciwKKwkJCQkJCQkJCQkgIHB4U3RyZWFtQnVmZmVyLT54TGVuZ3RoLAorCQkJCQkJCQkJCSAgcHhTdHJlYW1CdWZmZXItPnhUcmlnZ2VyTGV2ZWxCeXRlcywKKwkJCQkJCQkJCQkgIHhJc01lc3NhZ2VCdWZmZXIgKTsKKwkJCXhSZXR1cm4gPSBwZFBBU1M7CisKKwkJCSNpZiggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCQkJeworCQkJCXB4U3RyZWFtQnVmZmVyLT51eFN0cmVhbUJ1ZmZlck51bWJlciA9IHV4U3RyZWFtQnVmZmVyTnVtYmVyOworCQkJfQorCQkJI2VuZGlmCisKKwkJCXRyYWNlU1RSRUFNX0JVRkZFUl9SRVNFVCggeFN0cmVhbUJ1ZmZlciApOworCQl9CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVyU2V0VHJpZ2dlckxldmVsKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBzaXplX3QgeFRyaWdnZXJMZXZlbCApCit7CitTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0gKCBTdHJlYW1CdWZmZXJfdCAqICkgeFN0cmVhbUJ1ZmZlcjsgLypsaW50ICFlOTA4NyAhZTkwNzkgU2FmZSBjYXN0IGFzIFN0cmVhbUJ1ZmZlckhhbmRsZV90IGlzIG9wYXF1ZSBTdHJlYW1idWZmZXJfdC4gKi8KK0Jhc2VUeXBlX3QgeFJldHVybjsKKworCWNvbmZpZ0FTU0VSVCggcHhTdHJlYW1CdWZmZXIgKTsKKworCS8qIEl0IGlzIG5vdCB2YWxpZCBmb3IgdGhlIHRyaWdnZXIgbGV2ZWwgdG8gYmUgMC4gKi8KKwlpZiggeFRyaWdnZXJMZXZlbCA9PSAoIHNpemVfdCApIDAgKQorCXsKKwkJeFRyaWdnZXJMZXZlbCA9ICggc2l6ZV90ICkgMTsgLypsaW50ICFlOTA0NCBQYXJhbWV0ZXIgbW9kaWZpZWQgdG8gZW5zdXJlIGl0IGRvZXNuJ3QgaGF2ZSBhIGRhbmdlcm91cyB2YWx1ZS4gKi8KKwl9CisKKwkvKiBUaGUgdHJpZ2dlciBsZXZlbCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBpbiB0aGUgc3RyZWFtCisJYnVmZmVyIGJlZm9yZSBhIHRhc2sgdGhhdCBpcyB3YWl0aW5nIGZvciBkYXRhIGlzIHVuYmxvY2tlZC4gKi8KKwlpZiggeFRyaWdnZXJMZXZlbCA8PSBweFN0cmVhbUJ1ZmZlci0+eExlbmd0aCApCisJeworCQlweFN0cmVhbUJ1ZmZlci0+eFRyaWdnZXJMZXZlbEJ5dGVzID0geFRyaWdnZXJMZXZlbDsKKwkJeFJldHVybiA9IHBkUEFTUzsKKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IHBkRkFMU0U7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhTdHJlYW1CdWZmZXJTcGFjZXNBdmFpbGFibGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKQoreworY29uc3QgU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgIWU5MDc5IFNhZmUgY2FzdCBhcyBTdHJlYW1CdWZmZXJIYW5kbGVfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCitzaXplX3QgeFNwYWNlOworCisJY29uZmlnQVNTRVJUKCBweFN0cmVhbUJ1ZmZlciApOworCisJeFNwYWNlID0gcHhTdHJlYW1CdWZmZXItPnhMZW5ndGggKyBweFN0cmVhbUJ1ZmZlci0+eFRhaWw7CisJeFNwYWNlIC09IHB4U3RyZWFtQnVmZmVyLT54SGVhZDsKKwl4U3BhY2UgLT0gKCBzaXplX3QgKSAxOworCisJaWYoIHhTcGFjZSA+PSBweFN0cmVhbUJ1ZmZlci0+eExlbmd0aCApCisJeworCQl4U3BhY2UgLT0gcHhTdHJlYW1CdWZmZXItPnhMZW5ndGg7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwlyZXR1cm4geFNwYWNlOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NpemVfdCB4U3RyZWFtQnVmZmVyQnl0ZXNBdmFpbGFibGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKQoreworY29uc3QgU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgIWU5MDc5IFNhZmUgY2FzdCBhcyBTdHJlYW1CdWZmZXJIYW5kbGVfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCitzaXplX3QgeFJldHVybjsKKworCWNvbmZpZ0FTU0VSVCggcHhTdHJlYW1CdWZmZXIgKTsKKworCXhSZXR1cm4gPSBwcnZCeXRlc0luQnVmZmVyKCBweFN0cmVhbUJ1ZmZlciApOworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NpemVfdCB4U3RyZWFtQnVmZmVyU2VuZCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwKKwkJCQkJCSAgY29uc3Qgdm9pZCAqcHZUeERhdGEsCisJCQkJCQkgIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLAorCQkJCQkJICBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCit7CitTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0gKCBTdHJlYW1CdWZmZXJfdCAqICkgeFN0cmVhbUJ1ZmZlcjsgLypsaW50ICFlOTA4NyAhZTkwNzkgU2FmZSBjYXN0IGFzIFN0cmVhbUJ1ZmZlckhhbmRsZV90IGlzIG9wYXF1ZSBTdHJlYW1idWZmZXJfdC4gKi8KK3NpemVfdCB4UmV0dXJuLCB4U3BhY2UgPSAwOworc2l6ZV90IHhSZXF1aXJlZFNwYWNlID0geERhdGFMZW5ndGhCeXRlczsKK1RpbWVPdXRfdCB4VGltZU91dDsKKworCWNvbmZpZ0FTU0VSVCggcHZUeERhdGEgKTsKKwljb25maWdBU1NFUlQoIHB4U3RyZWFtQnVmZmVyICk7CisKKwkvKiBUaGlzIHNlbmQgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSB0byBib3RoIG1lc3NhZ2UgYnVmZmVycyBhbmQgc3RyZWFtCisJYnVmZmVycy4gIElmIHRoaXMgaXMgYSBtZXNzYWdlIGJ1ZmZlciB0aGVuIHRoZSBzcGFjZSBuZWVkZWQgbXVzdCBiZQorCWluY3JlYXNlZCBieSB0aGUgYW1vdW50IG9mIGJ5dGVzIG5lZWRlZCB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZQorCW1lc3NhZ2UuICovCisJaWYoICggcHhTdHJlYW1CdWZmZXItPnVjRmxhZ3MgJiBzYkZMQUdTX0lTX01FU1NBR0VfQlVGRkVSICkgIT0gKCB1aW50OF90ICkgMCApCisJeworCQl4UmVxdWlyZWRTcGFjZSArPSBzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIOworCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorCisJaWYoIHhUaWNrc1RvV2FpdCAhPSAoIFRpY2tUeXBlX3QgKSAwICkKKwl7CisJCXZUYXNrU2V0VGltZU91dFN0YXRlKCAmeFRpbWVPdXQgKTsKKworCQlkbworCQl7CisJCQkvKiBXYWl0IHVudGlsIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgYnl0ZXMgYXJlIGZyZWUgaW4gdGhlIG1lc3NhZ2UKKwkJCWJ1ZmZlci4gKi8KKwkJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQkJeworCQkJCXhTcGFjZSA9IHhTdHJlYW1CdWZmZXJTcGFjZXNBdmFpbGFibGUoIHB4U3RyZWFtQnVmZmVyICk7CisKKwkJCQlpZiggeFNwYWNlIDwgeFJlcXVpcmVkU3BhY2UgKQorCQkJCXsKKwkJCQkJLyogQ2xlYXIgbm90aWZpY2F0aW9uIHN0YXRlIGFzIGdvaW5nIHRvIHdhaXQgZm9yIHNwYWNlLiAqLworCQkJCQkoIHZvaWQgKSB4VGFza05vdGlmeVN0YXRlQ2xlYXIoIE5VTEwgKTsKKworCQkJCQkvKiBTaG91bGQgb25seSBiZSBvbmUgd3JpdGVyLiAqLworCQkJCQljb25maWdBU1NFUlQoIHB4U3RyZWFtQnVmZmVyLT54VGFza1dhaXRpbmdUb1NlbmQgPT0gTlVMTCApOworCQkJCQlweFN0cmVhbUJ1ZmZlci0+eFRhc2tXYWl0aW5nVG9TZW5kID0geFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl0YXNrRVhJVF9DUklUSUNBTCgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJCQl0cmFjZUJMT0NLSU5HX09OX1NUUkVBTV9CVUZGRVJfU0VORCggeFN0cmVhbUJ1ZmZlciApOworCQkJKCB2b2lkICkgeFRhc2tOb3RpZnlXYWl0KCAoIHVpbnQzMl90ICkgMCwgVUlOVDMyX01BWCwgTlVMTCwgeFRpY2tzVG9XYWl0ICk7CisJCQlweFN0cmVhbUJ1ZmZlci0+eFRhc2tXYWl0aW5nVG9TZW5kID0gTlVMTDsKKworCQl9IHdoaWxlKCB4VGFza0NoZWNrRm9yVGltZU91dCggJnhUaW1lT3V0LCAmeFRpY2tzVG9XYWl0ICkgPT0gcGRGQUxTRSApOworCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorCisJaWYoIHhTcGFjZSA9PSAoIHNpemVfdCApIDAgKQorCXsKKwkJeFNwYWNlID0geFN0cmVhbUJ1ZmZlclNwYWNlc0F2YWlsYWJsZSggcHhTdHJlYW1CdWZmZXIgKTsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCXhSZXR1cm4gPSBwcnZXcml0ZU1lc3NhZ2VUb0J1ZmZlciggcHhTdHJlYW1CdWZmZXIsIHB2VHhEYXRhLCB4RGF0YUxlbmd0aEJ5dGVzLCB4U3BhY2UsIHhSZXF1aXJlZFNwYWNlICk7CisKKwlpZiggeFJldHVybiA+ICggc2l6ZV90ICkgMCApCisJeworCQl0cmFjZVNUUkVBTV9CVUZGRVJfU0VORCggeFN0cmVhbUJ1ZmZlciwgeFJldHVybiApOworCisJCS8qIFdhcyBhIHRhc2sgd2FpdGluZyBmb3IgdGhlIGRhdGE/ICovCisJCWlmKCBwcnZCeXRlc0luQnVmZmVyKCBweFN0cmVhbUJ1ZmZlciApID49IHB4U3RyZWFtQnVmZmVyLT54VHJpZ2dlckxldmVsQnl0ZXMgKQorCQl7CisJCQlzYlNFTkRfQ09NUExFVEVEKCBweFN0cmVhbUJ1ZmZlciApOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJdHJhY2VTVFJFQU1fQlVGRkVSX1NFTkRfRkFJTEVEKCB4U3RyZWFtQnVmZmVyICk7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhTdHJlYW1CdWZmZXJTZW5kRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwKKwkJCQkJCQkJIGNvbnN0IHZvaWQgKnB2VHhEYXRhLAorCQkJCQkJCQkgc2l6ZV90IHhEYXRhTGVuZ3RoQnl0ZXMsCisJCQkJCQkJCSBCYXNlVHlwZV90ICogY29uc3QgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApCit7CitTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0gKCBTdHJlYW1CdWZmZXJfdCAqICkgeFN0cmVhbUJ1ZmZlcjsgLypsaW50ICFlOTA4NyAhZTkwNzkgU2FmZSBjYXN0IGFzIFN0cmVhbUJ1ZmZlckhhbmRsZV90IGlzIG9wYXF1ZSBTdHJlYW1idWZmZXJfdC4gKi8KK3NpemVfdCB4UmV0dXJuLCB4U3BhY2U7CitzaXplX3QgeFJlcXVpcmVkU3BhY2UgPSB4RGF0YUxlbmd0aEJ5dGVzOworCisJY29uZmlnQVNTRVJUKCBwdlR4RGF0YSApOworCWNvbmZpZ0FTU0VSVCggcHhTdHJlYW1CdWZmZXIgKTsKKworCS8qIFRoaXMgc2VuZCBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIHRvIGJvdGggbWVzc2FnZSBidWZmZXJzIGFuZCBzdHJlYW0KKwlidWZmZXJzLiAgSWYgdGhpcyBpcyBhIG1lc3NhZ2UgYnVmZmVyIHRoZW4gdGhlIHNwYWNlIG5lZWRlZCBtdXN0IGJlCisJaW5jcmVhc2VkIGJ5IHRoZSBhbW91bnQgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIHRoZSBsZW5ndGggb2YgdGhlCisJbWVzc2FnZS4gKi8KKwlpZiggKCBweFN0cmVhbUJ1ZmZlci0+dWNGbGFncyAmIHNiRkxBR1NfSVNfTUVTU0FHRV9CVUZGRVIgKSAhPSAoIHVpbnQ4X3QgKSAwICkKKwl7CisJCXhSZXF1aXJlZFNwYWNlICs9IHNiQllURVNfVE9fU1RPUkVfTUVTU0FHRV9MRU5HVEg7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwl4U3BhY2UgPSB4U3RyZWFtQnVmZmVyU3BhY2VzQXZhaWxhYmxlKCBweFN0cmVhbUJ1ZmZlciApOworCXhSZXR1cm4gPSBwcnZXcml0ZU1lc3NhZ2VUb0J1ZmZlciggcHhTdHJlYW1CdWZmZXIsIHB2VHhEYXRhLCB4RGF0YUxlbmd0aEJ5dGVzLCB4U3BhY2UsIHhSZXF1aXJlZFNwYWNlICk7CisKKwlpZiggeFJldHVybiA+ICggc2l6ZV90ICkgMCApCisJeworCQkvKiBXYXMgYSB0YXNrIHdhaXRpbmcgZm9yIHRoZSBkYXRhPyAqLworCQlpZiggcHJ2Qnl0ZXNJbkJ1ZmZlciggcHhTdHJlYW1CdWZmZXIgKSA+PSBweFN0cmVhbUJ1ZmZlci0+eFRyaWdnZXJMZXZlbEJ5dGVzICkKKwkJeworCQkJc2JTRU5EX0NPTVBMRVRFX0ZST01fSVNSKCBweFN0cmVhbUJ1ZmZlciwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwl0cmFjZVNUUkVBTV9CVUZGRVJfU0VORF9GUk9NX0lTUiggeFN0cmVhbUJ1ZmZlciwgeFJldHVybiApOworCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHNpemVfdCBwcnZXcml0ZU1lc3NhZ2VUb0J1ZmZlciggU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciwKKwkJCQkJCQkJCSAgIGNvbnN0IHZvaWQgKiBwdlR4RGF0YSwKKwkJCQkJCQkJCSAgIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLAorCQkJCQkJCQkJICAgc2l6ZV90IHhTcGFjZSwKKwkJCQkJCQkJCSAgIHNpemVfdCB4UmVxdWlyZWRTcGFjZSApCit7CisJQmFzZVR5cGVfdCB4U2hvdWxkV3JpdGU7CisJc2l6ZV90IHhSZXR1cm47CisKKwlpZiggeFNwYWNlID09ICggc2l6ZV90ICkgMCApCisJeworCQkvKiBEb2Vzbid0IG1hdHRlciBpZiB0aGlzIGlzIGEgc3RyZWFtIGJ1ZmZlciBvciBhIG1lc3NhZ2UgYnVmZmVyLCB0aGVyZQorCQlpcyBubyBzcGFjZSB0byB3cml0ZS4gKi8KKwkJeFNob3VsZFdyaXRlID0gcGRGQUxTRTsKKwl9CisJZWxzZSBpZiggKCBweFN0cmVhbUJ1ZmZlci0+dWNGbGFncyAmIHNiRkxBR1NfSVNfTUVTU0FHRV9CVUZGRVIgKSA9PSAoIHVpbnQ4X3QgKSAwICkKKwl7CisJCS8qIFRoaXMgaXMgYSBzdHJlYW0gYnVmZmVyLCBhcyBvcHBvc2VkIHRvIGEgbWVzc2FnZSBidWZmZXIsIHNvIHdyaXRpbmcgYQorCQlzdHJlYW0gb2YgYnl0ZXMgcmF0aGVyIHRoYW4gZGlzY3JldGUgbWVzc2FnZXMuICBXcml0ZSBhcyBtYW55IGJ5dGVzIGFzCisJCXBvc3NpYmxlLiAqLworCQl4U2hvdWxkV3JpdGUgPSBwZFRSVUU7CisJCXhEYXRhTGVuZ3RoQnl0ZXMgPSBjb25maWdNSU4oIHhEYXRhTGVuZ3RoQnl0ZXMsIHhTcGFjZSApOyAvKmxpbnQgIWU5MDQ0IEZ1bmN0aW9uIHBhcmFtZXRlciBtb2RpZmllZCB0byBlbnN1cmUgaXQgaXMgY2FwcGVkIHRvIGF2YWlsYWJsZSBzcGFjZS4gKi8KKwl9CisJZWxzZSBpZiggeFNwYWNlID49IHhSZXF1aXJlZFNwYWNlICkKKwl7CisJCS8qIFRoaXMgaXMgYSBtZXNzYWdlIGJ1ZmZlciwgYXMgb3Bwb3NlZCB0byBhIHN0cmVhbSBidWZmZXIsIGFuZCB0aGVyZQorCQlpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYm90aCB0aGUgbWVzc2FnZSBsZW5ndGggYW5kIHRoZSBtZXNzYWdlIGl0c2VsZgorCQlpbnRvIHRoZSBidWZmZXIuICBTdGFydCBieSB3cml0aW5nIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEsIHRoZSBkYXRhCisJCWl0c2VsZiB3aWxsIGJlIHdyaXR0ZW4gbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbi4gKi8KKwkJeFNob3VsZFdyaXRlID0gcGRUUlVFOworCQkoIHZvaWQgKSBwcnZXcml0ZUJ5dGVzVG9CdWZmZXIoIHB4U3RyZWFtQnVmZmVyLCAoIGNvbnN0IHVpbnQ4X3QgKiApICYoIHhEYXRhTGVuZ3RoQnl0ZXMgKSwgc2JCWVRFU19UT19TVE9SRV9NRVNTQUdFX0xFTkdUSCApOworCX0KKwllbHNlCisJeworCQkvKiBUaGVyZSBpcyBzcGFjZSBhdmFpbGFibGUsIGJ1dCBub3QgZW5vdWdoIHNwYWNlLiAqLworCQl4U2hvdWxkV3JpdGUgPSBwZEZBTFNFOworCX0KKworCWlmKCB4U2hvdWxkV3JpdGUgIT0gcGRGQUxTRSApCisJeworCQkvKiBXcml0ZXMgdGhlIGRhdGEgaXRzZWxmLiAqLworCQl4UmV0dXJuID0gcHJ2V3JpdGVCeXRlc1RvQnVmZmVyKCBweFN0cmVhbUJ1ZmZlciwgKCBjb25zdCB1aW50OF90ICogKSBwdlR4RGF0YSwgeERhdGFMZW5ndGhCeXRlcyApOyAvKmxpbnQgIWU5MDc5IFN0b3JhZ2UgYnVmZmVyIGlzIGltcGxlbWVudGVkIGFzIHVpbnQ4X3QgZm9yIGVhc2Ugb2Ygc2l6aW5nLCBhbGlnaG1lbnQgYW5kIGFjY2Vzcy4gKi8KKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IDA7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhTdHJlYW1CdWZmZXJSZWNlaXZlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLAorCQkJCQkJCSB2b2lkICpwdlJ4RGF0YSwKKwkJCQkJCQkgc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywKKwkJCQkJCQkgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQoreworU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgIWU5MDc5IFNhZmUgY2FzdCBhcyBTdHJlYW1CdWZmZXJIYW5kbGVfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCitzaXplX3QgeFJlY2VpdmVkTGVuZ3RoID0gMCwgeEJ5dGVzQXZhaWxhYmxlLCB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aDsKKworCWNvbmZpZ0FTU0VSVCggcHZSeERhdGEgKTsKKwljb25maWdBU1NFUlQoIHB4U3RyZWFtQnVmZmVyICk7CisKKwkvKiBUaGlzIHJlY2VpdmUgZnVuY3Rpb24gaXMgdXNlZCBieSBib3RoIG1lc3NhZ2UgYnVmZmVycywgd2hpY2ggc3RvcmUKKwlkaXNjcmV0ZSBtZXNzYWdlcywgYW5kIHN0cmVhbSBidWZmZXJzLCB3aGljaCBzdG9yZSBhIGNvbnRpbnVvdXMgc3RyZWFtIG9mCisJYnl0ZXMuICBEaXNjcmV0ZSBtZXNzYWdlcyBpbmNsdWRlIGFuIGFkZGl0aW9uYWwKKwlzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIIGJ5dGVzIHRoYXQgaG9sZCB0aGUgbGVuZ3RoIG9mIHRoZQorCW1lc3NhZ2UuICovCisJaWYoICggcHhTdHJlYW1CdWZmZXItPnVjRmxhZ3MgJiBzYkZMQUdTX0lTX01FU1NBR0VfQlVGRkVSICkgIT0gKCB1aW50OF90ICkgMCApCisJeworCQl4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aCA9IHNiQllURVNfVE9fU1RPUkVfTUVTU0FHRV9MRU5HVEg7CisJfQorCWVsc2UKKwl7CisJCXhCeXRlc1RvU3RvcmVNZXNzYWdlTGVuZ3RoID0gMDsKKwl9CisKKwlpZiggeFRpY2tzVG9XYWl0ICE9ICggVGlja1R5cGVfdCApIDAgKQorCXsKKwkJLyogQ2hlY2tpbmcgaWYgdGhlcmUgaXMgZGF0YSBhbmQgY2xlYXJpbmcgdGhlIG5vdGlmaWNhdGlvbiBzdGF0ZSBtdXN0IGJlCisJCXBlcmZvcm1lZCBhdG9taWNhbGx5LiAqLworCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJeworCQkJeEJ5dGVzQXZhaWxhYmxlID0gcHJ2Qnl0ZXNJbkJ1ZmZlciggcHhTdHJlYW1CdWZmZXIgKTsKKworCQkJLyogSWYgdGhpcyBmdW5jdGlvbiB3YXMgaW52b2tlZCBieSBhIG1lc3NhZ2UgYnVmZmVyIHJlYWQgdGhlbgorCQkJeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggaG9sZHMgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIGhvbGQKKwkJCXRoZSBsZW5ndGggb2YgdGhlIG5leHQgZGlzY3JldGUgbWVzc2FnZS4gIElmIHRoaXMgZnVuY3Rpb24gd2FzCisJCQlpbnZva2VkIGJ5IGEgc3RyZWFtIGJ1ZmZlciByZWFkIHRoZW4geEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggd2lsbAorCQkJYmUgMC4gKi8KKwkJCWlmKCB4Qnl0ZXNBdmFpbGFibGUgPD0geEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggKQorCQkJeworCQkJCS8qIENsZWFyIG5vdGlmaWNhdGlvbiBzdGF0ZSBhcyBnb2luZyB0byB3YWl0IGZvciBkYXRhLiAqLworCQkJCSggdm9pZCApIHhUYXNrTm90aWZ5U3RhdGVDbGVhciggTlVMTCApOworCisJCQkJLyogU2hvdWxkIG9ubHkgYmUgb25lIHJlYWRlci4gKi8KKwkJCQljb25maWdBU1NFUlQoIHB4U3RyZWFtQnVmZmVyLT54VGFza1dhaXRpbmdUb1JlY2VpdmUgPT0gTlVMTCApOworCQkJCXB4U3RyZWFtQnVmZmVyLT54VGFza1dhaXRpbmdUb1JlY2VpdmUgPSB4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJaWYoIHhCeXRlc0F2YWlsYWJsZSA8PSB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aCApCisJCXsKKwkJCS8qIFdhaXQgZm9yIGRhdGEgdG8gYmUgYXZhaWxhYmxlLiAqLworCQkJdHJhY2VCTE9DS0lOR19PTl9TVFJFQU1fQlVGRkVSX1JFQ0VJVkUoIHhTdHJlYW1CdWZmZXIgKTsKKwkJCSggdm9pZCApIHhUYXNrTm90aWZ5V2FpdCggKCB1aW50MzJfdCApIDAsIFVJTlQzMl9NQVgsIE5VTEwsIHhUaWNrc1RvV2FpdCApOworCQkJcHhTdHJlYW1CdWZmZXItPnhUYXNrV2FpdGluZ1RvUmVjZWl2ZSA9IE5VTEw7CisKKwkJCS8qIFJlY2hlY2sgdGhlIGRhdGEgYXZhaWxhYmxlIGFmdGVyIGJsb2NraW5nLiAqLworCQkJeEJ5dGVzQXZhaWxhYmxlID0gcHJ2Qnl0ZXNJbkJ1ZmZlciggcHhTdHJlYW1CdWZmZXIgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKwllbHNlCisJeworCQl4Qnl0ZXNBdmFpbGFibGUgPSBwcnZCeXRlc0luQnVmZmVyKCBweFN0cmVhbUJ1ZmZlciApOworCX0KKworCS8qIFdoZXRoZXIgcmVjZWl2aW5nIGEgZGlzY3JldGUgbWVzc2FnZSAod2hlcmUgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGgKKwlob2xkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gc3RvcmUgdGhlIG1lc3NhZ2UgbGVuZ3RoKSBvciBhIHN0cmVhbSBvZgorCWJ5dGVzICh3aGVyZSB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aCBpcyB6ZXJvKSwgdGhlIG51bWJlciBvZiBieXRlcworCWF2YWlsYWJsZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aCB0byBiZSBhYmxlIHRvCisJcmVhZCBieXRlcyBmcm9tIHRoZSBidWZmZXIuICovCisJaWYoIHhCeXRlc0F2YWlsYWJsZSA+IHhCeXRlc1RvU3RvcmVNZXNzYWdlTGVuZ3RoICkKKwl7CisJCXhSZWNlaXZlZExlbmd0aCA9IHBydlJlYWRNZXNzYWdlRnJvbUJ1ZmZlciggcHhTdHJlYW1CdWZmZXIsIHB2UnhEYXRhLCB4QnVmZmVyTGVuZ3RoQnl0ZXMsIHhCeXRlc0F2YWlsYWJsZSwgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggKTsKKworCQkvKiBXYXMgYSB0YXNrIHdhaXRpbmcgZm9yIHNwYWNlIGluIHRoZSBidWZmZXI/ICovCisJCWlmKCB4UmVjZWl2ZWRMZW5ndGggIT0gKCBzaXplX3QgKSAwICkKKwkJeworCQkJdHJhY2VTVFJFQU1fQlVGRkVSX1JFQ0VJVkUoIHhTdHJlYW1CdWZmZXIsIHhSZWNlaXZlZExlbmd0aCApOworCQkJc2JSRUNFSVZFX0NPTVBMRVRFRCggcHhTdHJlYW1CdWZmZXIgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKwllbHNlCisJeworCQl0cmFjZVNUUkVBTV9CVUZGRVJfUkVDRUlWRV9GQUlMRUQoIHhTdHJlYW1CdWZmZXIgKTsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCXJldHVybiB4UmVjZWl2ZWRMZW5ndGg7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwKKwkJCQkJCQkJCXZvaWQgKnB2UnhEYXRhLAorCQkJCQkJCQkJc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywKKwkJCQkJCQkJCUJhc2VUeXBlX3QgKiBjb25zdCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkKK3sKK1N0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBTYWZlIGNhc3QgYXMgU3RyZWFtQnVmZmVySGFuZGxlX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLworc2l6ZV90IHhSZWNlaXZlZExlbmd0aCA9IDAsIHhCeXRlc0F2YWlsYWJsZSwgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGg7CisKKwljb25maWdBU1NFUlQoIHB2UnhEYXRhICk7CisJY29uZmlnQVNTRVJUKCBweFN0cmVhbUJ1ZmZlciApOworCisJLyogVGhpcyByZWNlaXZlIGZ1bmN0aW9uIGlzIHVzZWQgYnkgYm90aCBtZXNzYWdlIGJ1ZmZlcnMsIHdoaWNoIHN0b3JlCisJZGlzY3JldGUgbWVzc2FnZXMsIGFuZCBzdHJlYW0gYnVmZmVycywgd2hpY2ggc3RvcmUgYSBjb250aW51b3VzIHN0cmVhbSBvZgorCWJ5dGVzLiAgRGlzY3JldGUgbWVzc2FnZXMgaW5jbHVkZSBhbiBhZGRpdGlvbmFsCisJc2JCWVRFU19UT19TVE9SRV9NRVNTQUdFX0xFTkdUSCBieXRlcyB0aGF0IGhvbGQgdGhlIGxlbmd0aCBvZiB0aGUKKwltZXNzYWdlLiAqLworCWlmKCAoIHB4U3RyZWFtQnVmZmVyLT51Y0ZsYWdzICYgc2JGTEFHU19JU19NRVNTQUdFX0JVRkZFUiApICE9ICggdWludDhfdCApIDAgKQorCXsKKwkJeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggPSBzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIOworCX0KKwllbHNlCisJeworCQl4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aCA9IDA7CisJfQorCisJeEJ5dGVzQXZhaWxhYmxlID0gcHJ2Qnl0ZXNJbkJ1ZmZlciggcHhTdHJlYW1CdWZmZXIgKTsKKworCS8qIFdoZXRoZXIgcmVjZWl2aW5nIGEgZGlzY3JldGUgbWVzc2FnZSAod2hlcmUgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGgKKwlob2xkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gc3RvcmUgdGhlIG1lc3NhZ2UgbGVuZ3RoKSBvciBhIHN0cmVhbSBvZgorCWJ5dGVzICh3aGVyZSB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aCBpcyB6ZXJvKSwgdGhlIG51bWJlciBvZiBieXRlcworCWF2YWlsYWJsZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aCB0byBiZSBhYmxlIHRvCisJcmVhZCBieXRlcyBmcm9tIHRoZSBidWZmZXIuICovCisJaWYoIHhCeXRlc0F2YWlsYWJsZSA+IHhCeXRlc1RvU3RvcmVNZXNzYWdlTGVuZ3RoICkKKwl7CisJCXhSZWNlaXZlZExlbmd0aCA9IHBydlJlYWRNZXNzYWdlRnJvbUJ1ZmZlciggcHhTdHJlYW1CdWZmZXIsIHB2UnhEYXRhLCB4QnVmZmVyTGVuZ3RoQnl0ZXMsIHhCeXRlc0F2YWlsYWJsZSwgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggKTsKKworCQkvKiBXYXMgYSB0YXNrIHdhaXRpbmcgZm9yIHNwYWNlIGluIHRoZSBidWZmZXI/ICovCisJCWlmKCB4UmVjZWl2ZWRMZW5ndGggIT0gKCBzaXplX3QgKSAwICkKKwkJeworCQkJc2JSRUNFSVZFX0NPTVBMRVRFRF9GUk9NX0lTUiggcHhTdHJlYW1CdWZmZXIsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorCisJdHJhY2VTVFJFQU1fQlVGRkVSX1JFQ0VJVkVfRlJPTV9JU1IoIHhTdHJlYW1CdWZmZXIsIHhSZWNlaXZlZExlbmd0aCApOworCisJcmV0dXJuIHhSZWNlaXZlZExlbmd0aDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc2l6ZV90IHBydlJlYWRNZXNzYWdlRnJvbUJ1ZmZlciggU3RyZWFtQnVmZmVyX3QgKnB4U3RyZWFtQnVmZmVyLAorCQkJCQkJCQkJCXZvaWQgKnB2UnhEYXRhLAorCQkJCQkJCQkJCXNpemVfdCB4QnVmZmVyTGVuZ3RoQnl0ZXMsCisJCQkJCQkJCQkJc2l6ZV90IHhCeXRlc0F2YWlsYWJsZSwKKwkJCQkJCQkJCQlzaXplX3QgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggKQoreworc2l6ZV90IHhPcmlnaW5hbFRhaWwsIHhSZWNlaXZlZExlbmd0aCwgeE5leHRNZXNzYWdlTGVuZ3RoOworCisJaWYoIHhCeXRlc1RvU3RvcmVNZXNzYWdlTGVuZ3RoICE9ICggc2l6ZV90ICkgMCApCisJeworCQkvKiBBIGRpc2NyZXRlIG1lc3NhZ2UgaXMgYmVpbmcgcmVjZWl2ZWQuICBGaXJzdCByZWNlaXZlIHRoZSBsZW5ndGgKKwkJb2YgdGhlIG1lc3NhZ2UuICBBIGNvcHkgb2YgdGhlIHRhaWwgaXMgc3RvcmVkIHNvIHRoZSBidWZmZXIgY2FuIGJlCisJCXJldHVybmVkIHRvIGl0cyBwcmlvciBzdGF0ZSBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGlzIHRvbworCQlsYXJnZSBmb3IgdGhlIHByb3ZpZGVkIGJ1ZmZlci4gKi8KKwkJeE9yaWdpbmFsVGFpbCA9IHB4U3RyZWFtQnVmZmVyLT54VGFpbDsKKwkJKCB2b2lkICkgcHJ2UmVhZEJ5dGVzRnJvbUJ1ZmZlciggcHhTdHJlYW1CdWZmZXIsICggdWludDhfdCAqICkgJnhOZXh0TWVzc2FnZUxlbmd0aCwgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGgsIHhCeXRlc0F2YWlsYWJsZSApOworCisJCS8qIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGp1c3QKKwkJcmVhZCBvdXQuICovCisJCXhCeXRlc0F2YWlsYWJsZSAtPSB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aDsKKworCQkvKiBDaGVjayB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIGJ1ZmZlciBwcm92aWRlZCBieSB0aGUKKwkJdXNlci4gKi8KKwkJaWYoIHhOZXh0TWVzc2FnZUxlbmd0aCA+IHhCdWZmZXJMZW5ndGhCeXRlcyApCisJCXsKKwkJCS8qIFRoZSB1c2VyIGhhcyBwcm92aWRlZCBpbnN1ZmZpY2llbnQgc3BhY2UgdG8gcmVhZCB0aGUgbWVzc2FnZQorCQkJc28gcmV0dXJuIHRoZSBidWZmZXIgdG8gaXRzIHByZXZpb3VzIHN0YXRlIChzbyB0aGUgbGVuZ3RoIG9mCisJCQl0aGUgbWVzc2FnZSBpcyBpbiB0aGUgYnVmZmVyIGFnYWluKS4gKi8KKwkJCXB4U3RyZWFtQnVmZmVyLT54VGFpbCA9IHhPcmlnaW5hbFRhaWw7CisJCQl4TmV4dE1lc3NhZ2VMZW5ndGggPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8qIEEgc3RyZWFtIG9mIGJ5dGVzIGlzIGJlaW5nIHJlY2VpdmVkIChhcyBvcHBvc2VkIHRvIGEgZGlzY3JldGUKKwkJbWVzc2FnZSksIHNvIHJlYWQgYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZS4gKi8KKwkJeE5leHRNZXNzYWdlTGVuZ3RoID0geEJ1ZmZlckxlbmd0aEJ5dGVzOworCX0KKworCS8qIFJlYWQgdGhlIGFjdHVhbCBkYXRhLiAqLworCXhSZWNlaXZlZExlbmd0aCA9IHBydlJlYWRCeXRlc0Zyb21CdWZmZXIoIHB4U3RyZWFtQnVmZmVyLCAoIHVpbnQ4X3QgKiApIHB2UnhEYXRhLCB4TmV4dE1lc3NhZ2VMZW5ndGgsIHhCeXRlc0F2YWlsYWJsZSApOyAvKmxpbnQgIWU5MDc5IERhdGEgc3RvcmFnZSBhcmVhIGlzIGltcGxlbWVudGVkIGFzIHVpbnQ4X3QgYXJyYXkgZm9yIGVhc2Ugb2Ygc2l6aW5nLCBpbmRleGluZyBhbmQgYWxpZ25tZW50LiAqLworCisJcmV0dXJuIHhSZWNlaXZlZExlbmd0aDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhTdHJlYW1CdWZmZXJJc0VtcHR5KCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKK3sKK2NvbnN0IFN0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBTYWZlIGNhc3QgYXMgU3RyZWFtQnVmZmVySGFuZGxlX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLworQmFzZVR5cGVfdCB4UmV0dXJuOworc2l6ZV90IHhUYWlsOworCisJY29uZmlnQVNTRVJUKCBweFN0cmVhbUJ1ZmZlciApOworCisJLyogVHJ1ZSBpZiBubyBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLworCXhUYWlsID0gcHhTdHJlYW1CdWZmZXItPnhUYWlsOworCWlmKCBweFN0cmVhbUJ1ZmZlci0+eEhlYWQgPT0geFRhaWwgKQorCXsKKwkJeFJldHVybiA9IHBkVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IHBkRkFMU0U7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVySXNGdWxsKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKK3sKK0Jhc2VUeXBlX3QgeFJldHVybjsKK3NpemVfdCB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aDsKK2NvbnN0IFN0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBTYWZlIGNhc3QgYXMgU3RyZWFtQnVmZmVySGFuZGxlX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLworCisJY29uZmlnQVNTRVJUKCBweFN0cmVhbUJ1ZmZlciApOworCisJLyogVGhpcyBnZW5lcmljIHZlcnNpb24gb2YgdGhlIHJlY2VpdmUgZnVuY3Rpb24gaXMgdXNlZCBieSBib3RoIG1lc3NhZ2UKKwlidWZmZXJzLCB3aGljaCBzdG9yZSBkaXNjcmV0ZSBtZXNzYWdlcywgYW5kIHN0cmVhbSBidWZmZXJzLCB3aGljaCBzdG9yZSBhCisJY29udGludW91cyBzdHJlYW0gb2YgYnl0ZXMuICBEaXNjcmV0ZSBtZXNzYWdlcyBpbmNsdWRlIGFuIGFkZGl0aW9uYWwKKwlzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIIGJ5dGVzIHRoYXQgaG9sZCB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLiAqLworCWlmKCAoIHB4U3RyZWFtQnVmZmVyLT51Y0ZsYWdzICYgc2JGTEFHU19JU19NRVNTQUdFX0JVRkZFUiApICE9ICggdWludDhfdCApIDAgKQorCXsKKwkJeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggPSBzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIOworCX0KKwllbHNlCisJeworCQl4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aCA9IDA7CisJfQorCisJLyogVHJ1ZSBpZiB0aGUgYXZhaWxhYmxlIHNwYWNlIGVxdWFscyB6ZXJvLiAqLworCWlmKCB4U3RyZWFtQnVmZmVyU3BhY2VzQXZhaWxhYmxlKCB4U3RyZWFtQnVmZmVyICkgPD0geEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGggKQorCXsKKwkJeFJldHVybiA9IHBkVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IHBkRkFMU0U7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4U3RyZWFtQnVmZmVyU2VuZENvbXBsZXRlZEZyb21JU1IoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKQoreworU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgIWU5MDc5IFNhZmUgY2FzdCBhcyBTdHJlYW1CdWZmZXJIYW5kbGVfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCitCYXNlVHlwZV90IHhSZXR1cm47CitVQmFzZVR5cGVfdCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzOworCisJY29uZmlnQVNTRVJUKCBweFN0cmVhbUJ1ZmZlciApOworCisJdXhTYXZlZEludGVycnVwdFN0YXR1cyA9ICggVUJhc2VUeXBlX3QgKSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CisJeworCQlpZiggKCBweFN0cmVhbUJ1ZmZlciApLT54VGFza1dhaXRpbmdUb1JlY2VpdmUgIT0gTlVMTCApCisJCXsKKwkJCSggdm9pZCApIHhUYXNrTm90aWZ5RnJvbUlTUiggKCBweFN0cmVhbUJ1ZmZlciApLT54VGFza1dhaXRpbmdUb1JlY2VpdmUsCisJCQkJCQkJCQkJICggdWludDMyX3QgKSAwLAorCQkJCQkJCQkJCSBlTm9BY3Rpb24sCisJCQkJCQkJCQkJIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKwkJCSggcHhTdHJlYW1CdWZmZXIgKS0+eFRhc2tXYWl0aW5nVG9SZWNlaXZlID0gTlVMTDsKKwkJCXhSZXR1cm4gPSBwZFRSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4UmV0dXJuID0gcGRGQUxTRTsKKwkJfQorCX0KKwlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgKTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFN0cmVhbUJ1ZmZlclJlY2VpdmVDb21wbGV0ZWRGcm9tSVNSKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkKK3sKK1N0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBTYWZlIGNhc3QgYXMgU3RyZWFtQnVmZmVySGFuZGxlX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLworQmFzZVR5cGVfdCB4UmV0dXJuOworVUJhc2VUeXBlX3QgdXhTYXZlZEludGVycnVwdFN0YXR1czsKKworCWNvbmZpZ0FTU0VSVCggcHhTdHJlYW1CdWZmZXIgKTsKKworCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgPSAoIFVCYXNlVHlwZV90ICkgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCXsKKwkJaWYoICggcHhTdHJlYW1CdWZmZXIgKS0+eFRhc2tXYWl0aW5nVG9TZW5kICE9IE5VTEwgKQorCQl7CisJCQkoIHZvaWQgKSB4VGFza05vdGlmeUZyb21JU1IoICggcHhTdHJlYW1CdWZmZXIgKS0+eFRhc2tXYWl0aW5nVG9TZW5kLAorCQkJCQkJCQkJCSAoIHVpbnQzMl90ICkgMCwKKwkJCQkJCQkJCQkgZU5vQWN0aW9uLAorCQkJCQkJCQkJCSBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisJCQkoIHB4U3RyZWFtQnVmZmVyICktPnhUYXNrV2FpdGluZ1RvU2VuZCA9IE5VTEw7CisJCQl4UmV0dXJuID0gcGRUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJeFJldHVybiA9IHBkRkFMU0U7CisJCX0KKwl9CisJcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzICk7CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc2l6ZV90IHBydldyaXRlQnl0ZXNUb0J1ZmZlciggU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciwgY29uc3QgdWludDhfdCAqcHVjRGF0YSwgc2l6ZV90IHhDb3VudCApCit7CitzaXplX3QgeE5leHRIZWFkLCB4Rmlyc3RMZW5ndGg7CisKKwljb25maWdBU1NFUlQoIHhDb3VudCA+ICggc2l6ZV90ICkgMCApOworCisJeE5leHRIZWFkID0gcHhTdHJlYW1CdWZmZXItPnhIZWFkOworCisJLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgYWRkZWQgaW4gdGhlIGZpcnN0IHdyaXRlIC0KKwl3aGljaCBtYXkgYmUgbGVzcyB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGlmCisJdGhlIGJ1ZmZlciB3aWxsIHdyYXAgYmFjayB0byB0aGUgYmVnaW5uaW5nLiAqLworCXhGaXJzdExlbmd0aCA9IGNvbmZpZ01JTiggcHhTdHJlYW1CdWZmZXItPnhMZW5ndGggLSB4TmV4dEhlYWQsIHhDb3VudCApOworCisJLyogV3JpdGUgYXMgbWFueSBieXRlcyBhcyBjYW4gYmUgd3JpdHRlbiBpbiB0aGUgZmlyc3Qgd3JpdGUuICovCisJY29uZmlnQVNTRVJUKCAoIHhOZXh0SGVhZCArIHhGaXJzdExlbmd0aCApIDw9IHB4U3RyZWFtQnVmZmVyLT54TGVuZ3RoICk7CisJbWVtY3B5KCAoIHZvaWQqICkgKCAmKCBweFN0cmVhbUJ1ZmZlci0+cHVjQnVmZmVyWyB4TmV4dEhlYWQgXSApICksICggY29uc3Qgdm9pZCAqICkgcHVjRGF0YSwgeEZpcnN0TGVuZ3RoICk7IC8qbGludCAhZTkwODcgbWVtY3B5KCkgcmVxdWlyZXMgdm9pZCAqLiAqLworCisJLyogSWYgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHdhcyBsZXNzIHRoYW4gdGhlIG51bWJlciB0aGF0IGNvdWxkIGJlCisJd3JpdHRlbiBpbiB0aGUgZmlyc3Qgd3JpdGUuLi4gKi8KKwlpZiggeENvdW50ID4geEZpcnN0TGVuZ3RoICkKKwl7CisJCS8qIC4uLnRoZW4gd3JpdGUgdGhlIHJlbWFpbmluZyBieXRlcyB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4gKi8KKwkJY29uZmlnQVNTRVJUKCAoIHhDb3VudCAtIHhGaXJzdExlbmd0aCApIDw9IHB4U3RyZWFtQnVmZmVyLT54TGVuZ3RoICk7CisJCW1lbWNweSggKCB2b2lkICogKSBweFN0cmVhbUJ1ZmZlci0+cHVjQnVmZmVyLCAoIGNvbnN0IHZvaWQgKiApICYoIHB1Y0RhdGFbIHhGaXJzdExlbmd0aCBdICksIHhDb3VudCAtIHhGaXJzdExlbmd0aCApOyAvKmxpbnQgIWU5MDg3IG1lbWNweSgpIHJlcXVpcmVzIHZvaWQgKi4gKi8KKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCXhOZXh0SGVhZCArPSB4Q291bnQ7CisJaWYoIHhOZXh0SGVhZCA+PSBweFN0cmVhbUJ1ZmZlci0+eExlbmd0aCApCisJeworCQl4TmV4dEhlYWQgLT0gcHhTdHJlYW1CdWZmZXItPnhMZW5ndGg7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwlweFN0cmVhbUJ1ZmZlci0+eEhlYWQgPSB4TmV4dEhlYWQ7CisKKwlyZXR1cm4geENvdW50OworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzaXplX3QgcHJ2UmVhZEJ5dGVzRnJvbUJ1ZmZlciggU3RyZWFtQnVmZmVyX3QgKnB4U3RyZWFtQnVmZmVyLCB1aW50OF90ICpwdWNEYXRhLCBzaXplX3QgeE1heENvdW50LCBzaXplX3QgeEJ5dGVzQXZhaWxhYmxlICkKK3sKK3NpemVfdCB4Q291bnQsIHhGaXJzdExlbmd0aCwgeE5leHRUYWlsOworCisJLyogVXNlIHRoZSBtaW5pbXVtIG9mIHRoZSB3YW50ZWQgYnl0ZXMgYW5kIHRoZSBhdmFpbGFibGUgYnl0ZXMuICovCisJeENvdW50ID0gY29uZmlnTUlOKCB4Qnl0ZXNBdmFpbGFibGUsIHhNYXhDb3VudCApOworCisJaWYoIHhDb3VudCA+ICggc2l6ZV90ICkgMCApCisJeworCQl4TmV4dFRhaWwgPSBweFN0cmVhbUJ1ZmZlci0+eFRhaWw7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCAtIHdoaWNoIG1heSBiZQorCQlsZXNzIHRoYW4gdGhlIG51bWJlciB3YW50ZWQgaWYgdGhlIGRhdGEgd3JhcHMgYXJvdW5kIHRvIHRoZSBzdGFydCBvZgorCQl0aGUgYnVmZmVyLiAqLworCQl4Rmlyc3RMZW5ndGggPSBjb25maWdNSU4oIHB4U3RyZWFtQnVmZmVyLT54TGVuZ3RoIC0geE5leHRUYWlsLCB4Q291bnQgKTsKKworCQkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiBieXRlcyBpdCBpcyBwb3NzaWJsZSB0byBvYnRhaW4gaW4gdGhlIGZpcnN0CisJCXJlYWQuICBBc3NlcnRzIGNoZWNrIGJvdW5kcyBvZiByZWFkIGFuZCB3cml0ZS4gKi8KKwkJY29uZmlnQVNTRVJUKCB4Rmlyc3RMZW5ndGggPD0geE1heENvdW50ICk7CisJCWNvbmZpZ0FTU0VSVCggKCB4TmV4dFRhaWwgKyB4Rmlyc3RMZW5ndGggKSA8PSBweFN0cmVhbUJ1ZmZlci0+eExlbmd0aCApOworCQltZW1jcHkoICggdm9pZCAqICkgcHVjRGF0YSwgKCBjb25zdCB2b2lkICogKSAmKCBweFN0cmVhbUJ1ZmZlci0+cHVjQnVmZmVyWyB4TmV4dFRhaWwgXSApLCB4Rmlyc3RMZW5ndGggKTsgLypsaW50ICFlOTA4NyBtZW1jcHkoKSByZXF1aXJlcyB2b2lkICouICovCisKKwkJLyogSWYgdGhlIHRvdGFsIG51bWJlciBvZiB3YW50ZWQgYnl0ZXMgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKKwkJdGhhdCBjb3VsZCBiZSByZWFkIGluIHRoZSBmaXJzdCByZWFkLi4uICovCisJCWlmKCB4Q291bnQgPiB4Rmlyc3RMZW5ndGggKQorCQl7CisJCQkvKi4uLnRoZW4gcmVhZCB0aGUgcmVtYWluaW5nIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuICovCisJCQljb25maWdBU1NFUlQoIHhDb3VudCA8PSB4TWF4Q291bnQgKTsKKwkJCW1lbWNweSggKCB2b2lkICogKSAmKCBwdWNEYXRhWyB4Rmlyc3RMZW5ndGggXSApLCAoIHZvaWQgKiApICggcHhTdHJlYW1CdWZmZXItPnB1Y0J1ZmZlciApLCB4Q291bnQgLSB4Rmlyc3RMZW5ndGggKTsgLypsaW50ICFlOTA4NyBtZW1jcHkoKSByZXF1aXJlcyB2b2lkICouICovCisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKworCQkvKiBNb3ZlIHRoZSB0YWlsIHBvaW50ZXIgdG8gZWZmZWN0aXZlbHkgcmVtb3ZlIHRoZSBkYXRhIHJlYWQgZnJvbQorCQl0aGUgYnVmZmVyLiAqLworCQl4TmV4dFRhaWwgKz0geENvdW50OworCisJCWlmKCB4TmV4dFRhaWwgPj0gcHhTdHJlYW1CdWZmZXItPnhMZW5ndGggKQorCQl7CisJCQl4TmV4dFRhaWwgLT0gcHhTdHJlYW1CdWZmZXItPnhMZW5ndGg7CisJCX0KKworCQlweFN0cmVhbUJ1ZmZlci0+eFRhaWwgPSB4TmV4dFRhaWw7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwlyZXR1cm4geENvdW50OworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzaXplX3QgcHJ2Qnl0ZXNJbkJ1ZmZlciggY29uc3QgU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciApCit7CisvKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHhUYWlsIGFuZCB4SGVhZC4gKi8KK3NpemVfdCB4Q291bnQ7CisKKwl4Q291bnQgPSBweFN0cmVhbUJ1ZmZlci0+eExlbmd0aCArIHB4U3RyZWFtQnVmZmVyLT54SGVhZDsKKwl4Q291bnQgLT0gcHhTdHJlYW1CdWZmZXItPnhUYWlsOworCWlmICggeENvdW50ID49IHB4U3RyZWFtQnVmZmVyLT54TGVuZ3RoICkKKwl7CisJCXhDb3VudCAtPSBweFN0cmVhbUJ1ZmZlci0+eExlbmd0aDsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCXJldHVybiB4Q291bnQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2SW5pdGlhbGlzZU5ld1N0cmVhbUJ1ZmZlciggU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciwKKwkJCQkJCQkJCQkgIHVpbnQ4X3QgKiBjb25zdCBwdWNCdWZmZXIsCisJCQkJCQkJCQkJICBzaXplX3QgeEJ1ZmZlclNpemVCeXRlcywKKwkJCQkJCQkJCQkgIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsCisJCQkJCQkJCQkJICBCYXNlVHlwZV90IHhJc01lc3NhZ2VCdWZmZXIgKQoreworCS8qIEFzc2VydCBoZXJlIGlzIGRlbGliZXJhdGVseSB3cml0aW5nIHRvIHRoZSBlbnRpcmUgYnVmZmVyIHRvIGVuc3VyZSBpdCBjYW4KKwliZSB3cml0dGVuIHRvIHdpdGhvdXQgZ2VuZXJhdGluZyBleGNlcHRpb25zLCBhbmQgaXMgc2V0dGluZyB0aGUgYnVmZmVyIHRvIGEKKwlrbm93biB2YWx1ZSB0byBhc3Npc3QgaW4gZGV2ZWxvcG1lbnQvZGVidWdnaW5nLiAqLworCSNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJeworCQkvKiBUaGUgdmFsdWUgd3JpdHRlbiBqdXN0IGhhcyB0byBiZSBpZGVudGlmaWFibGUgd2hlbiBsb29raW5nIGF0IHRoZQorCQltZW1vcnkuICBEb24ndCB1c2UgMHhBNSBhcyB0aGF0IGlzIHRoZSBzdGFjayBmaWxsIHZhbHVlIGFuZCBjb3VsZAorCQlyZXN1bHQgaW4gY29uZnVzaW9uIGFzIHRvIHdoYXQgaXMgYWN0dWFsbHkgYmVpbmcgb2JzZXJ2ZWQuICovCisJCWNvbnN0IEJhc2VUeXBlX3QgeFdyaXRlVmFsdWUgPSAweDU1OworCQljb25maWdBU1NFUlQoIG1lbXNldCggcHVjQnVmZmVyLCAoIGludCApIHhXcml0ZVZhbHVlLCB4QnVmZmVyU2l6ZUJ5dGVzICkgPT0gcHVjQnVmZmVyICk7CisJfQorCSNlbmRpZgorCisJbWVtc2V0KCAoIHZvaWQgKiApIHB4U3RyZWFtQnVmZmVyLCAweDAwLCBzaXplb2YoIFN0cmVhbUJ1ZmZlcl90ICkgKTsgLypsaW50ICFlOTA4NyBtZW1zZXQoKSByZXF1aXJlcyB2b2lkICouICovCisJcHhTdHJlYW1CdWZmZXItPnB1Y0J1ZmZlciA9IHB1Y0J1ZmZlcjsKKwlweFN0cmVhbUJ1ZmZlci0+eExlbmd0aCA9IHhCdWZmZXJTaXplQnl0ZXM7CisJcHhTdHJlYW1CdWZmZXItPnhUcmlnZ2VyTGV2ZWxCeXRlcyA9IHhUcmlnZ2VyTGV2ZWxCeXRlczsKKworCWlmKCB4SXNNZXNzYWdlQnVmZmVyICE9IHBkRkFMU0UgKQorCXsKKwkJcHhTdHJlYW1CdWZmZXItPnVjRmxhZ3MgfD0gc2JGTEFHU19JU19NRVNTQUdFX0JVRkZFUjsKKwl9Cit9CisKKyNpZiAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKworCVVCYXNlVHlwZV90IHV4U3RyZWFtQnVmZmVyR2V0U3RyZWFtQnVmZmVyTnVtYmVyKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKKwl7CisJCXJldHVybiAoICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXIgKS0+dXhTdHJlYW1CdWZmZXJOdW1iZXI7CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCisJdm9pZCB2U3RyZWFtQnVmZmVyU2V0U3RyZWFtQnVmZmVyTnVtYmVyKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBVQmFzZVR5cGVfdCB1eFN0cmVhbUJ1ZmZlck51bWJlciApCisJeworCQkoICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXIgKS0+dXhTdHJlYW1CdWZmZXJOdW1iZXIgPSB1eFN0cmVhbUJ1ZmZlck51bWJlcjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisKKwl1aW50OF90IHVjU3RyZWFtQnVmZmVyR2V0U3RyZWFtQnVmZmVyVHlwZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCisJeworCQlyZXR1cm4gKCAoIFN0cmVhbUJ1ZmZlcl90ICogKXhTdHJlYW1CdWZmZXIgKS0+dWNGbGFncyB8IHNiRkxBR1NfSVNfTUVTU0FHRV9CVUZGRVI7CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS90YXNrcy5jIGIvU291cmNlL3Rhc2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxZDlkMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS90YXNrcy5jCkBAIC0wLDAgKzEsNTAzOSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCithbGwgdGhlIEFQSSBmdW5jdGlvbnMgdG8gdXNlIHRoZSBNUFUgd3JhcHBlcnMuICBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgordGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogRnJlZVJUT1MgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAidGltZXJzLmgiCisjaW5jbHVkZSAic3RhY2tfbWFjcm9zLmgiCisKKy8qIExpbnQgZTk2MSBhbmQgZTc1MCBhcmUgc3VwcHJlc3NlZCBhcyBhIE1JU1JBIGV4Y2VwdGlvbiBqdXN0aWZpZWQgYmVjYXVzZSB0aGUKK01QVSBwb3J0cyByZXF1aXJlIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHRvIGJlIGRlZmluZWQgZm9yIHRoZQoraGVhZGVyIGZpbGVzIGFib3ZlLCBidXQgbm90IGluIHRoaXMgZmlsZSwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QKK3ByaXZpbGVnZWQgVnMgdW5wcml2aWxlZ2VkIGxpbmthZ2UgYW5kIHBsYWNlbWVudC4gKi8KKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSAvKmxpbnQgIWU5NjEgIWU3NTAuICovCisKKy8qIFNldCBjb25maWdVU0VfU1RBVFNfRk9STUFUVElOR19GVU5DVElPTlMgdG8gMiB0byBpbmNsdWRlIHRoZSBzdGF0cyBmb3JtYXR0aW5nCitmdW5jdGlvbnMgYnV0IHdpdGhvdXQgaW5jbHVkaW5nIHN0ZGlvLmggaGVyZS4gKi8KKyNpZiAoIGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUyA9PSAxICkKKwkvKiBBdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZSBhcmUgdHdvIG9wdGlvbmFsIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkCisJdG8gZ2VuZXJhdGUgaHVtYW4gcmVhZGFibGUgdGV4dCBmcm9tIHRoZSByYXcgZGF0YSBnZW5lcmF0ZWQgYnkgdGhlCisJdXhUYXNrR2V0U3lzdGVtU3RhdGUoKSBmdW5jdGlvbi4gIE5vdGUgdGhlIGZvcm1hdHRpbmcgZnVuY3Rpb25zIGFyZSBwcm92aWRlZAorCWZvciBjb252ZW5pZW5jZSBvbmx5LCBhbmQgYXJlIE5PVCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGtlcm5lbC4gKi8KKwkjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZiAvKiBjb25maWdVU0VfU1RBVFNfRk9STUFUVElOR19GVU5DVElPTlMgPT0gMSApICovCisKKyNpZiggY29uZmlnVVNFX1BSRUVNUFRJT04gPT0gMCApCisJLyogSWYgdGhlIGNvb3BlcmF0aXZlIHNjaGVkdWxlciBpcyBiZWluZyB1c2VkIHRoZW4gYSB5aWVsZCBzaG91bGQgbm90IGJlCisJcGVyZm9ybWVkIGp1c3QgYmVjYXVzZSBhIGhpZ2hlciBwcmlvcml0eSB0YXNrIGhhcyBiZWVuIHdva2VuLiAqLworCSNkZWZpbmUgdGFza1lJRUxEX0lGX1VTSU5HX1BSRUVNUFRJT04oKQorI2Vsc2UKKwkjZGVmaW5lIHRhc2tZSUVMRF9JRl9VU0lOR19QUkVFTVBUSU9OKCkgcG9ydFlJRUxEX1dJVEhJTl9BUEkoKQorI2VuZGlmCisKKy8qIFZhbHVlcyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgdWNOb3RpZnlTdGF0ZSBtZW1iZXIgb2YgdGhlIFRDQi4gKi8KKyNkZWZpbmUgdGFza05PVF9XQUlUSU5HX05PVElGSUNBVElPTgkoICggdWludDhfdCApIDAgKQorI2RlZmluZSB0YXNrV0FJVElOR19OT1RJRklDQVRJT04JCSggKCB1aW50OF90ICkgMSApCisjZGVmaW5lIHRhc2tOT1RJRklDQVRJT05fUkVDRUlWRUQJCSggKCB1aW50OF90ICkgMiApCisKKy8qCisgKiBUaGUgdmFsdWUgdXNlZCB0byBmaWxsIHRoZSBzdGFjayBvZiBhIHRhc2sgd2hlbiB0aGUgdGFzayBpcyBjcmVhdGVkLiAgVGhpcworICogaXMgdXNlZCBwdXJlbHkgZm9yIGNoZWNraW5nIHRoZSBoaWdoIHdhdGVyIG1hcmsgZm9yIHRhc2tzLgorICovCisjZGVmaW5lIHRza1NUQUNLX0ZJTExfQllURQkoIDB4YTVVICkKKworLyogU29tZXRpbWVzIHRoZSBGcmVlUlRPU0NvbmZpZy5oIHNldHRpbmdzIG9ubHkgYWxsb3cgYSB0YXNrIHRvIGJlIGNyZWF0ZWQgdXNpbmcKK2R5bmFtaWNhbGx5IGFsbG9jYXRlZCBSQU0sIGluIHdoaWNoIGNhc2Ugd2hlbiBhbnkgdGFzayBpcyBkZWxldGVkIGl0IGlzIGtub3duCit0aGF0IGJvdGggdGhlIHRhc2sncyBzdGFjayBhbmQgVENCIG5lZWQgdG8gYmUgZnJlZWQuICBTb21ldGltZXMgdGhlCitGcmVlUlRPU0NvbmZpZy5oIHNldHRpbmdzIG9ubHkgYWxsb3cgYSB0YXNrIHRvIGJlIGNyZWF0ZWQgdXNpbmcgc3RhdGljYWxseQorYWxsb2NhdGVkIFJBTSwgaW4gd2hpY2ggY2FzZSB3aGVuIGFueSB0YXNrIGlzIGRlbGV0ZWQgaXQgaXMga25vd24gdGhhdCBuZWl0aGVyCit0aGUgdGFzaydzIHN0YWNrIG9yIFRDQiBzaG91bGQgYmUgZnJlZWQuICBTb21ldGltZXMgdGhlIEZyZWVSVE9TQ29uZmlnLmgKK3NldHRpbmdzIGFsbG93IGEgdGFzayB0byBiZSBjcmVhdGVkIHVzaW5nIGVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5CithbGxvY2F0ZWQgUkFNLCBpbiB3aGljaCBjYXNlIGEgbWVtYmVyIG9mIHRoZSBUQ0IgaXMgdXNlZCB0byByZWNvcmQgd2hldGhlciB0aGUKK3N0YWNrIGFuZC9vciBUQ0Igd2VyZSBhbGxvY2F0ZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgc28gd2hlbiBhIHRhc2sgaXMKK2RlbGV0ZWQgdGhlIFJBTSB0aGF0IHdhcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgaXMgZnJlZWQgYWdhaW4gYW5kIG5vIGF0dGVtcHQgaXMKK21hZGUgdG8gZnJlZSB0aGUgUkFNIHRoYXQgd2FzIGFsbG9jYXRlZCBzdGF0aWNhbGx5LgordHNrU1RBVElDX0FORF9EWU5BTUlDX0FMTE9DQVRJT05fUE9TU0lCTEUgaXMgb25seSB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIGZvciBhCit0YXNrIHRvIGJlIGNyZWF0ZWQgdXNpbmcgZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIFJBTS4gIE5vdGUKK3RoYXQgaWYgcG9ydFVTSU5HX01QVV9XUkFQUEVSUyBpcyAxIHRoZW4gYSBwcm90ZWN0ZWQgdGFzayBjYW4gYmUgY3JlYXRlZCB3aXRoCithIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHN0YWNrIGFuZCBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBUQ0IuCishISFOT1RFISEhIElmIHRoZSBkZWZpbml0aW9uIG9mIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFIGlzCitjaGFuZ2VkIHRoZW4gdGhlIGRlZmluaXRpb24gb2YgU3RhdGljVGFza190IG11c3QgYWxzbyBiZSB1cGRhdGVkLiAqLworI2RlZmluZSB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRQkoICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKQorI2RlZmluZSB0c2tEWU5BTUlDQUxMWV9BTExPQ0FURURfU1RBQ0tfQU5EX1RDQiAJCSggKCB1aW50OF90ICkgMCApCisjZGVmaW5lIHRza1NUQVRJQ0FMTFlfQUxMT0NBVEVEX1NUQUNLX09OTFkgCQkJKCAoIHVpbnQ4X3QgKSAxICkKKyNkZWZpbmUgdHNrU1RBVElDQUxMWV9BTExPQ0FURURfU1RBQ0tfQU5EX1RDQgkJKCAoIHVpbnQ4X3QgKSAyICkKKworLyogSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgYXJlIHNldCB0aGVuIHRhc2sgc3RhY2tzIGFyZSBmaWxsZWQgd2l0aCBhIGtub3duCit2YWx1ZSBzbyB0aGUgaGlnaCB3YXRlciBtYXJrIGNhbiBiZSBkZXRlcm1pbmVkLiAgSWYgbm9uZSBvZiB0aGUgZm9sbG93aW5nIGFyZQorc2V0IHRoZW4gZG9uJ3QgZmlsbCB0aGUgc3RhY2sgc28gdGhlcmUgaXMgbm8gdW5uZWNlc3NhcnkgZGVwZW5kZW5jeSBvbiBtZW1zZXQuICovCisjaWYoICggY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID4gMSApIHx8ICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSB8fCAoIElOQ0xVREVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrID09IDEgKSApCisJI2RlZmluZSB0c2tTRVRfTkVXX1NUQUNLU19UT19LTk9XTl9WQUxVRQkxCisjZWxzZQorCSNkZWZpbmUgdHNrU0VUX05FV19TVEFDS1NfVE9fS05PV05fVkFMVUUJMAorI2VuZGlmCisKKy8qCisgKiBNYWNyb3MgdXNlZCBieSB2TGlzdFRhc2sgdG8gaW5kaWNhdGUgd2hpY2ggc3RhdGUgYSB0YXNrIGlzIGluLgorICovCisjZGVmaW5lIHRza1JVTk5JTkdfQ0hBUgkJKCAnWCcgKQorI2RlZmluZSB0c2tCTE9DS0VEX0NIQVIJCSggJ0InICkKKyNkZWZpbmUgdHNrUkVBRFlfQ0hBUgkJKCAnUicgKQorI2RlZmluZSB0c2tERUxFVEVEX0NIQVIJCSggJ0QnICkKKyNkZWZpbmUgdHNrU1VTUEVOREVEX0NIQVIJKCAnUycgKQorCisvKgorICogU29tZSBrZXJuZWwgYXdhcmUgZGVidWdnZXJzIHJlcXVpcmUgdGhlIGRhdGEgdGhlIGRlYnVnZ2VyIG5lZWRzIGFjY2VzcyB0byBiZQorICogZ2xvYmFsLCByYXRoZXIgdGhhbiBmaWxlIHNjb3BlLgorICovCisjaWZkZWYgcG9ydFJFTU9WRV9TVEFUSUNfUVVBTElGSUVSCisJI2RlZmluZSBzdGF0aWMKKyNlbmRpZgorCisvKiBUaGUgbmFtZSBhbGxvY2F0ZWQgdG8gdGhlIElkbGUgdGFzay4gIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcKK2NvbmZpZ0lETEVfVEFTS19OQU1FIGluIEZyZWVSVE9TQ29uZmlnLmguICovCisjaWZuZGVmIGNvbmZpZ0lETEVfVEFTS19OQU1FCisJI2RlZmluZSBjb25maWdJRExFX1RBU0tfTkFNRSAiSURMRSIKKyNlbmRpZgorCisjaWYgKCBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gPT0gMCApCisKKwkvKiBJZiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gaXMgMCB0aGVuIHRhc2sgc2VsZWN0aW9uIGlzCisJcGVyZm9ybWVkIGluIGEgZ2VuZXJpYyB3YXkgdGhhdCBpcyBub3Qgb3B0aW1pc2VkIHRvIGFueSBwYXJ0aWN1bGFyCisJbWljcm9jb250cm9sbGVyIGFyY2hpdGVjdHVyZS4gKi8KKworCS8qIHV4VG9wUmVhZHlQcmlvcml0eSBob2xkcyB0aGUgcHJpb3JpdHkgb2YgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcmVhZHkKKwlzdGF0ZSB0YXNrLiAqLworCSNkZWZpbmUgdGFza1JFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSApCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCWlmKCAoIHV4UHJpb3JpdHkgKSA+IHV4VG9wUmVhZHlQcmlvcml0eSApCQkJCQkJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQl1eFRvcFJlYWR5UHJpb3JpdHkgPSAoIHV4UHJpb3JpdHkgKTsJCQkJCQkJCQkJCQkJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl9IC8qIHRhc2tSRUNPUkRfUkVBRFlfUFJJT1JJVFkgKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJI2RlZmluZSB0YXNrU0VMRUNUX0hJR0hFU1RfUFJJT1JJVFlfVEFTSygpCQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVVCYXNlVHlwZV90IHV4VG9wUHJpb3JpdHkgPSB1eFRvcFJlYWR5UHJpb3JpdHk7CQkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJLyogRmluZCB0aGUgaGlnaGVzdCBwcmlvcml0eSBxdWV1ZSB0aGF0IGNvbnRhaW5zIHJlYWR5IHRhc2tzLiAqLwkJCQkJCQkJXAorCQl3aGlsZSggbGlzdExJU1RfSVNfRU1QVFkoICYoIHB4UmVhZHlUYXNrc0xpc3RzWyB1eFRvcFByaW9yaXR5IF0gKSApICkJCQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJY29uZmlnQVNTRVJUKCB1eFRvcFByaW9yaXR5ICk7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCS0tdXhUb3BQcmlvcml0eTsJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCS8qIGxpc3RHRVRfT1dORVJfT0ZfTkVYVF9FTlRSWSBpbmRleGVzIHRocm91Z2ggdGhlIGxpc3QsIHNvIHRoZSB0YXNrcyBvZgkJCQkJCVwKKwkJdGhlCXNhbWUgcHJpb3JpdHkgZ2V0IGFuIGVxdWFsIHNoYXJlIG9mIHRoZSBwcm9jZXNzb3IgdGltZS4gKi8JCQkJCQkJCQlcCisJCWxpc3RHRVRfT1dORVJfT0ZfTkVYVF9FTlRSWSggcHhDdXJyZW50VENCLCAmKCBweFJlYWR5VGFza3NMaXN0c1sgdXhUb3BQcmlvcml0eSBdICkgKTsJCQlcCisJCXV4VG9wUmVhZHlQcmlvcml0eSA9IHV4VG9wUHJpb3JpdHk7CQkJCQkJCQkJCQkJCQkJCVwKKwl9IC8qIHRhc2tTRUxFQ1RfSElHSEVTVF9QUklPUklUWV9UQVNLICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIERlZmluZSBhd2F5IHRhc2tSRVNFVF9SRUFEWV9QUklPUklUWSgpIGFuZCBwb3J0UkVTRVRfUkVBRFlfUFJJT1JJVFkoKSBhcworCXRoZXkgYXJlIG9ubHkgcmVxdWlyZWQgd2hlbiBhIHBvcnQgb3B0aW1pc2VkIG1ldGhvZCBvZiB0YXNrIHNlbGVjdGlvbiBpcworCWJlaW5nIHVzZWQuICovCisJI2RlZmluZSB0YXNrUkVTRVRfUkVBRFlfUFJJT1JJVFkoIHV4UHJpb3JpdHkgKQorCSNkZWZpbmUgcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5LCB1eFRvcFJlYWR5UHJpb3JpdHkgKQorCisjZWxzZSAvKiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gKi8KKworCS8qIElmIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiBpcyAxIHRoZW4gdGFzayBzZWxlY3Rpb24gaXMKKwlwZXJmb3JtZWQgaW4gYSB3YXkgdGhhdCBpcyB0YWlsb3JlZCB0byB0aGUgcGFydGljdWxhciBtaWNyb2NvbnRyb2xsZXIKKwlhcmNoaXRlY3R1cmUgYmVpbmcgdXNlZC4gKi8KKworCS8qIEEgcG9ydCBvcHRpbWlzZWQgdmVyc2lvbiBpcyBwcm92aWRlZC4gIENhbGwgdGhlIHBvcnQgZGVmaW5lZCBtYWNyb3MuICovCisJI2RlZmluZSB0YXNrUkVDT1JEX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5ICkJcG9ydFJFQ09SRF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSwgdXhUb3BSZWFkeVByaW9yaXR5ICkKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJI2RlZmluZSB0YXNrU0VMRUNUX0hJR0hFU1RfUFJJT1JJVFlfVEFTSygpCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlVQmFzZVR5cGVfdCB1eFRvcFByaW9yaXR5OwkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCS8qIEZpbmQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbGlzdCB0aGF0IGNvbnRhaW5zIHJlYWR5IHRhc2tzLiAqLwkJCQkJCQkJXAorCQlwb3J0R0VUX0hJR0hFU1RfUFJJT1JJVFkoIHV4VG9wUHJpb3JpdHksIHV4VG9wUmVhZHlQcmlvcml0eSApOwkJCQkJCQkJXAorCQljb25maWdBU1NFUlQoIGxpc3RDVVJSRU5UX0xJU1RfTEVOR1RIKCAmKCBweFJlYWR5VGFza3NMaXN0c1sgdXhUb3BQcmlvcml0eSBdICkgKSA+IDAgKTsJCVwKKwkJbGlzdEdFVF9PV05FUl9PRl9ORVhUX0VOVFJZKCBweEN1cnJlbnRUQ0IsICYoIHB4UmVhZHlUYXNrc0xpc3RzWyB1eFRvcFByaW9yaXR5IF0gKSApOwkJXAorCX0gLyogdGFza1NFTEVDVF9ISUdIRVNUX1BSSU9SSVRZX1RBU0soKSAqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBBIHBvcnQgb3B0aW1pc2VkIHZlcnNpb24gaXMgcHJvdmlkZWQsIGNhbGwgaXQgb25seSBpZiB0aGUgVENCIGJlaW5nIHJlc2V0CisJaXMgYmVpbmcgcmVmZXJlbmNlZCBmcm9tIGEgcmVhZHkgbGlzdC4gIElmIGl0IGlzIHJlZmVyZW5jZWQgZnJvbSBhIGRlbGF5ZWQKKwlvciBzdXNwZW5kZWQgbGlzdCB0aGVuIGl0IHdvbid0IGJlIGluIGEgcmVhZHkgbGlzdC4gKi8KKwkjZGVmaW5lIHRhc2tSRVNFVF9SRUFEWV9QUklPUklUWSggdXhQcmlvcml0eSApCQkJCQkJCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCWlmKCBsaXN0Q1VSUkVOVF9MSVNUX0xFTkdUSCggJiggcHhSZWFkeVRhc2tzTGlzdHNbICggdXhQcmlvcml0eSApIF0gKSApID09ICggVUJhc2VUeXBlX3QgKSAwICkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCAoIHV4UHJpb3JpdHkgKSwgKCB1eFRvcFJlYWR5UHJpb3JpdHkgKSApOwkJCQkJCQlcCisJCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBweERlbGF5ZWRUYXNrTGlzdCBhbmQgcHhPdmVyZmxvd0RlbGF5ZWRUYXNrTGlzdCBhcmUgc3dpdGNoZWQgd2hlbiB0aGUgdGljaworY291bnQgb3ZlcmZsb3dzLiAqLworI2RlZmluZSB0YXNrU1dJVENIX0RFTEFZRURfTElTVFMoKQkJCQkJCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJTGlzdF90ICpweFRlbXA7CQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkvKiBUaGUgZGVsYXllZCB0YXNrcyBsaXN0IHNob3VsZCBiZSBlbXB0eSB3aGVuIHRoZSBsaXN0cyBhcmUgc3dpdGNoZWQuICovCQkJCQkJXAorCWNvbmZpZ0FTU0VSVCggKCBsaXN0TElTVF9JU19FTVBUWSggcHhEZWxheWVkVGFza0xpc3QgKSApICk7CQkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJcHhUZW1wID0gcHhEZWxheWVkVGFza0xpc3Q7CQkJCQkJCQkJCQkJCQkJCQkJXAorCXB4RGVsYXllZFRhc2tMaXN0ID0gcHhPdmVyZmxvd0RlbGF5ZWRUYXNrTGlzdDsJCQkJCQkJCQkJCQkJXAorCXB4T3ZlcmZsb3dEZWxheWVkVGFza0xpc3QgPSBweFRlbXA7CQkJCQkJCQkJCQkJCQkJCVwKKwl4TnVtT2ZPdmVyZmxvd3MrKzsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlwcnZSZXNldE5leHRUYXNrVW5ibG9ja1RpbWUoKTsJCQkJCQkJCQkJCQkJCQkJCVwKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBQbGFjZSB0aGUgdGFzayByZXByZXNlbnRlZCBieSBweFRDQiBpbnRvIHRoZSBhcHByb3ByaWF0ZSByZWFkeSBsaXN0IGZvcgorICogdGhlIHRhc2suICBJdCBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICovCisjZGVmaW5lIHBydkFkZFRhc2tUb1JlYWR5TGlzdCggcHhUQ0IgKQkJCQkJCQkJCQkJCQkJCQlcCisJdHJhY2VNT1ZFRF9UQVNLX1RPX1JFQURZX1NUQVRFKCBweFRDQiApOwkJCQkJCQkJCQkJCQkJXAorCXRhc2tSRUNPUkRfUkVBRFlfUFJJT1JJVFkoICggcHhUQ0IgKS0+dXhQcmlvcml0eSApOwkJCQkJCQkJCQkJCVwKKwl2TGlzdEluc2VydEVuZCggJiggcHhSZWFkeVRhc2tzTGlzdHNbICggcHhUQ0IgKS0+dXhQcmlvcml0eSBdICksICYoICggcHhUQ0IgKS0+eFN0YXRlTGlzdEl0ZW0gKSApOyBcCisJdHJhY2VQT1NUX01PVkVEX1RBU0tfVE9fUkVBRFlfU1RBVEUoIHB4VENCICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogU2V2ZXJhbCBmdW5jdGlvbnMgdGFrZSBhbiBUYXNrSGFuZGxlX3QgcGFyYW1ldGVyIHRoYXQgY2FuIG9wdGlvbmFsbHkgYmUgTlVMTCwKKyAqIHdoZXJlIE5VTEwgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBoYW5kbGUgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcKKyAqIHRhc2sgc2hvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHBhcmFtZXRlci4gIFRoaXMgbWFjcm8gc2ltcGx5IGNoZWNrcyB0bworICogc2VlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgTlVMTCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIFRDQi4KKyAqLworI2RlZmluZSBwcnZHZXRUQ0JGcm9tSGFuZGxlKCBweEhhbmRsZSApICggKCAoIHB4SGFuZGxlICkgPT0gTlVMTCApID8gKCBUQ0JfdCAqICkgcHhDdXJyZW50VENCIDogKCBUQ0JfdCAqICkgKCBweEhhbmRsZSApICkKKworLyogVGhlIGl0ZW0gdmFsdWUgb2YgdGhlIGV2ZW50IGxpc3QgaXRlbSBpcyBub3JtYWxseSB1c2VkIHRvIGhvbGQgdGhlIHByaW9yaXR5CitvZiB0aGUgdGFzayB0byB3aGljaCBpdCBiZWxvbmdzIChjb2RlZCB0byBhbGxvdyBpdCB0byBiZSBoZWxkIGluIHJldmVyc2UKK3ByaW9yaXR5IG9yZGVyKS4gIEhvd2V2ZXIsIGl0IGlzIG9jY2FzaW9uYWxseSBib3Jyb3dlZCBmb3Igb3RoZXIgcHVycG9zZXMuICBJdAoraXMgaW1wb3J0YW50IGl0cyB2YWx1ZSBpcyBub3QgdXBkYXRlZCBkdWUgdG8gYSB0YXNrIHByaW9yaXR5IGNoYW5nZSB3aGlsZSBpdCBpcworYmVpbmcgdXNlZCBmb3IgYW5vdGhlciBwdXJwb3NlLiAgVGhlIGZvbGxvd2luZyBiaXQgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIGluZm9ybQordGhlIHNjaGVkdWxlciB0aGF0IHRoZSB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQgLSBpbiB3aGljaCBjYXNlIGl0IGlzIHRoZQorcmVzcG9uc2liaWxpdHkgb2Ygd2hpY2hldmVyIG1vZHVsZSBpcyB1c2luZyB0aGUgdmFsdWUgdG8gZW5zdXJlIGl0IGdldHMgc2V0IGJhY2sKK3RvIGl0cyBvcmlnaW5hbCB2YWx1ZSB3aGVuIGl0IGlzIHJlbGVhc2VkLiAqLworI2lmKCBjb25maWdVU0VfMTZfQklUX1RJQ0tTID09IDEgKQorCSNkZWZpbmUgdGFza0VWRU5UX0xJU1RfSVRFTV9WQUxVRV9JTl9VU0UJMHg4MDAwVQorI2Vsc2UKKwkjZGVmaW5lIHRhc2tFVkVOVF9MSVNUX0lURU1fVkFMVUVfSU5fVVNFCTB4ODAwMDAwMDBVTAorI2VuZGlmCisKKy8qCisgKiBUYXNrIGNvbnRyb2wgYmxvY2suICBBIHRhc2sgY29udHJvbCBibG9jayAoVENCKSBpcyBhbGxvY2F0ZWQgZm9yIGVhY2ggdGFzaywKKyAqIGFuZCBzdG9yZXMgdGFzayBzdGF0ZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGEgcG9pbnRlciB0byB0aGUgdGFzaydzIGNvbnRleHQKKyAqICh0aGUgdGFzaydzIHJ1biB0aW1lIGVudmlyb25tZW50LCBpbmNsdWRpbmcgcmVnaXN0ZXIgdmFsdWVzKQorICovCit0eXBlZGVmIHN0cnVjdCB0c2tUYXNrQ29udHJvbEJsb2NrCit7CisJdm9sYXRpbGUgU3RhY2tUeXBlX3QJKnB4VG9wT2ZTdGFjazsJLyo8IFBvaW50cyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgaXRlbSBwbGFjZWQgb24gdGhlIHRhc2tzIHN0YWNrLiAgVEhJUyBNVVNUIEJFIFRIRSBGSVJTVCBNRU1CRVIgT0YgVEhFIFRDQiBTVFJVQ1QuICovCisKKwkjaWYgKCBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDEgKQorCQl4TVBVX1NFVFRJTkdTCXhNUFVTZXR0aW5nczsJCS8qPCBUaGUgTVBVIHNldHRpbmdzIGFyZSBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlIHBvcnQgbGF5ZXIuICBUSElTIE1VU1QgQkUgVEhFIFNFQ09ORCBNRU1CRVIgT0YgVEhFIFRDQiBTVFJVQ1QuICovCisJI2VuZGlmCisKKwlMaXN0SXRlbV90CQkJeFN0YXRlTGlzdEl0ZW07CS8qPCBUaGUgbGlzdCB0aGF0IHRoZSBzdGF0ZSBsaXN0IGl0ZW0gb2YgYSB0YXNrIGlzIHJlZmVyZW5jZSBmcm9tIGRlbm90ZXMgdGhlIHN0YXRlIG9mIHRoYXQgdGFzayAoUmVhZHksIEJsb2NrZWQsIFN1c3BlbmRlZCApLiAqLworCUxpc3RJdGVtX3QJCQl4RXZlbnRMaXN0SXRlbTsJCS8qPCBVc2VkIHRvIHJlZmVyZW5jZSBhIHRhc2sgZnJvbSBhbiBldmVudCBsaXN0LiAqLworCVVCYXNlVHlwZV90CQkJdXhQcmlvcml0eTsJCQkvKjwgVGhlIHByaW9yaXR5IG9mIHRoZSB0YXNrLiAgMCBpcyB0aGUgbG93ZXN0IHByaW9yaXR5LiAqLworCVN0YWNrVHlwZV90CQkJKnB4U3RhY2s7CQkJLyo8IFBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCWNoYXIJCQkJcGNUYXNrTmFtZVsgY29uZmlnTUFYX1RBU0tfTkFNRV9MRU4gXTsvKjwgRGVzY3JpcHRpdmUgbmFtZSBnaXZlbiB0byB0aGUgdGFzayB3aGVuIGNyZWF0ZWQuICBGYWNpbGl0YXRlcyBkZWJ1Z2dpbmcgb25seS4gKi8gLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisKKwkjaWYgKCAoIHBvcnRTVEFDS19HUk9XVEggPiAwICkgfHwgKCBjb25maWdSRUNPUkRfU1RBQ0tfSElHSF9BRERSRVNTID09IDEgKSApCisJCVN0YWNrVHlwZV90CQkqcHhFbmRPZlN0YWNrOwkJLyo8IFBvaW50cyB0byB0aGUgaGlnaGVzdCB2YWxpZCBhZGRyZXNzIGZvciB0aGUgc3RhY2suICovCisJI2VuZGlmCisKKwkjaWYgKCBwb3J0Q1JJVElDQUxfTkVTVElOR19JTl9UQ0IgPT0gMSApCisJCVVCYXNlVHlwZV90CQl1eENyaXRpY2FsTmVzdGluZzsJLyo8IEhvbGRzIHRoZSBjcml0aWNhbCBzZWN0aW9uIG5lc3RpbmcgZGVwdGggZm9yIHBvcnRzIHRoYXQgZG8gbm90IG1haW50YWluIHRoZWlyIG93biBjb3VudCBpbiB0aGUgcG9ydCBsYXllci4gKi8KKwkjZW5kaWYKKworCSNpZiAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwkJVUJhc2VUeXBlX3QJCXV4VENCTnVtYmVyOwkJLyo8IFN0b3JlcyBhIG51bWJlciB0aGF0IGluY3JlbWVudHMgZWFjaCB0aW1lIGEgVENCIGlzIGNyZWF0ZWQuICBJdCBhbGxvd3MgZGVidWdnZXJzIHRvIGRldGVybWluZSB3aGVuIGEgdGFzayBoYXMgYmVlbiBkZWxldGVkIGFuZCB0aGVuIHJlY3JlYXRlZC4gKi8KKwkJVUJhc2VUeXBlX3QJCXV4VGFza051bWJlcjsJCS8qPCBTdG9yZXMgYSBudW1iZXIgc3BlY2lmaWNhbGx5IGZvciB1c2UgYnkgdGhpcmQgcGFydHkgdHJhY2UgY29kZS4gKi8KKwkjZW5kaWYKKworCSNpZiAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKQorCQlVQmFzZVR5cGVfdAkJdXhCYXNlUHJpb3JpdHk7CQkvKjwgVGhlIHByaW9yaXR5IGxhc3QgYXNzaWduZWQgdG8gdGhlIHRhc2sgLSB1c2VkIGJ5IHRoZSBwcmlvcml0eSBpbmhlcml0YW5jZSBtZWNoYW5pc20uICovCisJCVVCYXNlVHlwZV90CQl1eE11dGV4ZXNIZWxkOworCSNlbmRpZgorCisJI2lmICggY29uZmlnVVNFX0FQUExJQ0FUSU9OX1RBU0tfVEFHID09IDEgKQorCQlUYXNrSG9va0Z1bmN0aW9uX3QgcHhUYXNrVGFnOworCSNlbmRpZgorCisJI2lmKCBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgPiAwICkKKwkJdm9pZAkJCSpwdlRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXJzWyBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgXTsKKwkjZW5kaWYKKworCSNpZiggY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgPT0gMSApCisJCXVpbnQzMl90CQl1bFJ1blRpbWVDb3VudGVyOwkvKjwgU3RvcmVzIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgdGFzayBoYXMgc3BlbnQgaW4gdGhlIFJ1bm5pbmcgc3RhdGUuICovCisJI2VuZGlmCisKKwkjaWYgKCBjb25maWdVU0VfTkVXTElCX1JFRU5UUkFOVCA9PSAxICkKKwkJLyogQWxsb2NhdGUgYSBOZXdsaWIgcmVlbnQgc3RydWN0dXJlIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhpcyB0YXNrLgorCQlOb3RlIE5ld2xpYiBzdXBwb3J0IGhhcyBiZWVuIGluY2x1ZGVkIGJ5IHBvcHVsYXIgZGVtYW5kLCBidXQgaXMgbm90CisJCXVzZWQgYnkgdGhlIEZyZWVSVE9TIG1haW50YWluZXJzIHRoZW1zZWx2ZXMuICBGcmVlUlRPUyBpcyBub3QKKwkJcmVzcG9uc2libGUgZm9yIHJlc3VsdGluZyBuZXdsaWIgb3BlcmF0aW9uLiAgVXNlciBtdXN0IGJlIGZhbWlsaWFyIHdpdGgKKwkJbmV3bGliIGFuZCBtdXN0IHByb3ZpZGUgc3lzdGVtLXdpZGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBuZWNlc3NhcnkKKwkJc3R1YnMuIEJlIHdhcm5lZCB0aGF0IChhdCB0aGUgdGltZSBvZiB3cml0aW5nKSB0aGUgY3VycmVudCBuZXdsaWIgZGVzaWduCisJCWltcGxlbWVudHMgYSBzeXN0ZW0td2lkZSBtYWxsb2MoKSB0aGF0IG11c3QgYmUgcHJvdmlkZWQgd2l0aCBsb2Nrcy4gKi8KKwkJc3RydWN0CV9yZWVudCB4TmV3TGliX3JlZW50OworCSNlbmRpZgorCisJI2lmKCBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TID09IDEgKQorCQl2b2xhdGlsZSB1aW50MzJfdCB1bE5vdGlmaWVkVmFsdWU7CisJCXZvbGF0aWxlIHVpbnQ4X3QgdWNOb3RpZnlTdGF0ZTsKKwkjZW5kaWYKKworCS8qIFNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIGRlZmluaXRpb24gb2YKKwl0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRS4gKi8KKwkjaWYoIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICE9IDAgKSAvKmxpbnQgIWU3MzEgTWFjcm8gaGFzIGJlZW4gY29uc29saWRhdGVkIGZvciByZWFkYWJpbGl0eSByZWFzb25zLiAqLworCQl1aW50OF90CXVjU3RhdGljYWxseUFsbG9jYXRlZDsgCQkvKjwgU2V0IHRvIHBkVFJVRSBpZiB0aGUgdGFzayBpcyBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHRvIGVuc3VyZSBubyBhdHRlbXB0IGlzIG1hZGUgdG8gZnJlZSB0aGUgbWVtb3J5LiAqLworCSNlbmRpZgorCisJI2lmKCBJTkNMVURFX3hUYXNrQWJvcnREZWxheSA9PSAxICkKKwkJdWludDhfdCB1Y0RlbGF5QWJvcnRlZDsKKwkjZW5kaWYKKworfSB0c2tUQ0I7CisKKy8qIFRoZSBvbGQgdHNrVENCIG5hbWUgaXMgbWFpbnRhaW5lZCBhYm92ZSB0aGVuIHR5cGVkZWZlZCB0byB0aGUgbmV3IFRDQl90IG5hbWUKK2JlbG93IHRvIGVuYWJsZSB0aGUgdXNlIG9mIG9sZGVyIGtlcm5lbCBhd2FyZSBkZWJ1Z2dlcnMuICovCit0eXBlZGVmIHRza1RDQiBUQ0JfdDsKKworLypsaW50IC1zYXZlIC1lOTU2IEEgbWFudWFsIGFuYWx5c2lzIGFuZCBpbnNwZWN0aW9uIGhhcyBiZWVuIHVzZWQgdG8gZGV0ZXJtaW5lCit3aGljaCBzdGF0aWMgdmFyaWFibGVzIG11c3QgYmUgZGVjbGFyZWQgdm9sYXRpbGUuICovCisKK1BSSVZJTEVHRURfREFUQSBUQ0JfdCAqIHZvbGF0aWxlIHB4Q3VycmVudFRDQiA9IE5VTEw7CisKKy8qIExpc3RzIGZvciByZWFkeSBhbmQgYmxvY2tlZCB0YXNrcy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgcHhSZWFkeVRhc2tzTGlzdHNbIGNvbmZpZ01BWF9QUklPUklUSUVTIF0gPSB7MH07CS8qPCBQcmlvcml0aXNlZCByZWFkeSB0YXNrcy4gKi8KK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHhEZWxheWVkVGFza0xpc3QxID0gezB9OwkJCQkJCQkJLyo8IERlbGF5ZWQgdGFza3MuICovCitQUklWSUxFR0VEX0RBVEEgc3RhdGljIExpc3RfdCB4RGVsYXllZFRhc2tMaXN0MiA9IHswfTsJCQkJCQkJCS8qPCBEZWxheWVkIHRhc2tzICh0d28gbGlzdHMgYXJlIHVzZWQgLSBvbmUgZm9yIGRlbGF5cyB0aGF0IGhhdmUgb3ZlcmZsb3dlZCB0aGUgY3VycmVudCB0aWNrIGNvdW50LiAqLworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgKiB2b2xhdGlsZSBweERlbGF5ZWRUYXNrTGlzdCA9IE5VTEw7CQkJCQkvKjwgUG9pbnRzIHRvIHRoZSBkZWxheWVkIHRhc2sgbGlzdCBjdXJyZW50bHkgYmVpbmcgdXNlZC4gKi8KK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90ICogdm9sYXRpbGUgcHhPdmVyZmxvd0RlbGF5ZWRUYXNrTGlzdCA9IE5VTEw7CQkJLyo8IFBvaW50cyB0byB0aGUgZGVsYXllZCB0YXNrIGxpc3QgY3VycmVudGx5IGJlaW5nIHVzZWQgdG8gaG9sZCB0YXNrcyB0aGF0IGhhdmUgb3ZlcmZsb3dlZCB0aGUgY3VycmVudCB0aWNrIGNvdW50LiAqLworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgeFBlbmRpbmdSZWFkeUxpc3QgPSB7MH07CQkJCQkJCQkvKjwgVGFza3MgdGhhdCBoYXZlIGJlZW4gcmVhZGllZCB3aGlsZSB0aGUgc2NoZWR1bGVyIHdhcyBzdXNwZW5kZWQuICBUaGV5IHdpbGwgYmUgbW92ZWQgdG8gdGhlIHJlYWR5IGxpc3Qgd2hlbiB0aGUgc2NoZWR1bGVyIGlzIHJlc3VtZWQuICovCisKKyNpZiggSU5DTFVERV92VGFza0RlbGV0ZSA9PSAxICkKKworCVBSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHhUYXNrc1dhaXRpbmdUZXJtaW5hdGlvbiA9IHswfTsJCQkJCS8qPCBUYXNrcyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkIC0gYnV0IHRoZWlyIG1lbW9yeSBub3QgeWV0IGZyZWVkLiAqLworCVBSSVZJTEVHRURfREFUQSBzdGF0aWMgdm9sYXRpbGUgVUJhc2VUeXBlX3QgdXhEZWxldGVkVGFza3NXYWl0aW5nQ2xlYW5VcCA9ICggVUJhc2VUeXBlX3QgKSAwVTsKKworI2VuZGlmCisKKyNpZiAoIElOQ0xVREVfdlRhc2tTdXNwZW5kID09IDEgKQorCisJUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgeFN1c3BlbmRlZFRhc2tMaXN0ID0gezB9OwkJCQkJCS8qPCBUYXNrcyB0aGF0IGFyZSBjdXJyZW50bHkgc3VzcGVuZGVkLiAqLworCisjZW5kaWYKKworLyogT3RoZXIgZmlsZSBwcml2YXRlIHZhcmlhYmxlcy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyB2b2xhdGlsZSBVQmFzZVR5cGVfdCB1eEN1cnJlbnROdW1iZXJPZlRhc2tzIAk9ICggVUJhc2VUeXBlX3QgKSAwVTsKK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgdm9sYXRpbGUgVGlja1R5cGVfdCB4VGlja0NvdW50IAkJCQk9ICggVGlja1R5cGVfdCApIGNvbmZpZ0lOSVRJQUxfVElDS19DT1VOVDsKK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgdm9sYXRpbGUgVUJhc2VUeXBlX3QgdXhUb3BSZWFkeVByaW9yaXR5IAkJPSB0c2tJRExFX1BSSU9SSVRZOworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyB2b2xhdGlsZSBCYXNlVHlwZV90IHhTY2hlZHVsZXJSdW5uaW5nIAkJPSBwZEZBTFNFOworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyB2b2xhdGlsZSBVQmFzZVR5cGVfdCB1eFBlbmRlZFRpY2tzIAkJCT0gKCBVQmFzZVR5cGVfdCApIDBVOworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyB2b2xhdGlsZSBCYXNlVHlwZV90IHhZaWVsZFBlbmRpbmcgCQkJPSBwZEZBTFNFOworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyB2b2xhdGlsZSBCYXNlVHlwZV90IHhOdW1PZk92ZXJmbG93cyAJCQk9ICggQmFzZVR5cGVfdCApIDA7CitQUklWSUxFR0VEX0RBVEEgc3RhdGljIFVCYXNlVHlwZV90IHV4VGFza051bWJlciAJCQkJCT0gKCBVQmFzZVR5cGVfdCApIDBVOworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyB2b2xhdGlsZSBUaWNrVHlwZV90IHhOZXh0VGFza1VuYmxvY2tUaW1lCQk9ICggVGlja1R5cGVfdCApIDBVOyAvKiBJbml0aWFsaXNlZCB0byBwb3J0TUFYX0RFTEFZIGJlZm9yZSB0aGUgc2NoZWR1bGVyIHN0YXJ0cy4gKi8KK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgVGFza0hhbmRsZV90IHhJZGxlVGFza0hhbmRsZQkJCQkJPSBOVUxMOwkJCS8qPCBIb2xkcyB0aGUgaGFuZGxlIG9mIHRoZSBpZGxlIHRhc2suICBUaGUgaWRsZSB0YXNrIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBzY2hlZHVsZXIgaXMgc3RhcnRlZC4gKi8KKworLyogQ29udGV4dCBzd2l0Y2hlcyBhcmUgaGVsZCBwZW5kaW5nIHdoaWxlIHRoZSBzY2hlZHVsZXIgaXMgc3VzcGVuZGVkLiAgQWxzbywKK2ludGVycnVwdHMgbXVzdCBub3QgbWFuaXB1bGF0ZSB0aGUgeFN0YXRlTGlzdEl0ZW0gb2YgYSBUQ0IsIG9yIGFueSBvZiB0aGUKK2xpc3RzIHRoZSB4U3RhdGVMaXN0SXRlbSBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tLCBpZiB0aGUgc2NoZWR1bGVyIGlzIHN1c3BlbmRlZC4KK0lmIGFuIGludGVycnVwdCBuZWVkcyB0byB1bmJsb2NrIGEgdGFzayB3aGlsZSB0aGUgc2NoZWR1bGVyIGlzIHN1c3BlbmRlZCB0aGVuIGl0Cittb3ZlcyB0aGUgdGFzaydzIGV2ZW50IGxpc3QgaXRlbSBpbnRvIHRoZSB4UGVuZGluZ1JlYWR5TGlzdCwgcmVhZHkgZm9yIHRoZQora2VybmVsIHRvIG1vdmUgdGhlIHRhc2sgZnJvbSB0aGUgcGVuZGluZyByZWFkeSBsaXN0IGludG8gdGhlIHJlYWwgcmVhZHkgbGlzdAord2hlbiB0aGUgc2NoZWR1bGVyIGlzIHVuc3VzcGVuZGVkLiAgVGhlIHBlbmRpbmcgcmVhZHkgbGlzdCBpdHNlbGYgY2FuIG9ubHkgYmUKK2FjY2Vzc2VkIGZyb20gYSBjcml0aWNhbCBzZWN0aW9uLiAqLworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyB2b2xhdGlsZSBVQmFzZVR5cGVfdCB1eFNjaGVkdWxlclN1c3BlbmRlZAk9ICggVUJhc2VUeXBlX3QgKSBwZEZBTFNFOworCisjaWYgKCBjb25maWdHRU5FUkFURV9SVU5fVElNRV9TVEFUUyA9PSAxICkKKworCVBSSVZJTEVHRURfREFUQSBzdGF0aWMgdWludDMyX3QgdWxUYXNrU3dpdGNoZWRJblRpbWUgPSAwVUw7CS8qPCBIb2xkcyB0aGUgdmFsdWUgb2YgYSB0aW1lci9jb3VudGVyIHRoZSBsYXN0IHRpbWUgYSB0YXNrIHdhcyBzd2l0Y2hlZCBpbi4gKi8KKwlQUklWSUxFR0VEX0RBVEEgc3RhdGljIHVpbnQzMl90IHVsVG90YWxSdW5UaW1lID0gMFVMOwkJLyo8IEhvbGRzIHRoZSB0b3RhbCBhbW91bnQgb2YgZXhlY3V0aW9uIHRpbWUgYXMgZGVmaW5lZCBieSB0aGUgcnVuIHRpbWUgY291bnRlciBjbG9jay4gKi8KKworI2VuZGlmCisKKy8qbGludCAtcmVzdG9yZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gcHJvdG90eXBlcy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmKCAgY29uZmlnQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XID4gMCApCisJZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uU3RhY2tPdmVyZmxvd0hvb2soIFRhc2tIYW5kbGVfdCB4VGFzaywgY2hhciAqcGNUYXNrTmFtZSApOworI2VuZGlmCisKKyNpZiggY29uZmlnVVNFX1RJQ0tfSE9PSyA+IDAgKQorCWV4dGVybiB2b2lkIHZBcHBsaWNhdGlvblRpY2tIb29rKCB2b2lkICk7CisjZW5kaWYKKworI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCWV4dGVybiB2b2lkIHZBcHBsaWNhdGlvbkdldElkbGVUYXNrTWVtb3J5KCBTdGF0aWNUYXNrX3QgKipwcHhJZGxlVGFza1RDQkJ1ZmZlciwgU3RhY2tUeXBlX3QgKipwcHhJZGxlVGFza1N0YWNrQnVmZmVyLCB1aW50MzJfdCAqcHVsSWRsZVRhc2tTdGFja1NpemUgKTsKKyNlbmRpZgorCisvKiBGaWxlIHByaXZhdGUgZnVuY3Rpb25zLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogVXRpbGl0eSB0YXNrIHRoYXQgc2ltcGx5IHJldHVybnMgcGRUUlVFIGlmIHRoZSB0YXNrIHJlZmVyZW5jZWQgYnkgeFRhc2sgaXMKKyAqIGN1cnJlbnRseSBpbiB0aGUgU3VzcGVuZGVkIHN0YXRlLCBvciBwZEZBTFNFIGlmIHRoZSB0YXNrIHJlZmVyZW5jZWQgYnkgeFRhc2sKKyAqIGlzIGluIGFueSBvdGhlciBzdGF0ZS4KKyAqLworI2lmICggSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSApCisKKwlzdGF0aWMgQmFzZVR5cGVfdCBwcnZUYXNrSXNUYXNrU3VzcGVuZGVkKCBjb25zdCBUYXNrSGFuZGxlX3QgeFRhc2sgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjZW5kaWYgLyogSU5DTFVERV92VGFza1N1c3BlbmQgKi8KKworLyoKKyAqIFV0aWxpdHkgdG8gcmVhZHkgYWxsIHRoZSBsaXN0cyB1c2VkIGJ5IHRoZSBzY2hlZHVsZXIuICBUaGlzIGlzIGNhbGxlZAorICogYXV0b21hdGljYWxseSB1cG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgZmlyc3QgdGFzay4KKyAqLworc3RhdGljIHZvaWQgcHJ2SW5pdGlhbGlzZVRhc2tMaXN0cyggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBUaGUgaWRsZSB0YXNrLCB3aGljaCBhcyBhbGwgdGFza3MgaXMgaW1wbGVtZW50ZWQgYXMgYSBuZXZlciBlbmRpbmcgbG9vcC4KKyAqIFRoZSBpZGxlIHRhc2sgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgcmVhZHkgbGlzdHMgdXBvbgorICogY3JlYXRpb24gb2YgdGhlIGZpcnN0IHVzZXIgdGFzay4KKyAqCisgKiBUaGUgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oKSBtYWNybyBpcyB1c2VkIHRvIGFsbG93IHBvcnQvY29tcGlsZXIgc3BlY2lmaWMKKyAqIGxhbmd1YWdlIGV4dGVuc2lvbnMuICBUaGUgZXF1aXZhbGVudCBwcm90b3R5cGUgZm9yIHRoaXMgZnVuY3Rpb24gaXM6CisgKgorICogdm9pZCBwcnZJZGxlVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICk7CisgKgorICovCitzdGF0aWMgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oIHBydklkbGVUYXNrLCBwdlBhcmFtZXRlcnMgKTsKKworLyoKKyAqIFV0aWxpdHkgdG8gZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGhvbGQgYSBUQ0IsCisgKiBpbmNsdWRpbmcgdGhlIHN0YWNrIHBvaW50ZWQgdG8gYnkgdGhlIFRDQi4KKyAqCisgKiBUaGlzIGRvZXMgbm90IGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgdGFzayBpdHNlbGYgKGkuZS4gbWVtb3J5CisgKiBhbGxvY2F0ZWQgYnkgY2FsbHMgdG8gcHZQb3J0TWFsbG9jIGZyb20gd2l0aGluIHRoZSB0YXNrcyBhcHBsaWNhdGlvbiBjb2RlKS4KKyAqLworI2lmICggSU5DTFVERV92VGFza0RlbGV0ZSA9PSAxICkKKworCXN0YXRpYyB2b2lkIHBydkRlbGV0ZVRDQiggVENCX3QgKnB4VENCICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworI2VuZGlmCisKKy8qCisgKiBVc2VkIG9ubHkgYnkgdGhlIGlkbGUgdGFzay4gIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiBhbnl0aGluZyBoYXMgYmVlbiBwbGFjZWQKKyAqIGluIHRoZSBsaXN0IG9mIHRhc2tzIHdhaXRpbmcgdG8gYmUgZGVsZXRlZC4gIElmIHNvIHRoZSB0YXNrIGlzIGNsZWFuZWQgdXAKKyAqIGFuZCBpdHMgVENCIGRlbGV0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBydkNoZWNrVGFza3NXYWl0aW5nVGVybWluYXRpb24oIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogVGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayBpcyBlbnRlcmluZyB0aGUgQmxvY2tlZCBzdGF0ZS4gIEFkZCB0aGUgdGFzayB0bworICogZWl0aGVyIHRoZSBjdXJyZW50IG9yIHRoZSBvdmVyZmxvdyBkZWxheWVkIHRhc2sgbGlzdC4KKyAqLworc3RhdGljIHZvaWQgcHJ2QWRkQ3VycmVudFRhc2tUb0RlbGF5ZWRMaXN0KCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCwgY29uc3QgQmFzZVR5cGVfdCB4Q2FuQmxvY2tJbmRlZmluaXRlbHkgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogRmlsbHMgYW4gVGFza1N0YXR1c190IHN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uIG9uIGVhY2ggdGFzayB0aGF0IGlzCisgKiByZWZlcmVuY2VkIGZyb20gdGhlIHB4TGlzdCBsaXN0ICh3aGljaCBtYXkgYmUgYSByZWFkeSBsaXN0LCBhIGRlbGF5ZWQgbGlzdCwKKyAqIGEgc3VzcGVuZGVkIGxpc3QsIGV0Yy4pLgorICoKKyAqIFRISVMgRlVOQ1RJT04gSVMgSU5URU5ERUQgRk9SIERFQlVHR0lORyBPTkxZLCBBTkQgU0hPVUxEIE5PVCBCRSBDQUxMRUQgRlJPTQorICogTk9STUFMIEFQUExJQ0FUSU9OIENPREUuCisgKi8KKyNpZiAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKworCXN0YXRpYyBVQmFzZVR5cGVfdCBwcnZMaXN0VGFza3NXaXRoaW5TaW5nbGVMaXN0KCBUYXNrU3RhdHVzX3QgKnB4VGFza1N0YXR1c0FycmF5LCBMaXN0X3QgKnB4TGlzdCwgZVRhc2tTdGF0ZSBlU3RhdGUgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjZW5kaWYKKworLyoKKyAqIFNlYXJjaGVzIHB4TGlzdCBmb3IgYSB0YXNrIHdpdGggbmFtZSBwY05hbWVUb1F1ZXJ5IC0gcmV0dXJuaW5nIGEgaGFuZGxlIHRvCisgKiB0aGUgdGFzayBpZiBpdCBpcyBmb3VuZCwgb3IgTlVMTCBpZiB0aGUgdGFzayBpcyBub3QgZm91bmQuCisgKi8KKyNpZiAoIElOQ0xVREVfeFRhc2tHZXRIYW5kbGUgPT0gMSApCisKKwlzdGF0aWMgVENCX3QgKnBydlNlYXJjaEZvck5hbWVXaXRoaW5TaW5nbGVMaXN0KCBMaXN0X3QgKnB4TGlzdCwgY29uc3QgY2hhciBwY05hbWVUb1F1ZXJ5W10gKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjZW5kaWYKKworLyoKKyAqIFdoZW4gYSB0YXNrIGlzIGNyZWF0ZWQsIHRoZSBzdGFjayBvZiB0aGUgdGFzayBpcyBmaWxsZWQgd2l0aCBhIGtub3duIHZhbHVlLgorICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSAnaGlnaCB3YXRlciBtYXJrJyBvZiB0aGUgdGFzayBzdGFjayBieQorICogZGV0ZXJtaW5pbmcgaG93IG11Y2ggb2YgdGhlIHN0YWNrIHJlbWFpbnMgYXQgdGhlIG9yaWdpbmFsIHByZXNldCB2YWx1ZS4KKyAqLworI2lmICggKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApIHx8ICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgPT0gMSApICkKKworCXN0YXRpYyB1aW50MTZfdCBwcnZUYXNrQ2hlY2tGcmVlU3RhY2tTcGFjZSggY29uc3QgdWludDhfdCAqIHB1Y1N0YWNrQnl0ZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKyNlbmRpZgorCisvKgorICogUmV0dXJuIHRoZSBhbW91bnQgb2YgdGltZSwgaW4gdGlja3MsIHRoYXQgd2lsbCBwYXNzIGJlZm9yZSB0aGUga2VybmVsIHdpbGwKKyAqIG5leHQgbW92ZSBhIHRhc2sgZnJvbSB0aGUgQmxvY2tlZCBzdGF0ZSB0byB0aGUgUnVubmluZyBzdGF0ZS4KKyAqCisgKiBUaGlzIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHNob3VsZCB1c2UgaW5lcXVhbGl0eSB0byAwLCBub3QgZXF1YWxpdHkgdG8gMS4KKyAqIFRoaXMgaXMgdG8gZW5zdXJlIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAoKSBjYW4gYmUgY2FsbGVkIHdoZW4gdXNlcgorICogZGVmaW5lZCBsb3cgcG93ZXIgbW9kZSBpbXBsZW1lbnRhdGlvbnMgcmVxdWlyZSBjb25maWdVU0VfVElDS0xFU1NfSURMRSB0byBiZQorICogc2V0IHRvIGEgdmFsdWUgb3RoZXIgdGhhbiAxLgorICovCisjaWYgKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSAhPSAwICkKKworCXN0YXRpYyBUaWNrVHlwZV90IHBydkdldEV4cGVjdGVkSWRsZVRpbWUoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjZW5kaWYKKworLyoKKyAqIFNldCB4TmV4dFRhc2tVbmJsb2NrVGltZSB0byB0aGUgdGltZSBhdCB3aGljaCB0aGUgbmV4dCBCbG9ja2VkIHN0YXRlIHRhc2sKKyAqIHdpbGwgZXhpdCB0aGUgQmxvY2tlZCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgcHJ2UmVzZXROZXh0VGFza1VuYmxvY2tUaW1lKCB2b2lkICk7CisKKyNpZiAoICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSAmJiAoIGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUyA+IDAgKSApCisKKwkvKgorCSAqIEhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHBhZCB0YXNrIG5hbWVzIHdpdGggc3BhY2VzIHdoZW4gcHJpbnRpbmcgb3V0CisJICogaHVtYW4gcmVhZGFibGUgdGFibGVzIG9mIHRhc2sgaW5mb3JtYXRpb24uCisJICovCisJc3RhdGljIGNoYXIgKnBydldyaXRlTmFtZVRvQnVmZmVyKCBjaGFyICpwY0J1ZmZlciwgY29uc3QgY2hhciAqcGNUYXNrTmFtZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKyNlbmRpZgorCisvKgorICogQ2FsbGVkIGFmdGVyIGEgVGFza190IHN0cnVjdHVyZSBoYXMgYmVlbiBhbGxvY2F0ZWQgZWl0aGVyIHN0YXRpY2FsbHkgb3IKKyAqIGR5bmFtaWNhbGx5IHRvIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSdzIG1lbWJlcnMuCisgKi8KK3N0YXRpYyB2b2lkIHBydkluaXRpYWxpc2VOZXdUYXNrKCAJVGFza0Z1bmN0aW9uX3QgcHhUYXNrQ29kZSwKKwkJCQkJCQkJCWNvbnN0IGNoYXIgKiBjb25zdCBwY05hbWUsIAkJLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisJCQkJCQkJCQljb25zdCB1aW50MzJfdCB1bFN0YWNrRGVwdGgsCisJCQkJCQkJCQl2b2lkICogY29uc3QgcHZQYXJhbWV0ZXJzLAorCQkJCQkJCQkJVUJhc2VUeXBlX3QgdXhQcmlvcml0eSwKKwkJCQkJCQkJCVRhc2tIYW5kbGVfdCAqIGNvbnN0IHB4Q3JlYXRlZFRhc2ssCisJCQkJCQkJCQlUQ0JfdCAqcHhOZXdUQ0IsCisJCQkJCQkJCQljb25zdCBNZW1vcnlSZWdpb25fdCAqIGNvbnN0IHhSZWdpb25zICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIENhbGxlZCBhZnRlciBhIG5ldyB0YXNrIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGluaXRpYWxpc2VkIHRvIHBsYWNlIHRoZSB0YXNrCisgKiB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgc2NoZWR1bGVyLgorICovCitzdGF0aWMgdm9pZCBwcnZBZGROZXdUYXNrVG9SZWFkeUxpc3QoIFRDQl90ICpweE5ld1RDQiApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBmcmVlcnRvc190YXNrc19jX2FkZGl0aW9uc19pbml0KCkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSB1c2VyIGRlZmluYWJsZQorICogbWFjcm8gRlJFRVJUT1NfVEFTS1NfQ19BRERJVElPTlNfSU5JVCgpIGlzIGRlZmluZWQsIGFzIHRoYXQgaXMgdGhlIG9ubHkgbWFjcm8KKyAqIGNhbGxlZCBieSB0aGUgZnVuY3Rpb24uCisgKi8KKyNpZmRlZiBGUkVFUlRPU19UQVNLU19DX0FERElUSU9OU19JTklUCisKKwlzdGF0aWMgdm9pZCBmcmVlcnRvc190YXNrc19jX2FkZGl0aW9uc19pbml0KCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisKKwlUYXNrSGFuZGxlX3QgeFRhc2tDcmVhdGVTdGF0aWMoCVRhc2tGdW5jdGlvbl90IHB4VGFza0NvZGUsCisJCQkJCQkJCQljb25zdCBjaGFyICogY29uc3QgcGNOYW1lLAkJLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisJCQkJCQkJCQljb25zdCB1aW50MzJfdCB1bFN0YWNrRGVwdGgsCisJCQkJCQkJCQl2b2lkICogY29uc3QgcHZQYXJhbWV0ZXJzLAorCQkJCQkJCQkJVUJhc2VUeXBlX3QgdXhQcmlvcml0eSwKKwkJCQkJCQkJCVN0YWNrVHlwZV90ICogY29uc3QgcHV4U3RhY2tCdWZmZXIsCisJCQkJCQkJCQlTdGF0aWNUYXNrX3QgKiBjb25zdCBweFRhc2tCdWZmZXIgKQorCXsKKwlUQ0JfdCAqcHhOZXdUQ0I7CisJVGFza0hhbmRsZV90IHhSZXR1cm47CisKKwkJY29uZmlnQVNTRVJUKCBwdXhTdGFja0J1ZmZlciAhPSBOVUxMICk7CisJCWNvbmZpZ0FTU0VSVCggcHhUYXNrQnVmZmVyICE9IE5VTEwgKTsKKworCQkjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQorCQl7CisJCQkvKiBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIHVzZWQgdG8gZGVjbGFyZSBhCisJCQl2YXJpYWJsZSBvZiB0eXBlIFN0YXRpY1Rhc2tfdCBlcXVhbHMgdGhlIHNpemUgb2YgdGhlIHJlYWwgdGFzaworCQkJc3RydWN0dXJlLiAqLworCQkJdm9sYXRpbGUgc2l6ZV90IHhTaXplID0gc2l6ZW9mKCBTdGF0aWNUYXNrX3QgKTsKKwkJCWNvbmZpZ0FTU0VSVCggeFNpemUgPT0gc2l6ZW9mKCBUQ0JfdCApICk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCisKKworCQlpZiggKCBweFRhc2tCdWZmZXIgIT0gTlVMTCApICYmICggcHV4U3RhY2tCdWZmZXIgIT0gTlVMTCApICkKKwkJeworCQkJLyogVGhlIG1lbW9yeSB1c2VkIGZvciB0aGUgdGFzaydzIFRDQiBhbmQgc3RhY2sgYXJlIHBhc3NlZCBpbnRvIHRoaXMKKwkJCWZ1bmN0aW9uIC0gdXNlIHRoZW0uICovCisJCQlweE5ld1RDQiA9ICggVENCX3QgKiApIHB4VGFza0J1ZmZlcjsgLypsaW50ICFlNzQwIFVudXN1YWwgY2FzdCBpcyBvayBhcyB0aGUgc3RydWN0dXJlcyBhcmUgZGVzaWduZWQgdG8gaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQsIGFuZCB0aGUgc2l6ZSBpcyBjaGVja2VkIGJ5IGFuIGFzc2VydC4gKi8KKwkJCXB4TmV3VENCLT5weFN0YWNrID0gKCBTdGFja1R5cGVfdCAqICkgcHV4U3RhY2tCdWZmZXI7CisKKwkJCSNpZiggdHNrU1RBVElDX0FORF9EWU5BTUlDX0FMTE9DQVRJT05fUE9TU0lCTEUgIT0gMCApIC8qbGludCAhZTczMSBNYWNybyBoYXMgYmVlbiBjb25zb2xpZGF0ZWQgZm9yIHJlYWRhYmlsaXR5IHJlYXNvbnMuICovCisJCQl7CisJCQkJLyogVGFza3MgY2FuIGJlIGNyZWF0ZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgc28gbm90ZSB0aGlzCisJCQkJdGFzayB3YXMgY3JlYXRlZCBzdGF0aWNhbGx5IGluIGNhc2UgdGhlIHRhc2sgaXMgbGF0ZXIgZGVsZXRlZC4gKi8KKwkJCQlweE5ld1RDQi0+dWNTdGF0aWNhbGx5QWxsb2NhdGVkID0gdHNrU1RBVElDQUxMWV9BTExPQ0FURURfU1RBQ0tfQU5EX1RDQjsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworCisJCQlwcnZJbml0aWFsaXNlTmV3VGFzayggcHhUYXNrQ29kZSwgcGNOYW1lLCB1bFN0YWNrRGVwdGgsIHB2UGFyYW1ldGVycywgdXhQcmlvcml0eSwgJnhSZXR1cm4sIHB4TmV3VENCLCBOVUxMICk7CisJCQlwcnZBZGROZXdUYXNrVG9SZWFkeUxpc3QoIHB4TmV3VENCICk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4UmV0dXJuID0gTlVMTDsKKwkJfQorCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIFNVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggcG9ydFVTSU5HX01QVV9XUkFQUEVSUyA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSApCisKKwlCYXNlVHlwZV90IHhUYXNrQ3JlYXRlUmVzdHJpY3RlZFN0YXRpYyggY29uc3QgVGFza1BhcmFtZXRlcnNfdCAqIGNvbnN0IHB4VGFza0RlZmluaXRpb24sIFRhc2tIYW5kbGVfdCAqcHhDcmVhdGVkVGFzayApCisJeworCVRDQl90ICpweE5ld1RDQjsKKwlCYXNlVHlwZV90IHhSZXR1cm4gPSBlcnJDT1VMRF9OT1RfQUxMT0NBVEVfUkVRVUlSRURfTUVNT1JZOworCisJCWNvbmZpZ0FTU0VSVCggcHhUYXNrRGVmaW5pdGlvbi0+cHV4U3RhY2tCdWZmZXIgIT0gTlVMTCApOworCQljb25maWdBU1NFUlQoIHB4VGFza0RlZmluaXRpb24tPnB4VGFza0J1ZmZlciAhPSBOVUxMICk7CisKKwkJaWYoICggcHhUYXNrRGVmaW5pdGlvbi0+cHV4U3RhY2tCdWZmZXIgIT0gTlVMTCApICYmICggcHhUYXNrRGVmaW5pdGlvbi0+cHhUYXNrQnVmZmVyICE9IE5VTEwgKSApCisJCXsKKwkJCS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgVENCLiAgV2hlcmUgdGhlIG1lbW9yeSBjb21lcyBmcm9tIGRlcGVuZHMKKwkJCW9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcG9ydCBtYWxsb2MgZnVuY3Rpb24gYW5kIHdoZXRoZXIgb3IKKwkJCW5vdCBzdGF0aWMgYWxsb2NhdGlvbiBpcyBiZWluZyB1c2VkLiAqLworCQkJcHhOZXdUQ0IgPSAoIFRDQl90ICogKSBweFRhc2tEZWZpbml0aW9uLT5weFRhc2tCdWZmZXI7CisKKwkJCS8qIFN0b3JlIHRoZSBzdGFjayBsb2NhdGlvbiBpbiB0aGUgVENCLiAqLworCQkJcHhOZXdUQ0ItPnB4U3RhY2sgPSBweFRhc2tEZWZpbml0aW9uLT5wdXhTdGFja0J1ZmZlcjsKKworCQkJI2lmKCB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRSAhPSAwICkKKwkJCXsKKwkJCQkvKiBUYXNrcyBjYW4gYmUgY3JlYXRlZCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBzbyBub3RlIHRoaXMKKwkJCQl0YXNrIHdhcyBjcmVhdGVkIHN0YXRpY2FsbHkgaW4gY2FzZSB0aGUgdGFzayBpcyBsYXRlciBkZWxldGVkLiAqLworCQkJCXB4TmV3VENCLT51Y1N0YXRpY2FsbHlBbGxvY2F0ZWQgPSB0c2tTVEFUSUNBTExZX0FMTE9DQVRFRF9TVEFDS19BTkRfVENCOworCQkJfQorCQkJI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OICovCisKKwkJCXBydkluaXRpYWxpc2VOZXdUYXNrKAlweFRhc2tEZWZpbml0aW9uLT5wdlRhc2tDb2RlLAorCQkJCQkJCQkJcHhUYXNrRGVmaW5pdGlvbi0+cGNOYW1lLAorCQkJCQkJCQkJKCB1aW50MzJfdCApIHB4VGFza0RlZmluaXRpb24tPnVzU3RhY2tEZXB0aCwKKwkJCQkJCQkJCXB4VGFza0RlZmluaXRpb24tPnB2UGFyYW1ldGVycywKKwkJCQkJCQkJCXB4VGFza0RlZmluaXRpb24tPnV4UHJpb3JpdHksCisJCQkJCQkJCQlweENyZWF0ZWRUYXNrLCBweE5ld1RDQiwKKwkJCQkJCQkJCXB4VGFza0RlZmluaXRpb24tPnhSZWdpb25zICk7CisKKwkJCXBydkFkZE5ld1Rhc2tUb1JlYWR5TGlzdCggcHhOZXdUQ0IgKTsKKwkJCXhSZXR1cm4gPSBwZFBBU1M7CisJCX0KKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiAoIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoICggcG9ydFVTSU5HX01QVV9XUkFQUEVSUyA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCisJQmFzZVR5cGVfdCB4VGFza0NyZWF0ZVJlc3RyaWN0ZWQoIGNvbnN0IFRhc2tQYXJhbWV0ZXJzX3QgKiBjb25zdCBweFRhc2tEZWZpbml0aW9uLCBUYXNrSGFuZGxlX3QgKnB4Q3JlYXRlZFRhc2sgKQorCXsKKwlUQ0JfdCAqcHhOZXdUQ0I7CisJQmFzZVR5cGVfdCB4UmV0dXJuID0gZXJyQ09VTERfTk9UX0FMTE9DQVRFX1JFUVVJUkVEX01FTU9SWTsKKworCQljb25maWdBU1NFUlQoIHB4VGFza0RlZmluaXRpb24tPnB1eFN0YWNrQnVmZmVyICk7CisKKwkJaWYoIHB4VGFza0RlZmluaXRpb24tPnB1eFN0YWNrQnVmZmVyICE9IE5VTEwgKQorCQl7CisJCQkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIFRDQi4gIFdoZXJlIHRoZSBtZW1vcnkgY29tZXMgZnJvbSBkZXBlbmRzCisJCQlvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBvcnQgbWFsbG9jIGZ1bmN0aW9uIGFuZCB3aGV0aGVyIG9yCisJCQlub3Qgc3RhdGljIGFsbG9jYXRpb24gaXMgYmVpbmcgdXNlZC4gKi8KKwkJCXB4TmV3VENCID0gKCBUQ0JfdCAqICkgcHZQb3J0TWFsbG9jKCBzaXplb2YoIFRDQl90ICkgKTsKKworCQkJaWYoIHB4TmV3VENCICE9IE5VTEwgKQorCQkJeworCQkJCS8qIFN0b3JlIHRoZSBzdGFjayBsb2NhdGlvbiBpbiB0aGUgVENCLiAqLworCQkJCXB4TmV3VENCLT5weFN0YWNrID0gcHhUYXNrRGVmaW5pdGlvbi0+cHV4U3RhY2tCdWZmZXI7CisKKwkJCQkjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisJCQkJeworCQkJCQkvKiBUYXNrcyBjYW4gYmUgY3JlYXRlZCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBzbyBub3RlCisJCQkJCXRoaXMgdGFzayBoYWQgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzdGFjayBpbiBjYXNlIGl0IGlzCisJCQkJCWxhdGVyIGRlbGV0ZWQuICBUaGUgVENCIHdhcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuICovCisJCQkJCXB4TmV3VENCLT51Y1N0YXRpY2FsbHlBbGxvY2F0ZWQgPSB0c2tTVEFUSUNBTExZX0FMTE9DQVRFRF9TVEFDS19PTkxZOworCQkJCX0KKwkJCQkjZW5kaWYKKworCQkJCXBydkluaXRpYWxpc2VOZXdUYXNrKAlweFRhc2tEZWZpbml0aW9uLT5wdlRhc2tDb2RlLAorCQkJCQkJCQkJCXB4VGFza0RlZmluaXRpb24tPnBjTmFtZSwKKwkJCQkJCQkJCQkoIHVpbnQzMl90ICkgcHhUYXNrRGVmaW5pdGlvbi0+dXNTdGFja0RlcHRoLAorCQkJCQkJCQkJCXB4VGFza0RlZmluaXRpb24tPnB2UGFyYW1ldGVycywKKwkJCQkJCQkJCQlweFRhc2tEZWZpbml0aW9uLT51eFByaW9yaXR5LAorCQkJCQkJCQkJCXB4Q3JlYXRlZFRhc2ssIHB4TmV3VENCLAorCQkJCQkJCQkJCXB4VGFza0RlZmluaXRpb24tPnhSZWdpb25zICk7CisKKwkJCQlwcnZBZGROZXdUYXNrVG9SZWFkeUxpc3QoIHB4TmV3VENCICk7CisJCQkJeFJldHVybiA9IHBkUEFTUzsKKwkJCX0KKwkJfQorCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCisJQmFzZVR5cGVfdCB4VGFza0NyZWF0ZSgJVGFza0Z1bmN0aW9uX3QgcHhUYXNrQ29kZSwKKwkJCQkJCQljb25zdCBjaGFyICogY29uc3QgcGNOYW1lLAkJLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisJCQkJCQkJY29uc3QgY29uZmlnU1RBQ0tfREVQVEhfVFlQRSB1c1N0YWNrRGVwdGgsCisJCQkJCQkJdm9pZCAqIGNvbnN0IHB2UGFyYW1ldGVycywKKwkJCQkJCQlVQmFzZVR5cGVfdCB1eFByaW9yaXR5LAorCQkJCQkJCVRhc2tIYW5kbGVfdCAqIGNvbnN0IHB4Q3JlYXRlZFRhc2sgKQorCXsKKwlUQ0JfdCAqcHhOZXdUQ0I7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCisJCS8qIElmIHRoZSBzdGFjayBncm93cyBkb3duIHRoZW4gYWxsb2NhdGUgdGhlIHN0YWNrIHRoZW4gdGhlIFRDQiBzbyB0aGUgc3RhY2sKKwkJZG9lcyBub3QgZ3JvdyBpbnRvIHRoZSBUQ0IuICBMaWtld2lzZSBpZiB0aGUgc3RhY2sgZ3Jvd3MgdXAgdGhlbiBhbGxvY2F0ZQorCQl0aGUgVENCIHRoZW4gdGhlIHN0YWNrLiAqLworCQkjaWYoIHBvcnRTVEFDS19HUk9XVEggPiAwICkKKwkJeworCQkJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBUQ0IuICBXaGVyZSB0aGUgbWVtb3J5IGNvbWVzIGZyb20gZGVwZW5kcyBvbgorCQkJdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwb3J0IG1hbGxvYyBmdW5jdGlvbiBhbmQgd2hldGhlciBvciBub3Qgc3RhdGljCisJCQlhbGxvY2F0aW9uIGlzIGJlaW5nIHVzZWQuICovCisJCQlweE5ld1RDQiA9ICggVENCX3QgKiApIHB2UG9ydE1hbGxvYyggc2l6ZW9mKCBUQ0JfdCApICk7CisKKwkJCWlmKCBweE5ld1RDQiAhPSBOVUxMICkKKwkJCXsKKwkJCQkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHN0YWNrIHVzZWQgYnkgdGhlIHRhc2sgYmVpbmcgY3JlYXRlZC4KKwkJCQlUaGUgYmFzZSBvZiB0aGUgc3RhY2sgbWVtb3J5IHN0b3JlZCBpbiB0aGUgVENCIHNvIHRoZSB0YXNrIGNhbgorCQkJCWJlIGRlbGV0ZWQgbGF0ZXIgaWYgcmVxdWlyZWQuICovCisJCQkJcHhOZXdUQ0ItPnB4U3RhY2sgPSAoIFN0YWNrVHlwZV90ICogKSBwdlBvcnRNYWxsb2MoICggKCAoIHNpemVfdCApIHVzU3RhY2tEZXB0aCApICogc2l6ZW9mKCBTdGFja1R5cGVfdCApICkgKTsgLypsaW50ICFlOTYxIE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBvcnRzLiAqLworCisJCQkJaWYoIHB4TmV3VENCLT5weFN0YWNrID09IE5VTEwgKQorCQkJCXsKKwkJCQkJLyogQ291bGQgbm90IGFsbG9jYXRlIHRoZSBzdGFjay4gIERlbGV0ZSB0aGUgYWxsb2NhdGVkIFRDQi4gKi8KKwkJCQkJdlBvcnRGcmVlKCBweE5ld1RDQiApOworCQkJCQlweE5ld1RDQiA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJCSNlbHNlIC8qIHBvcnRTVEFDS19HUk9XVEggKi8KKwkJeworCQlTdGFja1R5cGVfdCAqcHhTdGFjazsKKworCQkJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdGFjayB1c2VkIGJ5IHRoZSB0YXNrIGJlaW5nIGNyZWF0ZWQuICovCisJCQlweFN0YWNrID0gKCBTdGFja1R5cGVfdCAqICkgcHZQb3J0TWFsbG9jKCAoICggKCBzaXplX3QgKSB1c1N0YWNrRGVwdGggKSAqIHNpemVvZiggU3RhY2tUeXBlX3QgKSApICk7IC8qbGludCAhZTk2MSBNSVNSQSBleGNlcHRpb24gYXMgdGhlIGNhc3RzIGFyZSBvbmx5IHJlZHVuZGFudCBmb3Igc29tZSBwb3J0cy4gKi8KKworCQkJaWYoIHB4U3RhY2sgIT0gTlVMTCApCisJCQl7CisJCQkJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBUQ0IuICovCisJCQkJcHhOZXdUQ0IgPSAoIFRDQl90ICogKSBwdlBvcnRNYWxsb2MoIHNpemVvZiggVENCX3QgKSApOyAvKmxpbnQgIWU5NjEgTUlTUkEgZXhjZXB0aW9uIGFzIHRoZSBjYXN0cyBhcmUgb25seSByZWR1bmRhbnQgZm9yIHNvbWUgcGF0aHMuICovCisKKwkJCQlpZiggcHhOZXdUQ0IgIT0gTlVMTCApCisJCQkJeworCQkJCQkvKiBTdG9yZSB0aGUgc3RhY2sgbG9jYXRpb24gaW4gdGhlIFRDQi4gKi8KKwkJCQkJcHhOZXdUQ0ItPnB4U3RhY2sgPSBweFN0YWNrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBUaGUgc3RhY2sgY2Fubm90IGJlIHVzZWQgYXMgdGhlIFRDQiB3YXMgbm90IGNyZWF0ZWQuICBGcmVlCisJCQkJCWl0IGFnYWluLiAqLworCQkJCQl2UG9ydEZyZWUoIHB4U3RhY2sgKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHhOZXdUQ0IgPSBOVUxMOworCQkJfQorCQl9CisJCSNlbmRpZiAvKiBwb3J0U1RBQ0tfR1JPV1RIICovCisKKwkJaWYoIHB4TmV3VENCICE9IE5VTEwgKQorCQl7CisJCQkjaWYoIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICE9IDAgKSAvKmxpbnQgIWU3MzEgTWFjcm8gaGFzIGJlZW4gY29uc29saWRhdGVkIGZvciByZWFkYWJpbGl0eSByZWFzb25zLiAqLworCQkJeworCQkJCS8qIFRhc2tzIGNhbiBiZSBjcmVhdGVkIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIHNvIG5vdGUgdGhpcworCQkJCXRhc2sgd2FzIGNyZWF0ZWQgZHluYW1pY2FsbHkgaW4gY2FzZSBpdCBpcyBsYXRlciBkZWxldGVkLiAqLworCQkJCXB4TmV3VENCLT51Y1N0YXRpY2FsbHlBbGxvY2F0ZWQgPSB0c2tEWU5BTUlDQUxMWV9BTExPQ0FURURfU1RBQ0tfQU5EX1RDQjsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OICovCisKKwkJCXBydkluaXRpYWxpc2VOZXdUYXNrKCBweFRhc2tDb2RlLCBwY05hbWUsICggdWludDMyX3QgKSB1c1N0YWNrRGVwdGgsIHB2UGFyYW1ldGVycywgdXhQcmlvcml0eSwgcHhDcmVhdGVkVGFzaywgcHhOZXdUQ0IsIE5VTEwgKTsKKwkJCXBydkFkZE5ld1Rhc2tUb1JlYWR5TGlzdCggcHhOZXdUQ0IgKTsKKwkJCXhSZXR1cm4gPSBwZFBBU1M7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4UmV0dXJuID0gZXJyQ09VTERfTk9UX0FMTE9DQVRFX1JFUVVJUkVEX01FTU9SWTsKKwkJfQorCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2SW5pdGlhbGlzZU5ld1Rhc2soIAlUYXNrRnVuY3Rpb25fdCBweFRhc2tDb2RlLAorCQkJCQkJCQkJY29uc3QgY2hhciAqIGNvbnN0IHBjTmFtZSwJCS8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworCQkJCQkJCQkJY29uc3QgdWludDMyX3QgdWxTdGFja0RlcHRoLAorCQkJCQkJCQkJdm9pZCAqIGNvbnN0IHB2UGFyYW1ldGVycywKKwkJCQkJCQkJCVVCYXNlVHlwZV90IHV4UHJpb3JpdHksCisJCQkJCQkJCQlUYXNrSGFuZGxlX3QgKiBjb25zdCBweENyZWF0ZWRUYXNrLAorCQkJCQkJCQkJVENCX3QgKnB4TmV3VENCLAorCQkJCQkJCQkJY29uc3QgTWVtb3J5UmVnaW9uX3QgKiBjb25zdCB4UmVnaW9ucyApCit7CitTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrOworVUJhc2VUeXBlX3QgeDsKKworCSNpZiggcG9ydFVTSU5HX01QVV9XUkFQUEVSUyA9PSAxICkKKwkJLyogU2hvdWxkIHRoZSB0YXNrIGJlIGNyZWF0ZWQgaW4gcHJpdmlsZWdlZCBtb2RlPyAqLworCQlCYXNlVHlwZV90IHhSdW5Qcml2aWxlZ2VkOworCQlpZiggKCB1eFByaW9yaXR5ICYgcG9ydFBSSVZJTEVHRV9CSVQgKSAhPSAwVSApCisJCXsKKwkJCXhSdW5Qcml2aWxlZ2VkID0gcGRUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJeFJ1blByaXZpbGVnZWQgPSBwZEZBTFNFOworCQl9CisJCXV4UHJpb3JpdHkgJj0gfnBvcnRQUklWSUxFR0VfQklUOworCSNlbmRpZiAvKiBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDEgKi8KKworCS8qIEF2b2lkIGRlcGVuZGVuY3kgb24gbWVtc2V0KCkgaWYgaXQgaXMgbm90IHJlcXVpcmVkLiAqLworCSNpZiggdHNrU0VUX05FV19TVEFDS1NfVE9fS05PV05fVkFMVUUgPT0gMSApCisJeworCQkvKiBGaWxsIHRoZSBzdGFjayB3aXRoIGEga25vd24gdmFsdWUgdG8gYXNzaXN0IGRlYnVnZ2luZy4gKi8KKwkJKCB2b2lkICkgbWVtc2V0KCBweE5ld1RDQi0+cHhTdGFjaywgKCBpbnQgKSB0c2tTVEFDS19GSUxMX0JZVEUsICggc2l6ZV90ICkgdWxTdGFja0RlcHRoICogc2l6ZW9mKCBTdGFja1R5cGVfdCApICk7CisJfQorCSNlbmRpZiAvKiB0c2tTRVRfTkVXX1NUQUNLU19UT19LTk9XTl9WQUxVRSAqLworCisJLyogQ2FsY3VsYXRlIHRoZSB0b3Agb2Ygc3RhY2sgYWRkcmVzcy4gIFRoaXMgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBzdGFjaworCWdyb3dzIGZyb20gaGlnaCBtZW1vcnkgdG8gbG93IChhcyBwZXIgdGhlIDgweDg2KSBvciB2aWNlIHZlcnNhLgorCXBvcnRTVEFDS19HUk9XVEggaXMgdXNlZCB0byBtYWtlIHRoZSByZXN1bHQgcG9zaXRpdmUgb3IgbmVnYXRpdmUgYXMgcmVxdWlyZWQKKwlieSB0aGUgcG9ydC4gKi8KKwkjaWYoIHBvcnRTVEFDS19HUk9XVEggPCAwICkKKwl7CisJCXB4VG9wT2ZTdGFjayA9IHB4TmV3VENCLT5weFN0YWNrICsgKCB1bFN0YWNrRGVwdGggLSAoIHVpbnQzMl90ICkgMSApOworCQlweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICogKSAoICggKCBwb3J0UE9JTlRFUl9TSVpFX1RZUEUgKSBweFRvcE9mU3RhY2sgKSAmICggfiggKCBwb3J0UE9JTlRFUl9TSVpFX1RZUEUgKSBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICkgKTsgLypsaW50ICFlOTIzIE1JU1JBIGV4Y2VwdGlvbi4gIEF2b2lkaW5nIGNhc3RzIGJldHdlZW4gcG9pbnRlcnMgYW5kIGludGVnZXJzIGlzIG5vdCBwcmFjdGljYWwuICBTaXplIGRpZmZlcmVuY2VzIGFjY291bnRlZCBmb3IgdXNpbmcgcG9ydFBPSU5URVJfU0laRV9UWVBFIHR5cGUuICovCisKKwkJLyogQ2hlY2sgdGhlIGFsaWdubWVudCBvZiB0aGUgY2FsY3VsYXRlZCB0b3Agb2Ygc3RhY2sgaXMgY29ycmVjdC4gKi8KKwkJY29uZmlnQVNTRVJUKCAoICggKCBwb3J0UE9JTlRFUl9TSVpFX1RZUEUgKSBweFRvcE9mU3RhY2sgJiAoIHBvcnRQT0lOVEVSX1NJWkVfVFlQRSApIHBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgPT0gMFVMICkgKTsKKworCQkjaWYoIGNvbmZpZ1JFQ09SRF9TVEFDS19ISUdIX0FERFJFU1MgPT0gMSApCisJCXsKKwkJCS8qIEFsc28gcmVjb3JkIHRoZSBzdGFjaydzIGhpZ2ggYWRkcmVzcywgd2hpY2ggbWF5IGFzc2lzdAorCQkJZGVidWdnaW5nLiAqLworCQkJcHhOZXdUQ0ItPnB4RW5kT2ZTdGFjayA9IHB4VG9wT2ZTdGFjazsKKwkJfQorCQkjZW5kaWYgLyogY29uZmlnUkVDT1JEX1NUQUNLX0hJR0hfQUREUkVTUyAqLworCX0KKwkjZWxzZSAvKiBwb3J0U1RBQ0tfR1JPV1RIICovCisJeworCQlweFRvcE9mU3RhY2sgPSBweE5ld1RDQi0+cHhTdGFjazsKKworCQkvKiBDaGVjayB0aGUgYWxpZ25tZW50IG9mIHRoZSBzdGFjayBidWZmZXIgaXMgY29ycmVjdC4gKi8KKwkJY29uZmlnQVNTRVJUKCAoICggKCBwb3J0UE9JTlRFUl9TSVpFX1RZUEUgKSBweE5ld1RDQi0+cHhTdGFjayAmICggcG9ydFBPSU5URVJfU0laRV9UWVBFICkgcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSA9PSAwVUwgKSApOworCisJCS8qIFRoZSBvdGhlciBleHRyZW1lIG9mIHRoZSBzdGFjayBzcGFjZSBpcyByZXF1aXJlZCBpZiBzdGFjayBjaGVja2luZyBpcworCQlwZXJmb3JtZWQuICovCisJCXB4TmV3VENCLT5weEVuZE9mU3RhY2sgPSBweE5ld1RDQi0+cHhTdGFjayArICggdWxTdGFja0RlcHRoIC0gKCB1aW50MzJfdCApIDEgKTsKKwl9CisJI2VuZGlmIC8qIHBvcnRTVEFDS19HUk9XVEggKi8KKworCS8qIFN0b3JlIHRoZSB0YXNrIG5hbWUgaW4gdGhlIFRDQi4gKi8KKwlmb3IoIHggPSAoIFVCYXNlVHlwZV90ICkgMDsgeCA8ICggVUJhc2VUeXBlX3QgKSBjb25maWdNQVhfVEFTS19OQU1FX0xFTjsgeCsrICkKKwl7CisJCXB4TmV3VENCLT5wY1Rhc2tOYW1lWyB4IF0gPSBwY05hbWVbIHggXTsKKworCQkvKiBEb24ndCBjb3B5IGFsbCBjb25maWdNQVhfVEFTS19OQU1FX0xFTiBpZiB0aGUgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbgorCQljb25maWdNQVhfVEFTS19OQU1FX0xFTiBjaGFyYWN0ZXJzIGp1c3QgaW4gY2FzZSB0aGUgbWVtb3J5IGFmdGVyIHRoZQorCQlzdHJpbmcgaXMgbm90IGFjY2Vzc2libGUgKGV4dHJlbWVseSB1bmxpa2VseSkuICovCisJCWlmKCBwY05hbWVbIHggXSA9PSAweDAwICkKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisKKwkvKiBFbnN1cmUgdGhlIG5hbWUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgc3RyaW5nIGxlbmd0aAorCXdhcyBncmVhdGVyIG9yIGVxdWFsIHRvIGNvbmZpZ01BWF9UQVNLX05BTUVfTEVOLiAqLworCXB4TmV3VENCLT5wY1Rhc2tOYW1lWyBjb25maWdNQVhfVEFTS19OQU1FX0xFTiAtIDEgXSA9ICdcMCc7CisKKwkvKiBUaGlzIGlzIHVzZWQgYXMgYW4gYXJyYXkgaW5kZXggc28gbXVzdCBlbnN1cmUgaXQncyBub3QgdG9vIGxhcmdlLiAgRmlyc3QKKwlyZW1vdmUgdGhlIHByaXZpbGVnZSBiaXQgaWYgb25lIGlzIHByZXNlbnQuICovCisJaWYoIHV4UHJpb3JpdHkgPj0gKCBVQmFzZVR5cGVfdCApIGNvbmZpZ01BWF9QUklPUklUSUVTICkKKwl7CisJCXV4UHJpb3JpdHkgPSAoIFVCYXNlVHlwZV90ICkgY29uZmlnTUFYX1BSSU9SSVRJRVMgLSAoIFVCYXNlVHlwZV90ICkgMVU7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwlweE5ld1RDQi0+dXhQcmlvcml0eSA9IHV4UHJpb3JpdHk7CisJI2lmICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCisJeworCQlweE5ld1RDQi0+dXhCYXNlUHJpb3JpdHkgPSB1eFByaW9yaXR5OworCQlweE5ld1RDQi0+dXhNdXRleGVzSGVsZCA9IDA7CisJfQorCSNlbmRpZiAvKiBjb25maWdVU0VfTVVURVhFUyAqLworCisJdkxpc3RJbml0aWFsaXNlSXRlbSggJiggcHhOZXdUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKTsKKwl2TGlzdEluaXRpYWxpc2VJdGVtKCAmKCBweE5ld1RDQi0+eEV2ZW50TGlzdEl0ZW0gKSApOworCisJLyogU2V0IHRoZSBweE5ld1RDQiBhcyBhIGxpbmsgYmFjayBmcm9tIHRoZSBMaXN0SXRlbV90LiAgVGhpcyBpcyBzbyB3ZSBjYW4gZ2V0CisJYmFjayB0bwl0aGUgY29udGFpbmluZyBUQ0IgZnJvbSBhIGdlbmVyaWMgaXRlbSBpbiBhIGxpc3QuICovCisJbGlzdFNFVF9MSVNUX0lURU1fT1dORVIoICYoIHB4TmV3VENCLT54U3RhdGVMaXN0SXRlbSApLCBweE5ld1RDQiApOworCisJLyogRXZlbnQgbGlzdHMgYXJlIGFsd2F5cyBpbiBwcmlvcml0eSBvcmRlci4gKi8KKwlsaXN0U0VUX0xJU1RfSVRFTV9WQUxVRSggJiggcHhOZXdUQ0ItPnhFdmVudExpc3RJdGVtICksICggVGlja1R5cGVfdCApIGNvbmZpZ01BWF9QUklPUklUSUVTIC0gKCBUaWNrVHlwZV90ICkgdXhQcmlvcml0eSApOyAvKmxpbnQgIWU5NjEgTUlTUkEgZXhjZXB0aW9uIGFzIHRoZSBjYXN0cyBhcmUgb25seSByZWR1bmRhbnQgZm9yIHNvbWUgcG9ydHMuICovCisJbGlzdFNFVF9MSVNUX0lURU1fT1dORVIoICYoIHB4TmV3VENCLT54RXZlbnRMaXN0SXRlbSApLCBweE5ld1RDQiApOworCisJI2lmICggcG9ydENSSVRJQ0FMX05FU1RJTkdfSU5fVENCID09IDEgKQorCXsKKwkJcHhOZXdUQ0ItPnV4Q3JpdGljYWxOZXN0aW5nID0gKCBVQmFzZVR5cGVfdCApIDBVOworCX0KKwkjZW5kaWYgLyogcG9ydENSSVRJQ0FMX05FU1RJTkdfSU5fVENCICovCisKKwkjaWYgKCBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgPT0gMSApCisJeworCQlweE5ld1RDQi0+cHhUYXNrVGFnID0gTlVMTDsKKwl9CisJI2VuZGlmIC8qIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyAqLworCisJI2lmICggY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgPT0gMSApCisJeworCQlweE5ld1RDQi0+dWxSdW5UaW1lQ291bnRlciA9IDBVTDsKKwl9CisJI2VuZGlmIC8qIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTICovCisKKwkjaWYgKCBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDEgKQorCXsKKwkJdlBvcnRTdG9yZVRhc2tNUFVTZXR0aW5ncyggJiggcHhOZXdUQ0ItPnhNUFVTZXR0aW5ncyApLCB4UmVnaW9ucywgcHhOZXdUQ0ItPnB4U3RhY2ssIHVsU3RhY2tEZXB0aCApOworCX0KKwkjZWxzZQorCXsKKwkJLyogQXZvaWQgY29tcGlsZXIgd2FybmluZyBhYm91dCB1bnJlZmVyZW5jZWQgcGFyYW1ldGVyLiAqLworCQkoIHZvaWQgKSB4UmVnaW9uczsKKwl9CisJI2VuZGlmCisKKwkjaWYoIGNvbmZpZ05VTV9USFJFQURfTE9DQUxfU1RPUkFHRV9QT0lOVEVSUyAhPSAwICkKKwl7CisJCWZvciggeCA9IDA7IHggPCAoIFVCYXNlVHlwZV90ICkgY29uZmlnTlVNX1RIUkVBRF9MT0NBTF9TVE9SQUdFX1BPSU5URVJTOyB4KysgKQorCQl7CisJCQlweE5ld1RDQi0+cHZUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyc1sgeCBdID0gTlVMTDsKKwkJfQorCX0KKwkjZW5kaWYKKworCSNpZiAoIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgPT0gMSApCisJeworCQlweE5ld1RDQi0+dWxOb3RpZmllZFZhbHVlID0gMDsKKwkJcHhOZXdUQ0ItPnVjTm90aWZ5U3RhdGUgPSB0YXNrTk9UX1dBSVRJTkdfTk9USUZJQ0FUSU9OOworCX0KKwkjZW5kaWYKKworCSNpZiAoIGNvbmZpZ1VTRV9ORVdMSUJfUkVFTlRSQU5UID09IDEgKQorCXsKKwkJLyogSW5pdGlhbGlzZSB0aGlzIHRhc2sncyBOZXdsaWIgcmVlbnQgc3RydWN0dXJlLiAqLworCQlfUkVFTlRfSU5JVF9QVFIoICggJiggcHhOZXdUQ0ItPnhOZXdMaWJfcmVlbnQgKSApICk7CisJfQorCSNlbmRpZgorCisJI2lmKCBJTkNMVURFX3hUYXNrQWJvcnREZWxheSA9PSAxICkKKwl7CisJCXB4TmV3VENCLT51Y0RlbGF5QWJvcnRlZCA9IHBkRkFMU0U7CisJfQorCSNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSB0aGUgVENCIHN0YWNrIHRvIGxvb2sgYXMgaWYgdGhlIHRhc2sgd2FzIGFscmVhZHkgcnVubmluZywKKwlidXQgaGFkIGJlZW4gaW50ZXJydXB0ZWQgYnkgdGhlIHNjaGVkdWxlci4gIFRoZSByZXR1cm4gYWRkcmVzcyBpcyBzZXQKKwl0byB0aGUgc3RhcnQgb2YgdGhlIHRhc2sgZnVuY3Rpb24uIE9uY2UgdGhlIHN0YWNrIGhhcyBiZWVuIGluaXRpYWxpc2VkCisJdGhlIHRvcCBvZiBzdGFjayB2YXJpYWJsZSBpcyB1cGRhdGVkLiAqLworCSNpZiggcG9ydFVTSU5HX01QVV9XUkFQUEVSUyA9PSAxICkKKwl7CisJCXB4TmV3VENCLT5weFRvcE9mU3RhY2sgPSBweFBvcnRJbml0aWFsaXNlU3RhY2soIHB4VG9wT2ZTdGFjaywgcHhUYXNrQ29kZSwgcHZQYXJhbWV0ZXJzLCB4UnVuUHJpdmlsZWdlZCApOworCX0KKwkjZWxzZSAvKiBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTICovCisJeworCQlweE5ld1RDQi0+cHhUb3BPZlN0YWNrID0gcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBweFRvcE9mU3RhY2ssIHB4VGFza0NvZGUsIHB2UGFyYW1ldGVycyApOworCX0KKwkjZW5kaWYgLyogcG9ydFVTSU5HX01QVV9XUkFQUEVSUyAqLworCisJaWYoICggdm9pZCAqICkgcHhDcmVhdGVkVGFzayAhPSBOVUxMICkKKwl7CisJCS8qIFBhc3MgdGhlIGhhbmRsZSBvdXQgaW4gYW4gYW5vbnltb3VzIHdheS4gIFRoZSBoYW5kbGUgY2FuIGJlIHVzZWQgdG8KKwkJY2hhbmdlIHRoZSBjcmVhdGVkIHRhc2sncyBwcmlvcml0eSwgZGVsZXRlIHRoZSBjcmVhdGVkIHRhc2ssIGV0Yy4qLworCQkqcHhDcmVhdGVkVGFzayA9ICggVGFza0hhbmRsZV90ICkgcHhOZXdUQ0I7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2QWRkTmV3VGFza1RvUmVhZHlMaXN0KCBUQ0JfdCAqcHhOZXdUQ0IgKQoreworCS8qIEVuc3VyZSBpbnRlcnJ1cHRzIGRvbid0IGFjY2VzcyB0aGUgdGFzayBsaXN0cyB3aGlsZSB0aGUgbGlzdHMgYXJlIGJlaW5nCisJdXBkYXRlZC4gKi8KKwl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwl7CisJCXV4Q3VycmVudE51bWJlck9mVGFza3MrKzsKKwkJaWYoIHB4Q3VycmVudFRDQiA9PSBOVUxMICkKKwkJeworCQkJLyogVGhlcmUgYXJlIG5vIG90aGVyIHRhc2tzLCBvciBhbGwgdGhlIG90aGVyIHRhc2tzIGFyZSBpbgorCQkJdGhlIHN1c3BlbmRlZCBzdGF0ZSAtIG1ha2UgdGhpcyB0aGUgY3VycmVudCB0YXNrLiAqLworCQkJcHhDdXJyZW50VENCID0gcHhOZXdUQ0I7CisKKwkJCWlmKCB1eEN1cnJlbnROdW1iZXJPZlRhc2tzID09ICggVUJhc2VUeXBlX3QgKSAxICkKKwkJCXsKKwkJCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCB0YXNrIHRvIGJlIGNyZWF0ZWQgc28gZG8gdGhlIHByZWxpbWluYXJ5CisJCQkJaW5pdGlhbGlzYXRpb24gcmVxdWlyZWQuICBXZSB3aWxsIG5vdCByZWNvdmVyIGlmIHRoaXMgY2FsbAorCQkJCWZhaWxzLCBidXQgd2Ugd2lsbCByZXBvcnQgdGhlIGZhaWx1cmUuICovCisJCQkJcHJ2SW5pdGlhbGlzZVRhc2tMaXN0cygpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIElmIHRoZSBzY2hlZHVsZXIgaXMgbm90IGFscmVhZHkgcnVubmluZywgbWFrZSB0aGlzIHRhc2sgdGhlCisJCQljdXJyZW50IHRhc2sgaWYgaXQgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdGFzayB0byBiZSBjcmVhdGVkCisJCQlzbyBmYXIuICovCisJCQlpZiggeFNjaGVkdWxlclJ1bm5pbmcgPT0gcGRGQUxTRSApCisJCQl7CisJCQkJaWYoIHB4Q3VycmVudFRDQi0+dXhQcmlvcml0eSA8PSBweE5ld1RDQi0+dXhQcmlvcml0eSApCisJCQkJeworCQkJCQlweEN1cnJlbnRUQ0IgPSBweE5ld1RDQjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKworCQl1eFRhc2tOdW1iZXIrKzsKKworCQkjaWYgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisJCXsKKwkJCS8qIEFkZCBhIGNvdW50ZXIgaW50byB0aGUgVENCIGZvciB0cmFjaW5nIG9ubHkuICovCisJCQlweE5ld1RDQi0+dXhUQ0JOdW1iZXIgPSB1eFRhc2tOdW1iZXI7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSAqLworCQl0cmFjZVRBU0tfQ1JFQVRFKCBweE5ld1RDQiApOworCisJCXBydkFkZFRhc2tUb1JlYWR5TGlzdCggcHhOZXdUQ0IgKTsKKworCQlwb3J0U0VUVVBfVENCKCBweE5ld1RDQiApOworCX0KKwl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJaWYoIHhTY2hlZHVsZXJSdW5uaW5nICE9IHBkRkFMU0UgKQorCXsKKwkJLyogSWYgdGhlIGNyZWF0ZWQgdGFzayBpcyBvZiBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBjdXJyZW50IHRhc2sKKwkJdGhlbiBpdCBzaG91bGQgcnVuIG5vdy4gKi8KKwkJaWYoIHB4Q3VycmVudFRDQi0+dXhQcmlvcml0eSA8IHB4TmV3VENCLT51eFByaW9yaXR5ICkKKwkJeworCQkJdGFza1lJRUxEX0lGX1VTSU5HX1BSRUVNUFRJT04oKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfdlRhc2tEZWxldGUgPT0gMSApCisKKwl2b2lkIHZUYXNrRGVsZXRlKCBUYXNrSGFuZGxlX3QgeFRhc2tUb0RlbGV0ZSApCisJeworCVRDQl90ICpweFRDQjsKKworCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJeworCQkJLyogSWYgbnVsbCBpcyBwYXNzZWQgaW4gaGVyZSB0aGVuIGl0IGlzIHRoZSBjYWxsaW5nIHRhc2sgdGhhdCBpcworCQkJYmVpbmcgZGVsZXRlZC4gKi8KKwkJCXB4VENCID0gcHJ2R2V0VENCRnJvbUhhbmRsZSggeFRhc2tUb0RlbGV0ZSApOworCisJCQkvKiBSZW1vdmUgdGFzayBmcm9tIHRoZSByZWFkeSBsaXN0LiAqLworCQkJaWYoIHV4TGlzdFJlbW92ZSggJiggcHhUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKSA9PSAoIFVCYXNlVHlwZV90ICkgMCApCisJCQl7CisJCQkJdGFza1JFU0VUX1JFQURZX1BSSU9SSVRZKCBweFRDQi0+dXhQcmlvcml0eSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKworCQkJLyogSXMgdGhlIHRhc2sgd2FpdGluZyBvbiBhbiBldmVudCBhbHNvPyAqLworCQkJaWYoIGxpc3RMSVNUX0lURU1fQ09OVEFJTkVSKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApICE9IE5VTEwgKQorCQkJeworCQkJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhUQ0ItPnhFdmVudExpc3RJdGVtICkgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisKKwkJCS8qIEluY3JlbWVudCB0aGUgdXhUYXNrTnVtYmVyIGFsc28gc28ga2VybmVsIGF3YXJlIGRlYnVnZ2VycyBjYW4KKwkJCWRldGVjdCB0aGF0IHRoZSB0YXNrIGxpc3RzIG5lZWQgcmUtZ2VuZXJhdGluZy4gIFRoaXMgaXMgZG9uZSBiZWZvcmUKKwkJCXBvcnRQUkVfVEFTS19ERUxFVEVfSE9PSygpIGFzIGluIHRoZSBXaW5kb3dzIHBvcnQgdGhhdCBtYWNybyB3aWxsCisJCQlub3QgcmV0dXJuLiAqLworCQkJdXhUYXNrTnVtYmVyKys7CisKKwkJCWlmKCBweFRDQiA9PSBweEN1cnJlbnRUQ0IgKQorCQkJeworCQkJCS8qIEEgdGFzayBpcyBkZWxldGluZyBpdHNlbGYuICBUaGlzIGNhbm5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlCisJCQkJdGFzayBpdHNlbGYsIGFzIGEgY29udGV4dCBzd2l0Y2ggdG8gYW5vdGhlciB0YXNrIGlzIHJlcXVpcmVkLgorCQkJCVBsYWNlIHRoZSB0YXNrIGluIHRoZSB0ZXJtaW5hdGlvbiBsaXN0LiAgVGhlIGlkbGUgdGFzayB3aWxsCisJCQkJY2hlY2sgdGhlIHRlcm1pbmF0aW9uIGxpc3QgYW5kIGZyZWUgdXAgYW55IG1lbW9yeSBhbGxvY2F0ZWQgYnkKKwkJCQl0aGUgc2NoZWR1bGVyIGZvciB0aGUgVENCIGFuZCBzdGFjayBvZiB0aGUgZGVsZXRlZCB0YXNrLiAqLworCQkJCXZMaXN0SW5zZXJ0RW5kKCAmeFRhc2tzV2FpdGluZ1Rlcm1pbmF0aW9uLCAmKCBweFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApOworCisJCQkJLyogSW5jcmVtZW50IHRoZSB1Y1Rhc2tzRGVsZXRlZCB2YXJpYWJsZSBzbyB0aGUgaWRsZSB0YXNrIGtub3dzCisJCQkJdGhlcmUgaXMgYSB0YXNrIHRoYXQgaGFzIGJlZW4gZGVsZXRlZCBhbmQgdGhhdCBpdCBzaG91bGQgdGhlcmVmb3JlCisJCQkJY2hlY2sgdGhlIHhUYXNrc1dhaXRpbmdUZXJtaW5hdGlvbiBsaXN0LiAqLworCQkJCSsrdXhEZWxldGVkVGFza3NXYWl0aW5nQ2xlYW5VcDsKKworCQkJCS8qIFRoZSBwcmUtZGVsZXRlIGhvb2sgaXMgcHJpbWFyaWx5IGZvciB0aGUgV2luZG93cyBzaW11bGF0b3IsCisJCQkJaW4gd2hpY2ggV2luZG93cyBzcGVjaWZpYyBjbGVhbiB1cCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQsCisJCQkJYWZ0ZXIgd2hpY2ggaXQgaXMgbm90IHBvc3NpYmxlIHRvIHlpZWxkIGF3YXkgZnJvbSB0aGlzIHRhc2sgLQorCQkJCWhlbmNlIHhZaWVsZFBlbmRpbmcgaXMgdXNlZCB0byBsYXRjaCB0aGF0IGEgY29udGV4dCBzd2l0Y2ggaXMKKwkJCQlyZXF1aXJlZC4gKi8KKwkJCQlwb3J0UFJFX1RBU0tfREVMRVRFX0hPT0soIHB4VENCLCAmeFlpZWxkUGVuZGluZyApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS0tdXhDdXJyZW50TnVtYmVyT2ZUYXNrczsKKwkJCQlwcnZEZWxldGVUQ0IoIHB4VENCICk7CisKKwkJCQkvKiBSZXNldCB0aGUgbmV4dCBleHBlY3RlZCB1bmJsb2NrIHRpbWUgaW4gY2FzZSBpdCByZWZlcnJlZCB0bworCQkJCXRoZSB0YXNrIHRoYXQgaGFzIGp1c3QgYmVlbiBkZWxldGVkLiAqLworCQkJCXBydlJlc2V0TmV4dFRhc2tVbmJsb2NrVGltZSgpOworCQkJfQorCisJCQl0cmFjZVRBU0tfREVMRVRFKCBweFRDQiApOworCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJLyogRm9yY2UgYSByZXNjaGVkdWxlIGlmIGl0IGlzIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrIHRoYXQgaGFzIGp1c3QKKwkJYmVlbiBkZWxldGVkLiAqLworCQlpZiggeFNjaGVkdWxlclJ1bm5pbmcgIT0gcGRGQUxTRSApCisJCXsKKwkJCWlmKCBweFRDQiA9PSBweEN1cnJlbnRUQ0IgKQorCQkJeworCQkJCWNvbmZpZ0FTU0VSVCggdXhTY2hlZHVsZXJTdXNwZW5kZWQgPT0gMCApOworCQkJCXBvcnRZSUVMRF9XSVRISU5fQVBJKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisJfQorCisjZW5kaWYgLyogSU5DTFVERV92VGFza0RlbGV0ZSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfdlRhc2tEZWxheVVudGlsID09IDEgKQorCisJdm9pZCB2VGFza0RlbGF5VW50aWwoIFRpY2tUeXBlX3QgKiBjb25zdCBweFByZXZpb3VzV2FrZVRpbWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpbWVJbmNyZW1lbnQgKQorCXsKKwlUaWNrVHlwZV90IHhUaW1lVG9XYWtlOworCUJhc2VUeXBlX3QgeEFscmVhZHlZaWVsZGVkLCB4U2hvdWxkRGVsYXkgPSBwZEZBTFNFOworCisJCWNvbmZpZ0FTU0VSVCggcHhQcmV2aW91c1dha2VUaW1lICk7CisJCWNvbmZpZ0FTU0VSVCggKCB4VGltZUluY3JlbWVudCA+IDBVICkgKTsKKwkJY29uZmlnQVNTRVJUKCB1eFNjaGVkdWxlclN1c3BlbmRlZCA9PSAwICk7CisKKwkJdlRhc2tTdXNwZW5kQWxsKCk7CisJCXsKKwkJCS8qIE1pbm9yIG9wdGltaXNhdGlvbi4gIFRoZSB0aWNrIGNvdW50IGNhbm5vdCBjaGFuZ2UgaW4gdGhpcworCQkJYmxvY2suICovCisJCQljb25zdCBUaWNrVHlwZV90IHhDb25zdFRpY2tDb3VudCA9IHhUaWNrQ291bnQ7CisKKwkJCS8qIEdlbmVyYXRlIHRoZSB0aWNrIHRpbWUgYXQgd2hpY2ggdGhlIHRhc2sgd2FudHMgdG8gd2FrZS4gKi8KKwkJCXhUaW1lVG9XYWtlID0gKnB4UHJldmlvdXNXYWtlVGltZSArIHhUaW1lSW5jcmVtZW50OworCisJCQlpZiggeENvbnN0VGlja0NvdW50IDwgKnB4UHJldmlvdXNXYWtlVGltZSApCisJCQl7CisJCQkJLyogVGhlIHRpY2sgY291bnQgaGFzIG92ZXJmbG93ZWQgc2luY2UgdGhpcyBmdW5jdGlvbiB3YXMKKwkJCQlsYXN0ZWQgY2FsbGVkLiAgSW4gdGhpcyBjYXNlIHRoZSBvbmx5IHRpbWUgd2Ugc2hvdWxkIGV2ZXIKKwkJCQlhY3R1YWxseSBkZWxheSBpcyBpZiB0aGUgd2FrZSB0aW1lIGhhcyBhbHNvCW92ZXJmbG93ZWQsCisJCQkJYW5kIHRoZSB3YWtlIHRpbWUgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aWNrIHRpbWUuICBXaGVuIHRoaXMKKwkJCQlpcyB0aGUgY2FzZSBpdCBpcyBhcyBpZiBuZWl0aGVyIHRpbWUgaGFkIG92ZXJmbG93ZWQuICovCisJCQkJaWYoICggeFRpbWVUb1dha2UgPCAqcHhQcmV2aW91c1dha2VUaW1lICkgJiYgKCB4VGltZVRvV2FrZSA+IHhDb25zdFRpY2tDb3VudCApICkKKwkJCQl7CisJCQkJCXhTaG91bGREZWxheSA9IHBkVFJVRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBUaGUgdGljayB0aW1lIGhhcyBub3Qgb3ZlcmZsb3dlZC4gIEluIHRoaXMgY2FzZSB3ZSB3aWxsCisJCQkJZGVsYXkgaWYgZWl0aGVyIHRoZSB3YWtlIHRpbWUgaGFzIG92ZXJmbG93ZWQsIGFuZC9vciB0aGUKKwkJCQl0aWNrIHRpbWUgaXMgbGVzcyB0aGFuIHRoZSB3YWtlIHRpbWUuICovCisJCQkJaWYoICggeFRpbWVUb1dha2UgPCAqcHhQcmV2aW91c1dha2VUaW1lICkgfHwgKCB4VGltZVRvV2FrZSA+IHhDb25zdFRpY2tDb3VudCApICkKKwkJCQl7CisJCQkJCXhTaG91bGREZWxheSA9IHBkVFJVRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKworCQkJLyogVXBkYXRlIHRoZSB3YWtlIHRpbWUgcmVhZHkgZm9yIHRoZSBuZXh0IGNhbGwuICovCisJCQkqcHhQcmV2aW91c1dha2VUaW1lID0geFRpbWVUb1dha2U7CisKKwkJCWlmKCB4U2hvdWxkRGVsYXkgIT0gcGRGQUxTRSApCisJCQl7CisJCQkJdHJhY2VUQVNLX0RFTEFZX1VOVElMKCB4VGltZVRvV2FrZSApOworCisJCQkJLyogcHJ2QWRkQ3VycmVudFRhc2tUb0RlbGF5ZWRMaXN0KCkgbmVlZHMgdGhlIGJsb2NrIHRpbWUsIG5vdAorCQkJCXRoZSB0aW1lIHRvIHdha2UsIHNvIHN1YnRyYWN0IHRoZSBjdXJyZW50IHRpY2sgY291bnQuICovCisJCQkJcHJ2QWRkQ3VycmVudFRhc2tUb0RlbGF5ZWRMaXN0KCB4VGltZVRvV2FrZSAtIHhDb25zdFRpY2tDb3VudCwgcGRGQUxTRSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQl4QWxyZWFkeVlpZWxkZWQgPSB4VGFza1Jlc3VtZUFsbCgpOworCisJCS8qIEZvcmNlIGEgcmVzY2hlZHVsZSBpZiB4VGFza1Jlc3VtZUFsbCBoYXMgbm90IGFscmVhZHkgZG9uZSBzbywgd2UgbWF5CisJCWhhdmUgcHV0IG91cnNlbHZlcyB0byBzbGVlcC4gKi8KKwkJaWYoIHhBbHJlYWR5WWllbGRlZCA9PSBwZEZBTFNFICkKKwkJeworCQkJcG9ydFlJRUxEX1dJVEhJTl9BUEkoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qIElOQ0xVREVfdlRhc2tEZWxheVVudGlsICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV92VGFza0RlbGF5ID09IDEgKQorCisJdm9pZCB2VGFza0RlbGF5KCBjb25zdCBUaWNrVHlwZV90IHhUaWNrc1RvRGVsYXkgKQorCXsKKwlCYXNlVHlwZV90IHhBbHJlYWR5WWllbGRlZCA9IHBkRkFMU0U7CisKKwkJLyogQSBkZWxheSB0aW1lIG9mIHplcm8ganVzdCBmb3JjZXMgYSByZXNjaGVkdWxlLiAqLworCQlpZiggeFRpY2tzVG9EZWxheSA+ICggVGlja1R5cGVfdCApIDBVICkKKwkJeworCQkJY29uZmlnQVNTRVJUKCB1eFNjaGVkdWxlclN1c3BlbmRlZCA9PSAwICk7CisJCQl2VGFza1N1c3BlbmRBbGwoKTsKKwkJCXsKKwkJCQl0cmFjZVRBU0tfREVMQVkoKTsKKworCQkJCS8qIEEgdGFzayB0aGF0IGlzIHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQgbGlzdCB3aGlsZSB0aGUKKwkJCQlzY2hlZHVsZXIgaXMgc3VzcGVuZGVkIHdpbGwgbm90IGdldCBwbGFjZWQgaW4gdGhlIHJlYWR5CisJCQkJbGlzdCBvciByZW1vdmVkIGZyb20gdGhlIGJsb2NrZWQgbGlzdCB1bnRpbCB0aGUgc2NoZWR1bGVyCisJCQkJaXMgcmVzdW1lZC4KKworCQkJCVRoaXMgdGFzayBjYW5ub3QgYmUgaW4gYW4gZXZlbnQgbGlzdCBhcyBpdCBpcyB0aGUgY3VycmVudGx5CisJCQkJZXhlY3V0aW5nIHRhc2suICovCisJCQkJcHJ2QWRkQ3VycmVudFRhc2tUb0RlbGF5ZWRMaXN0KCB4VGlja3NUb0RlbGF5LCBwZEZBTFNFICk7CisJCQl9CisJCQl4QWxyZWFkeVlpZWxkZWQgPSB4VGFza1Jlc3VtZUFsbCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisKKwkJLyogRm9yY2UgYSByZXNjaGVkdWxlIGlmIHhUYXNrUmVzdW1lQWxsIGhhcyBub3QgYWxyZWFkeSBkb25lIHNvLCB3ZSBtYXkKKwkJaGF2ZSBwdXQgb3Vyc2VsdmVzIHRvIHNsZWVwLiAqLworCQlpZiggeEFscmVhZHlZaWVsZGVkID09IHBkRkFMU0UgKQorCQl7CisJCQlwb3J0WUlFTERfV0lUSElOX0FQSSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCisjZW5kaWYgLyogSU5DTFVERV92VGFza0RlbGF5ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCAoIElOQ0xVREVfZVRhc2tHZXRTdGF0ZSA9PSAxICkgfHwgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApICkKKworCWVUYXNrU3RhdGUgZVRhc2tHZXRTdGF0ZSggVGFza0hhbmRsZV90IHhUYXNrICkKKwl7CisJZVRhc2tTdGF0ZSBlUmV0dXJuOworCUxpc3RfdCAqcHhTdGF0ZUxpc3Q7CisJY29uc3QgVENCX3QgKiBjb25zdCBweFRDQiA9ICggVENCX3QgKiApIHhUYXNrOworCisJCWNvbmZpZ0FTU0VSVCggcHhUQ0IgKTsKKworCQlpZiggcHhUQ0IgPT0gcHhDdXJyZW50VENCICkKKwkJeworCQkJLyogVGhlIHRhc2sgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlzIHF1ZXJ5aW5nIGl0cyBvd24gc3RhdGUuICovCisJCQllUmV0dXJuID0gZVJ1bm5pbmc7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJCXsKKwkJCQlweFN0YXRlTGlzdCA9ICggTGlzdF90ICogKSBsaXN0TElTVF9JVEVNX0NPTlRBSU5FUiggJiggcHhUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKTsKKwkJCX0KKwkJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJCWlmKCAoIHB4U3RhdGVMaXN0ID09IHB4RGVsYXllZFRhc2tMaXN0ICkgfHwgKCBweFN0YXRlTGlzdCA9PSBweE92ZXJmbG93RGVsYXllZFRhc2tMaXN0ICkgKQorCQkJeworCQkJCS8qIFRoZSB0YXNrIGJlaW5nIHF1ZXJpZWQgaXMgcmVmZXJlbmNlZCBmcm9tIG9uZSBvZiB0aGUgQmxvY2tlZAorCQkJCWxpc3RzLiAqLworCQkJCWVSZXR1cm4gPSBlQmxvY2tlZDsKKwkJCX0KKworCQkJI2lmICggSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSApCisJCQkJZWxzZSBpZiggcHhTdGF0ZUxpc3QgPT0gJnhTdXNwZW5kZWRUYXNrTGlzdCApCisJCQkJeworCQkJCQkvKiBUaGUgdGFzayBiZWluZyBxdWVyaWVkIGlzIHJlZmVyZW5jZWQgZnJvbSB0aGUgc3VzcGVuZGVkCisJCQkJCWxpc3QuICBJcyBpdCBnZW51aW5lbHkgc3VzcGVuZGVkIG9yIGlzIGl0IGJsb2NrCisJCQkJCWluZGVmaW5pdGVseT8gKi8KKwkJCQkJaWYoIGxpc3RMSVNUX0lURU1fQ09OVEFJTkVSKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApID09IE5VTEwgKQorCQkJCQl7CisJCQkJCQllUmV0dXJuID0gZVN1c3BlbmRlZDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWVSZXR1cm4gPSBlQmxvY2tlZDsKKwkJCQkJfQorCQkJCX0KKwkJCSNlbmRpZgorCisJCQkjaWYgKCBJTkNMVURFX3ZUYXNrRGVsZXRlID09IDEgKQorCQkJCWVsc2UgaWYoICggcHhTdGF0ZUxpc3QgPT0gJnhUYXNrc1dhaXRpbmdUZXJtaW5hdGlvbiApIHx8ICggcHhTdGF0ZUxpc3QgPT0gTlVMTCApICkKKwkJCQl7CisJCQkJCS8qIFRoZSB0YXNrIGJlaW5nIHF1ZXJpZWQgaXMgcmVmZXJlbmNlZCBmcm9tIHRoZSBkZWxldGVkCisJCQkJCXRhc2tzIGxpc3QsIG9yIGl0IGlzIG5vdCByZWZlcmVuY2VkIGZyb20gYW55IGxpc3RzIGF0CisJCQkJCWFsbC4gKi8KKwkJCQkJZVJldHVybiA9IGVEZWxldGVkOworCQkJCX0KKwkJCSNlbmRpZgorCisJCQllbHNlIC8qbGludCAhZTUyNSBOZWdhdGl2ZSBpbmRlbnRhdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHVzZSBvZiBwcmUtcHJvY2Vzc29yIGNsZWFyZXIuICovCisJCQl7CisJCQkJLyogSWYgdGhlIHRhc2sgaXMgbm90IGluIGFueSBvdGhlciBzdGF0ZSwgaXQgbXVzdCBiZSBpbiB0aGUKKwkJCQlSZWFkeSAoaW5jbHVkaW5nIHBlbmRpbmcgcmVhZHkpIHN0YXRlLiAqLworCQkJCWVSZXR1cm4gPSBlUmVhZHk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZVJldHVybjsKKwl9IC8qbGludCAhZTgxOCB4VGFzayBjYW5ub3QgYmUgYSBwb2ludGVyIHRvIGNvbnN0IGJlY2F1c2UgaXQgaXMgYSB0eXBlZGVmLiAqLworCisjZW5kaWYgLyogSU5DTFVERV9lVGFza0dldFN0YXRlICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV91eFRhc2tQcmlvcml0eUdldCA9PSAxICkKKworCVVCYXNlVHlwZV90IHV4VGFza1ByaW9yaXR5R2V0KCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCXsKKwlUQ0JfdCAqcHhUQ0I7CisJVUJhc2VUeXBlX3QgdXhSZXR1cm47CisKKwkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJCXsKKwkJCS8qIElmIG51bGwgaXMgcGFzc2VkIGluIGhlcmUgdGhlbiBpdCBpcyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRoYXQKKwkJCWNhbGxlZCB1eFRhc2tQcmlvcml0eUdldCgpIHRoYXQgaXMgYmVpbmcgcXVlcmllZC4gKi8KKwkJCXB4VENCID0gcHJ2R2V0VENCRnJvbUhhbmRsZSggeFRhc2sgKTsKKwkJCXV4UmV0dXJuID0gcHhUQ0ItPnV4UHJpb3JpdHk7CisJCX0KKwkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKworCQlyZXR1cm4gdXhSZXR1cm47CisJfQorCisjZW5kaWYgLyogSU5DTFVERV91eFRhc2tQcmlvcml0eUdldCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfdXhUYXNrUHJpb3JpdHlHZXQgPT0gMSApCisKKwlVQmFzZVR5cGVfdCB1eFRhc2tQcmlvcml0eUdldEZyb21JU1IoIFRhc2tIYW5kbGVfdCB4VGFzayApCisJeworCVRDQl90ICpweFRDQjsKKwlVQmFzZVR5cGVfdCB1eFJldHVybiwgdXhTYXZlZEludGVycnVwdFN0YXRlOworCisJCS8qIFJUT1MgcG9ydHMgdGhhdCBzdXBwb3J0IGludGVycnVwdCBuZXN0aW5nIGhhdmUgdGhlIGNvbmNlcHQgb2YgYQorCQltYXhpbXVtCXN5c3RlbSBjYWxsIChvciBtYXhpbXVtIEFQSSBjYWxsKSBpbnRlcnJ1cHQgcHJpb3JpdHkuCisJCUludGVycnVwdHMgdGhhdCBhcmUJYWJvdmUgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkgYXJlIGtlZXAKKwkJcGVybWFuZW50bHkgZW5hYmxlZCwgZXZlbiB3aGVuIHRoZSBSVE9TIGtlcm5lbCBpcyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sCisJCWJ1dCBjYW5ub3QgbWFrZSBhbnkgY2FsbHMgdG8gRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucy4gIElmIGNvbmZpZ0FTU0VSVCgpCisJCWlzIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaCB0aGVuCisJCXBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSB3aWxsIHJlc3VsdCBpbiBhbiBhc3NlcnRpb24KKwkJZmFpbHVyZSBpZiBhIEZyZWVSVE9TIEFQSSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgdGhhdCBoYXMKKwkJYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlIHRoZSBjb25maWd1cmVkIG1heGltdW0gc3lzdGVtIGNhbGwKKwkJcHJpb3JpdHkuICBPbmx5IEZyZWVSVE9TIGZ1bmN0aW9ucyB0aGF0IGVuZCBpbiBGcm9tSVNSIGNhbiBiZSBjYWxsZWQKKwkJZnJvbSBpbnRlcnJ1cHRzCXRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgKGxvZ2ljYWxseSkKKwkJYmVsb3cgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgaW50ZXJydXB0IHByaW9yaXR5LiAgRnJlZVJUT1MgbWFpbnRhaW5zIGEKKwkJc2VwYXJhdGUgaW50ZXJydXB0IHNhZmUgQVBJIHRvIGVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgYXMKKwkJc2ltcGxlIGFzIHBvc3NpYmxlLiAgTW9yZSBpbmZvcm1hdGlvbiAoYWxiZWl0IENvcnRleC1NIHNwZWNpZmljKSBpcworCQlwcm92aWRlZCBvbiB0aGUgZm9sbG93aW5nIGxpbms6CisJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwkJcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpOworCisJCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0ZSA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwkJeworCQkJLyogSWYgbnVsbCBpcyBwYXNzZWQgaW4gaGVyZSB0aGVuIGl0IGlzIHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGluZworCQkJdGFzayB0aGF0IGlzIGJlaW5nIHF1ZXJpZWQuICovCisJCQlweFRDQiA9IHBydkdldFRDQkZyb21IYW5kbGUoIHhUYXNrICk7CisJCQl1eFJldHVybiA9IHB4VENCLT51eFByaW9yaXR5OworCQl9CisJCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdXhTYXZlZEludGVycnVwdFN0YXRlICk7CisKKwkJcmV0dXJuIHV4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIElOQ0xVREVfdXhUYXNrUHJpb3JpdHlHZXQgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBJTkNMVURFX3ZUYXNrUHJpb3JpdHlTZXQgPT0gMSApCisKKwl2b2lkIHZUYXNrUHJpb3JpdHlTZXQoIFRhc2tIYW5kbGVfdCB4VGFzaywgVUJhc2VUeXBlX3QgdXhOZXdQcmlvcml0eSApCisJeworCVRDQl90ICpweFRDQjsKKwlVQmFzZVR5cGVfdCB1eEN1cnJlbnRCYXNlUHJpb3JpdHksIHV4UHJpb3JpdHlVc2VkT25FbnRyeTsKKwlCYXNlVHlwZV90IHhZaWVsZFJlcXVpcmVkID0gcGRGQUxTRTsKKworCQljb25maWdBU1NFUlQoICggdXhOZXdQcmlvcml0eSA8IGNvbmZpZ01BWF9QUklPUklUSUVTICkgKTsKKworCQkvKiBFbnN1cmUgdGhlIG5ldyBwcmlvcml0eSBpcyB2YWxpZC4gKi8KKwkJaWYoIHV4TmV3UHJpb3JpdHkgPj0gKCBVQmFzZVR5cGVfdCApIGNvbmZpZ01BWF9QUklPUklUSUVTICkKKwkJeworCQkJdXhOZXdQcmlvcml0eSA9ICggVUJhc2VUeXBlX3QgKSBjb25maWdNQVhfUFJJT1JJVElFUyAtICggVUJhc2VUeXBlX3QgKSAxVTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQl7CisJCQkvKiBJZiBudWxsIGlzIHBhc3NlZCBpbiBoZXJlIHRoZW4gaXQgaXMgdGhlIHByaW9yaXR5IG9mIHRoZSBjYWxsaW5nCisJCQl0YXNrIHRoYXQgaXMgYmVpbmcgY2hhbmdlZC4gKi8KKwkJCXB4VENCID0gcHJ2R2V0VENCRnJvbUhhbmRsZSggeFRhc2sgKTsKKworCQkJdHJhY2VUQVNLX1BSSU9SSVRZX1NFVCggcHhUQ0IsIHV4TmV3UHJpb3JpdHkgKTsKKworCQkJI2lmICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCisJCQl7CisJCQkJdXhDdXJyZW50QmFzZVByaW9yaXR5ID0gcHhUQ0ItPnV4QmFzZVByaW9yaXR5OworCQkJfQorCQkJI2Vsc2UKKwkJCXsKKwkJCQl1eEN1cnJlbnRCYXNlUHJpb3JpdHkgPSBweFRDQi0+dXhQcmlvcml0eTsKKwkJCX0KKwkJCSNlbmRpZgorCisJCQlpZiggdXhDdXJyZW50QmFzZVByaW9yaXR5ICE9IHV4TmV3UHJpb3JpdHkgKQorCQkJeworCQkJCS8qIFRoZSBwcmlvcml0eSBjaGFuZ2UgbWF5IGhhdmUgcmVhZGllZCBhIHRhc2sgb2YgaGlnaGVyCisJCQkJcHJpb3JpdHkgdGhhbiB0aGUgY2FsbGluZyB0YXNrLiAqLworCQkJCWlmKCB1eE5ld1ByaW9yaXR5ID4gdXhDdXJyZW50QmFzZVByaW9yaXR5ICkKKwkJCQl7CisJCQkJCWlmKCBweFRDQiAhPSBweEN1cnJlbnRUQ0IgKQorCQkJCQl7CisJCQkJCQkvKiBUaGUgcHJpb3JpdHkgb2YgYSB0YXNrIG90aGVyIHRoYW4gdGhlIGN1cnJlbnRseQorCQkJCQkJcnVubmluZyB0YXNrIGlzIGJlaW5nIHJhaXNlZC4gIElzIHRoZSBwcmlvcml0eSBiZWluZworCQkJCQkJcmFpc2VkIGFib3ZlIHRoYXQgb2YgdGhlIHJ1bm5pbmcgdGFzaz8gKi8KKwkJCQkJCWlmKCB1eE5ld1ByaW9yaXR5ID49IHB4Q3VycmVudFRDQi0+dXhQcmlvcml0eSApCisJCQkJCQl7CisJCQkJCQkJeFlpZWxkUmVxdWlyZWQgPSBwZFRSVUU7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLyogVGhlIHByaW9yaXR5IG9mIHRoZSBydW5uaW5nIHRhc2sgaXMgYmVpbmcgcmFpc2VkLAorCQkJCQkJYnV0IHRoZSBydW5uaW5nIHRhc2sgbXVzdCBhbHJlYWR5IGJlIHRoZSBoaWdoZXN0CisJCQkJCQlwcmlvcml0eSB0YXNrIGFibGUgdG8gcnVuIHNvIG5vIHlpZWxkIGlzIHJlcXVpcmVkLiAqLworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoIHB4VENCID09IHB4Q3VycmVudFRDQiApCisJCQkJeworCQkJCQkvKiBTZXR0aW5nIHRoZSBwcmlvcml0eSBvZiB0aGUgcnVubmluZyB0YXNrIGRvd24gbWVhbnMKKwkJCQkJdGhlcmUgbWF5IG5vdyBiZSBhbm90aGVyIHRhc2sgb2YgaGlnaGVyIHByaW9yaXR5IHRoYXQKKwkJCQkJaXMgcmVhZHkgdG8gZXhlY3V0ZS4gKi8KKwkJCQkJeFlpZWxkUmVxdWlyZWQgPSBwZFRSVUU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIFNldHRpbmcgdGhlIHByaW9yaXR5IG9mIGFueSBvdGhlciB0YXNrIGRvd24gZG9lcyBub3QKKwkJCQkJcmVxdWlyZSBhIHlpZWxkIGFzIHRoZSBydW5uaW5nIHRhc2sgbXVzdCBiZSBhYm92ZSB0aGUKKwkJCQkJbmV3IHByaW9yaXR5IG9mIHRoZSB0YXNrIGJlaW5nIG1vZGlmaWVkLiAqLworCQkJCX0KKworCQkJCS8qIFJlbWVtYmVyIHRoZSByZWFkeSBsaXN0IHRoZSB0YXNrIG1pZ2h0IGJlIHJlZmVyZW5jZWQgZnJvbQorCQkJCWJlZm9yZSBpdHMgdXhQcmlvcml0eSBtZW1iZXIgaXMgY2hhbmdlZCBzbyB0aGUKKwkJCQl0YXNrUkVTRVRfUkVBRFlfUFJJT1JJVFkoKSBtYWNybyBjYW4gZnVuY3Rpb24gY29ycmVjdGx5LiAqLworCQkJCXV4UHJpb3JpdHlVc2VkT25FbnRyeSA9IHB4VENCLT51eFByaW9yaXR5OworCisJCQkJI2lmICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCisJCQkJeworCQkJCQkvKiBPbmx5IGNoYW5nZSB0aGUgcHJpb3JpdHkgYmVpbmcgdXNlZCBpZiB0aGUgdGFzayBpcyBub3QKKwkJCQkJY3VycmVudGx5IHVzaW5nIGFuIGluaGVyaXRlZCBwcmlvcml0eS4gKi8KKwkJCQkJaWYoIHB4VENCLT51eEJhc2VQcmlvcml0eSA9PSBweFRDQi0+dXhQcmlvcml0eSApCisJCQkJCXsKKwkJCQkJCXB4VENCLT51eFByaW9yaXR5ID0gdXhOZXdQcmlvcml0eTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCisJCQkJCS8qIFRoZSBiYXNlIHByaW9yaXR5IGdldHMgc2V0IHdoYXRldmVyLiAqLworCQkJCQlweFRDQi0+dXhCYXNlUHJpb3JpdHkgPSB1eE5ld1ByaW9yaXR5OworCQkJCX0KKwkJCQkjZWxzZQorCQkJCXsKKwkJCQkJcHhUQ0ItPnV4UHJpb3JpdHkgPSB1eE5ld1ByaW9yaXR5OworCQkJCX0KKwkJCQkjZW5kaWYKKworCQkJCS8qIE9ubHkgcmVzZXQgdGhlIGV2ZW50IGxpc3QgaXRlbSB2YWx1ZSBpZiB0aGUgdmFsdWUgaXMgbm90CisJCQkJYmVpbmcgdXNlZCBmb3IgYW55dGhpbmcgZWxzZS4gKi8KKwkJCQlpZiggKCBsaXN0R0VUX0xJU1RfSVRFTV9WQUxVRSggJiggcHhUQ0ItPnhFdmVudExpc3RJdGVtICkgKSAmIHRhc2tFVkVOVF9MSVNUX0lURU1fVkFMVUVfSU5fVVNFICkgPT0gMFVMICkKKwkJCQl7CisJCQkJCWxpc3RTRVRfTElTVF9JVEVNX1ZBTFVFKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSwgKCAoIFRpY2tUeXBlX3QgKSBjb25maWdNQVhfUFJJT1JJVElFUyAtICggVGlja1R5cGVfdCApIHV4TmV3UHJpb3JpdHkgKSApOyAvKmxpbnQgIWU5NjEgTUlTUkEgZXhjZXB0aW9uIGFzIHRoZSBjYXN0cyBhcmUgb25seSByZWR1bmRhbnQgZm9yIHNvbWUgcG9ydHMuICovCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisKKwkJCQkvKiBJZiB0aGUgdGFzayBpcyBpbiB0aGUgYmxvY2tlZCBvciBzdXNwZW5kZWQgbGlzdCB3ZSBuZWVkIGRvCisJCQkJbm90aGluZyBtb3JlIHRoYW4gY2hhbmdlIGl0cyBwcmlvcml0eSB2YXJpYWJsZS4gSG93ZXZlciwgaWYKKwkJCQl0aGUgdGFzayBpcyBpbiBhIHJlYWR5IGxpc3QgaXQgbmVlZHMgdG8gYmUgcmVtb3ZlZCBhbmQgcGxhY2VkCisJCQkJaW4gdGhlIGxpc3QgYXBwcm9wcmlhdGUgdG8gaXRzIG5ldyBwcmlvcml0eS4gKi8KKwkJCQlpZiggbGlzdElTX0NPTlRBSU5FRF9XSVRISU4oICYoIHB4UmVhZHlUYXNrc0xpc3RzWyB1eFByaW9yaXR5VXNlZE9uRW50cnkgXSApLCAmKCBweFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApICE9IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJLyogVGhlIHRhc2sgaXMgY3VycmVudGx5IGluIGl0cyByZWFkeSBsaXN0IC0gcmVtb3ZlIGJlZm9yZQorCQkJCQlhZGRpbmcgaXQgdG8gaXQncyBuZXcgcmVhZHkgbGlzdC4gIEFzIHdlIGFyZSBpbiBhIGNyaXRpY2FsCisJCQkJCXNlY3Rpb24gd2UgY2FuIGRvIHRoaXMgZXZlbiBpZiB0aGUgc2NoZWR1bGVyIGlzIHN1c3BlbmRlZC4gKi8KKwkJCQkJaWYoIHV4TGlzdFJlbW92ZSggJiggcHhUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKSA9PSAoIFVCYXNlVHlwZV90ICkgMCApCisJCQkJCXsKKwkJCQkJCS8qIEl0IGlzIGtub3duIHRoYXQgdGhlIHRhc2sgaXMgaW4gaXRzIHJlYWR5IGxpc3Qgc28KKwkJCQkJCXRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgYWdhaW4gYW5kIHRoZSBwb3J0IGxldmVsCisJCQkJCQlyZXNldCBtYWNybyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5LiAqLworCQkJCQkJcG9ydFJFU0VUX1JFQURZX1BSSU9SSVRZKCB1eFByaW9yaXR5VXNlZE9uRW50cnksIHV4VG9wUmVhZHlQcmlvcml0eSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJCXBydkFkZFRhc2tUb1JlYWR5TGlzdCggcHhUQ0IgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKworCQkJCWlmKCB4WWllbGRSZXF1aXJlZCAhPSBwZEZBTFNFICkKKwkJCQl7CisJCQkJCXRhc2tZSUVMRF9JRl9VU0lOR19QUkVFTVBUSU9OKCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisKKwkJCQkvKiBSZW1vdmUgY29tcGlsZXIgd2FybmluZyBhYm91dCB1bnVzZWQgdmFyaWFibGVzIHdoZW4gdGhlIHBvcnQKKwkJCQlvcHRpbWlzZWQgdGFzayBzZWxlY3Rpb24gaXMgbm90IGJlaW5nIHVzZWQuICovCisJCQkJKCB2b2lkICkgdXhQcmlvcml0eVVzZWRPbkVudHJ5OworCQkJfQorCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisJfQorCisjZW5kaWYgLyogSU5DTFVERV92VGFza1ByaW9yaXR5U2V0ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSApCisKKwl2b2lkIHZUYXNrU3VzcGVuZCggVGFza0hhbmRsZV90IHhUYXNrVG9TdXNwZW5kICkKKwl7CisJVENCX3QgKnB4VENCOworCisJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQl7CisJCQkvKiBJZiBudWxsIGlzIHBhc3NlZCBpbiBoZXJlIHRoZW4gaXQgaXMgdGhlIHJ1bm5pbmcgdGFzayB0aGF0IGlzCisJCQliZWluZyBzdXNwZW5kZWQuICovCisJCQlweFRDQiA9IHBydkdldFRDQkZyb21IYW5kbGUoIHhUYXNrVG9TdXNwZW5kICk7CisKKwkJCXRyYWNlVEFTS19TVVNQRU5EKCBweFRDQiApOworCisJCQkvKiBSZW1vdmUgdGFzayBmcm9tIHRoZSByZWFkeS9kZWxheWVkIGxpc3QgYW5kIHBsYWNlIGluIHRoZQorCQkJc3VzcGVuZGVkIGxpc3QuICovCisJCQlpZiggdXhMaXN0UmVtb3ZlKCAmKCBweFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApID09ICggVUJhc2VUeXBlX3QgKSAwICkKKwkJCXsKKwkJCQl0YXNrUkVTRVRfUkVBRFlfUFJJT1JJVFkoIHB4VENCLT51eFByaW9yaXR5ICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCisJCQkvKiBJcyB0aGUgdGFzayB3YWl0aW5nIG9uIGFuIGV2ZW50IGFsc28/ICovCisJCQlpZiggbGlzdExJU1RfSVRFTV9DT05UQUlORVIoICYoIHB4VENCLT54RXZlbnRMaXN0SXRlbSApICkgIT0gTlVMTCApCisJCQl7CisJCQkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKworCQkJdkxpc3RJbnNlcnRFbmQoICZ4U3VzcGVuZGVkVGFza0xpc3QsICYoIHB4VENCLT54U3RhdGVMaXN0SXRlbSApICk7CisKKwkJCSNpZiggY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyA9PSAxICkKKwkJCXsKKwkJCQlpZiggcHhUQ0ItPnVjTm90aWZ5U3RhdGUgPT0gdGFza1dBSVRJTkdfTk9USUZJQ0FUSU9OICkKKwkJCQl7CisJCQkJCS8qIFRoZSB0YXNrIHdhcyBibG9ja2VkIHRvIHdhaXQgZm9yIGEgbm90aWZpY2F0aW9uLCBidXQgaXMKKwkJCQkJbm93IHN1c3BlbmRlZCwgc28gbm8gbm90aWZpY2F0aW9uIHdhcyByZWNlaXZlZC4gKi8KKwkJCQkJcHhUQ0ItPnVjTm90aWZ5U3RhdGUgPSB0YXNrTk9UX1dBSVRJTkdfTk9USUZJQ0FUSU9OOworCQkJCX0KKwkJCX0KKwkJCSNlbmRpZgorCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJaWYoIHhTY2hlZHVsZXJSdW5uaW5nICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBSZXNldCB0aGUgbmV4dCBleHBlY3RlZCB1bmJsb2NrIHRpbWUgaW4gY2FzZSBpdCByZWZlcnJlZCB0byB0aGUKKwkJCXRhc2sgdGhhdCBpcyBub3cgaW4gdGhlIFN1c3BlbmRlZCBzdGF0ZS4gKi8KKwkJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQkJeworCQkJCXBydlJlc2V0TmV4dFRhc2tVbmJsb2NrVGltZSgpOworCQkJfQorCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCWlmKCBweFRDQiA9PSBweEN1cnJlbnRUQ0IgKQorCQl7CisJCQlpZiggeFNjaGVkdWxlclJ1bm5pbmcgIT0gcGRGQUxTRSApCisJCQl7CisJCQkJLyogVGhlIGN1cnJlbnQgdGFzayBoYXMganVzdCBiZWVuIHN1c3BlbmRlZC4gKi8KKwkJCQljb25maWdBU1NFUlQoIHV4U2NoZWR1bGVyU3VzcGVuZGVkID09IDAgKTsKKwkJCQlwb3J0WUlFTERfV0lUSElOX0FQSSgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIFRoZSBzY2hlZHVsZXIgaXMgbm90IHJ1bm5pbmcsIGJ1dCB0aGUgdGFzayB0aGF0IHdhcyBwb2ludGVkCisJCQkJdG8gYnkgcHhDdXJyZW50VENCIGhhcyBqdXN0IGJlZW4gc3VzcGVuZGVkIGFuZCBweEN1cnJlbnRUQ0IKKwkJCQltdXN0IGJlIGFkanVzdGVkIHRvIHBvaW50IHRvIGEgZGlmZmVyZW50IHRhc2suICovCisJCQkJaWYoIGxpc3RDVVJSRU5UX0xJU1RfTEVOR1RIKCAmeFN1c3BlbmRlZFRhc2tMaXN0ICkgPT0gdXhDdXJyZW50TnVtYmVyT2ZUYXNrcyApCisJCQkJeworCQkJCQkvKiBObyBvdGhlciB0YXNrcyBhcmUgcmVhZHksIHNvIHNldCBweEN1cnJlbnRUQ0IgYmFjayB0bworCQkJCQlOVUxMIHNvIHdoZW4gdGhlIG5leHQgdGFzayBpcyBjcmVhdGVkIHB4Q3VycmVudFRDQiB3aWxsCisJCQkJCWJlIHNldCB0byBwb2ludCB0byBpdCBubyBtYXR0ZXIgd2hhdCBpdHMgcmVsYXRpdmUgcHJpb3JpdHkKKwkJCQkJaXMuICovCisJCQkJCXB4Q3VycmVudFRDQiA9IE5VTEw7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXZUYXNrU3dpdGNoQ29udGV4dCgpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qIElOQ0xVREVfdlRhc2tTdXNwZW5kICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSApCisKKwlzdGF0aWMgQmFzZVR5cGVfdCBwcnZUYXNrSXNUYXNrU3VzcGVuZGVkKCBjb25zdCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCXsKKwlCYXNlVHlwZV90IHhSZXR1cm4gPSBwZEZBTFNFOworCWNvbnN0IFRDQl90ICogY29uc3QgcHhUQ0IgPSAoIFRDQl90ICogKSB4VGFzazsKKworCQkvKiBBY2Nlc3NlcyB4UGVuZGluZ1JlYWR5TGlzdCBzbyBtdXN0IGJlIGNhbGxlZCBmcm9tIGEgY3JpdGljYWwKKwkJc2VjdGlvbi4gKi8KKworCQkvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGNoZWNrIGlmIHRoZSBjYWxsaW5nIHRhc2sgaXMgc3VzcGVuZGVkLiAqLworCQljb25maWdBU1NFUlQoIHhUYXNrICk7CisKKwkJLyogSXMgdGhlIHRhc2sgYmVpbmcgcmVzdW1lZCBhY3R1YWxseSBpbiB0aGUgc3VzcGVuZGVkIGxpc3Q/ICovCisJCWlmKCBsaXN0SVNfQ09OVEFJTkVEX1dJVEhJTiggJnhTdXNwZW5kZWRUYXNrTGlzdCwgJiggcHhUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogSGFzIHRoZSB0YXNrIGFscmVhZHkgYmVlbiByZXN1bWVkIGZyb20gd2l0aGluIGFuIElTUj8gKi8KKwkJCWlmKCBsaXN0SVNfQ09OVEFJTkVEX1dJVEhJTiggJnhQZW5kaW5nUmVhZHlMaXN0LCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApID09IHBkRkFMU0UgKQorCQkJeworCQkJCS8qIElzIGl0IGluIHRoZSBzdXNwZW5kZWQgbGlzdCBiZWNhdXNlIGl0IGlzIGluIHRoZQlTdXNwZW5kZWQKKwkJCQlzdGF0ZSwgb3IgYmVjYXVzZSBpcyBpcyBibG9ja2VkIHdpdGggbm8gdGltZW91dD8gKi8KKwkJCQlpZiggbGlzdElTX0NPTlRBSU5FRF9XSVRISU4oIE5VTEwsICYoIHB4VENCLT54RXZlbnRMaXN0SXRlbSApICkgIT0gcGRGQUxTRSApIC8qbGludCAhZTk2MS4gIFRoZSBjYXN0IGlzIG9ubHkgcmVkdW5kYW50IHdoZW4gTlVMTCBpcyB1c2VkLiAqLworCQkJCXsKKwkJCQkJeFJldHVybiA9IHBkVFJVRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKworCQlyZXR1cm4geFJldHVybjsKKwl9IC8qbGludCAhZTgxOCB4VGFzayBjYW5ub3QgYmUgYSBwb2ludGVyIHRvIGNvbnN0IGJlY2F1c2UgaXQgaXMgYSB0eXBlZGVmLiAqLworCisjZW5kaWYgLyogSU5DTFVERV92VGFza1N1c3BlbmQgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBJTkNMVURFX3ZUYXNrU3VzcGVuZCA9PSAxICkKKworCXZvaWQgdlRhc2tSZXN1bWUoIFRhc2tIYW5kbGVfdCB4VGFza1RvUmVzdW1lICkKKwl7CisJVENCX3QgKiBjb25zdCBweFRDQiA9ICggVENCX3QgKiApIHhUYXNrVG9SZXN1bWU7CisKKwkJLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byByZXN1bWUgdGhlIGNhbGxpbmcgdGFzay4gKi8KKwkJY29uZmlnQVNTRVJUKCB4VGFza1RvUmVzdW1lICk7CisKKwkJLyogVGhlIHBhcmFtZXRlciBjYW5ub3QgYmUgTlVMTCBhcyBpdCBpcyBpbXBvc3NpYmxlIHRvIHJlc3VtZSB0aGUKKwkJY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrLiAqLworCQlpZiggKCBweFRDQiAhPSBOVUxMICkgJiYgKCBweFRDQiAhPSBweEN1cnJlbnRUQ0IgKSApCisJCXsKKwkJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQkJeworCQkJCWlmKCBwcnZUYXNrSXNUYXNrU3VzcGVuZGVkKCBweFRDQiApICE9IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJdHJhY2VUQVNLX1JFU1VNRSggcHhUQ0IgKTsKKworCQkJCQkvKiBUaGUgcmVhZHkgbGlzdCBjYW4gYmUgYWNjZXNzZWQgZXZlbiBpZiB0aGUgc2NoZWR1bGVyIGlzCisJCQkJCXN1c3BlbmRlZCBiZWNhdXNlIHRoaXMgaXMgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkJCQkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAgJiggcHhUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKTsKKwkJCQkJcHJ2QWRkVGFza1RvUmVhZHlMaXN0KCBweFRDQiApOworCisJCQkJCS8qIEEgaGlnaGVyIHByaW9yaXR5IHRhc2sgbWF5IGhhdmUganVzdCBiZWVuIHJlc3VtZWQuICovCisJCQkJCWlmKCBweFRDQi0+dXhQcmlvcml0eSA+PSBweEN1cnJlbnRUQ0ItPnV4UHJpb3JpdHkgKQorCQkJCQl7CisJCQkJCQkvKiBUaGlzIHlpZWxkIG1heSBub3QgY2F1c2UgdGhlIHRhc2sganVzdCByZXN1bWVkIHRvIHJ1biwKKwkJCQkJCWJ1dCB3aWxsIGxlYXZlIHRoZSBsaXN0cyBpbiB0aGUgY29ycmVjdCBzdGF0ZSBmb3IgdGhlCisJCQkJCQluZXh0IHlpZWxkLiAqLworCQkJCQkJdGFza1lJRUxEX0lGX1VTSU5HX1BSRUVNUFRJT04oKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qIElOQ0xVREVfdlRhc2tTdXNwZW5kICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCAoIElOQ0xVREVfeFRhc2tSZXN1bWVGcm9tSVNSID09IDEgKSAmJiAoIElOQ0xVREVfdlRhc2tTdXNwZW5kID09IDEgKSApCisKKwlCYXNlVHlwZV90IHhUYXNrUmVzdW1lRnJvbUlTUiggVGFza0hhbmRsZV90IHhUYXNrVG9SZXN1bWUgKQorCXsKKwlCYXNlVHlwZV90IHhZaWVsZFJlcXVpcmVkID0gcGRGQUxTRTsKKwlUQ0JfdCAqIGNvbnN0IHB4VENCID0gKCBUQ0JfdCAqICkgeFRhc2tUb1Jlc3VtZTsKKwlVQmFzZVR5cGVfdCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzOworCisJCWNvbmZpZ0FTU0VSVCggeFRhc2tUb1Jlc3VtZSApOworCisJCS8qIFJUT1MgcG9ydHMgdGhhdCBzdXBwb3J0IGludGVycnVwdCBuZXN0aW5nIGhhdmUgdGhlIGNvbmNlcHQgb2YgYQorCQltYXhpbXVtCXN5c3RlbSBjYWxsIChvciBtYXhpbXVtIEFQSSBjYWxsKSBpbnRlcnJ1cHQgcHJpb3JpdHkuCisJCUludGVycnVwdHMgdGhhdCBhcmUJYWJvdmUgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkgYXJlIGtlZXAKKwkJcGVybWFuZW50bHkgZW5hYmxlZCwgZXZlbiB3aGVuIHRoZSBSVE9TIGtlcm5lbCBpcyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sCisJCWJ1dCBjYW5ub3QgbWFrZSBhbnkgY2FsbHMgdG8gRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucy4gIElmIGNvbmZpZ0FTU0VSVCgpCisJCWlzIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaCB0aGVuCisJCXBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSB3aWxsIHJlc3VsdCBpbiBhbiBhc3NlcnRpb24KKwkJZmFpbHVyZSBpZiBhIEZyZWVSVE9TIEFQSSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgdGhhdCBoYXMKKwkJYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlIHRoZSBjb25maWd1cmVkIG1heGltdW0gc3lzdGVtIGNhbGwKKwkJcHJpb3JpdHkuICBPbmx5IEZyZWVSVE9TIGZ1bmN0aW9ucyB0aGF0IGVuZCBpbiBGcm9tSVNSIGNhbiBiZSBjYWxsZWQKKwkJZnJvbSBpbnRlcnJ1cHRzCXRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgKGxvZ2ljYWxseSkKKwkJYmVsb3cgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgaW50ZXJydXB0IHByaW9yaXR5LiAgRnJlZVJUT1MgbWFpbnRhaW5zIGEKKwkJc2VwYXJhdGUgaW50ZXJydXB0IHNhZmUgQVBJIHRvIGVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgYXMKKwkJc2ltcGxlIGFzIHBvc3NpYmxlLiAgTW9yZSBpbmZvcm1hdGlvbiAoYWxiZWl0IENvcnRleC1NIHNwZWNpZmljKSBpcworCQlwcm92aWRlZCBvbiB0aGUgZm9sbG93aW5nIGxpbms6CisJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwkJcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpOworCisJCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CisJCXsKKwkJCWlmKCBwcnZUYXNrSXNUYXNrU3VzcGVuZGVkKCBweFRDQiApICE9IHBkRkFMU0UgKQorCQkJeworCQkJCXRyYWNlVEFTS19SRVNVTUVfRlJPTV9JU1IoIHB4VENCICk7CisKKwkJCQkvKiBDaGVjayB0aGUgcmVhZHkgbGlzdHMgY2FuIGJlIGFjY2Vzc2VkLiAqLworCQkJCWlmKCB1eFNjaGVkdWxlclN1c3BlbmRlZCA9PSAoIFVCYXNlVHlwZV90ICkgcGRGQUxTRSApCisJCQkJeworCQkJCQkvKiBSZWFkeSBsaXN0cyBjYW4gYmUgYWNjZXNzZWQgc28gbW92ZSB0aGUgdGFzayBmcm9tIHRoZQorCQkJCQlzdXNwZW5kZWQgbGlzdCB0byB0aGUgcmVhZHkgbGlzdCBkaXJlY3RseS4gKi8KKwkJCQkJaWYoIHB4VENCLT51eFByaW9yaXR5ID49IHB4Q3VycmVudFRDQi0+dXhQcmlvcml0eSApCisJCQkJCXsKKwkJCQkJCXhZaWVsZFJlcXVpcmVkID0gcGRUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisKKwkJCQkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApOworCQkJCQlwcnZBZGRUYXNrVG9SZWFkeUxpc3QoIHB4VENCICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIFRoZSBkZWxheWVkIG9yIHJlYWR5IGxpc3RzIGNhbm5vdCBiZSBhY2Nlc3NlZCBzbyB0aGUgdGFzaworCQkJCQlpcyBoZWxkIGluIHRoZSBwZW5kaW5nIHJlYWR5IGxpc3QgdW50aWwgdGhlIHNjaGVkdWxlciBpcworCQkJCQl1bnN1c3BlbmRlZC4gKi8KKwkJCQkJdkxpc3RJbnNlcnRFbmQoICYoIHhQZW5kaW5nUmVhZHlMaXN0ICksICYoIHB4VENCLT54RXZlbnRMaXN0SXRlbSApICk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgKTsKKworCQlyZXR1cm4geFlpZWxkUmVxdWlyZWQ7CisJfQorCisjZW5kaWYgLyogKCAoIElOQ0xVREVfeFRhc2tSZXN1bWVGcm9tSVNSID09IDEgKSAmJiAoIElOQ0xVREVfdlRhc2tTdXNwZW5kID09IDEgKSApICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2VGFza1N0YXJ0U2NoZWR1bGVyKCB2b2lkICkKK3sKK0Jhc2VUeXBlX3QgeFJldHVybjsKKworCS8qIEFkZCB0aGUgaWRsZSB0YXNrIGF0IHRoZSBsb3dlc3QgcHJpb3JpdHkuICovCisJI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCXsKKwkJU3RhdGljVGFza190ICpweElkbGVUYXNrVENCQnVmZmVyID0gTlVMTDsKKwkJU3RhY2tUeXBlX3QgKnB4SWRsZVRhc2tTdGFja0J1ZmZlciA9IE5VTEw7CisJCXVpbnQzMl90IHVsSWRsZVRhc2tTdGFja1NpemU7CisKKwkJLyogVGhlIElkbGUgdGFzayBpcyBjcmVhdGVkIHVzaW5nIHVzZXIgcHJvdmlkZWQgUkFNIC0gb2J0YWluIHRoZQorCQlhZGRyZXNzIG9mIHRoZSBSQU0gdGhlbiBjcmVhdGUgdGhlIGlkbGUgdGFzay4gKi8KKwkJdkFwcGxpY2F0aW9uR2V0SWRsZVRhc2tNZW1vcnkoICZweElkbGVUYXNrVENCQnVmZmVyLCAmcHhJZGxlVGFza1N0YWNrQnVmZmVyLCAmdWxJZGxlVGFza1N0YWNrU2l6ZSApOworCQl4SWRsZVRhc2tIYW5kbGUgPSB4VGFza0NyZWF0ZVN0YXRpYygJcHJ2SWRsZVRhc2ssCisJCQkJCQkJCQkJCQljb25maWdJRExFX1RBU0tfTkFNRSwKKwkJCQkJCQkJCQkJCXVsSWRsZVRhc2tTdGFja1NpemUsCisJCQkJCQkJCQkJCQkoIHZvaWQgKiApIE5VTEwsIC8qbGludCAhZTk2MS4gIFRoZSBjYXN0IGlzIG5vdCByZWR1bmRhbnQgZm9yIGFsbCBjb21waWxlcnMuICovCisJCQkJCQkJCQkJCQkoIHRza0lETEVfUFJJT1JJVFkgfCBwb3J0UFJJVklMRUdFX0JJVCApLAorCQkJCQkJCQkJCQkJcHhJZGxlVGFza1N0YWNrQnVmZmVyLAorCQkJCQkJCQkJCQkJcHhJZGxlVGFza1RDQkJ1ZmZlciApOyAvKmxpbnQgIWU5NjEgTUlTUkEgZXhjZXB0aW9uLCBqdXN0aWZpZWQgYXMgaXQgaXMgbm90IGEgcmVkdW5kYW50IGV4cGxpY2l0IGNhc3QgdG8gYWxsIHN1cHBvcnRlZCBjb21waWxlcnMuICovCisKKwkJaWYoIHhJZGxlVGFza0hhbmRsZSAhPSBOVUxMICkKKwkJeworCQkJeFJldHVybiA9IHBkUEFTUzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXhSZXR1cm4gPSBwZEZBSUw7CisJCX0KKwl9CisJI2Vsc2UKKwl7CisJCS8qIFRoZSBJZGxlIHRhc2sgaXMgYmVpbmcgY3JlYXRlZCB1c2luZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgUkFNLiAqLworCQl4UmV0dXJuID0geFRhc2tDcmVhdGUoCXBydklkbGVUYXNrLAorCQkJCQkJCQljb25maWdJRExFX1RBU0tfTkFNRSwKKwkJCQkJCQkJY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFLAorCQkJCQkJCQkoIHZvaWQgKiApIE5VTEwsCisJCQkJCQkJCSggdHNrSURMRV9QUklPUklUWSB8IHBvcnRQUklWSUxFR0VfQklUICksCisJCQkJCQkJCSZ4SWRsZVRhc2tIYW5kbGUgKTsgLypsaW50ICFlOTYxIE1JU1JBIGV4Y2VwdGlvbiwganVzdGlmaWVkIGFzIGl0IGlzIG5vdCBhIHJlZHVuZGFudCBleHBsaWNpdCBjYXN0IHRvIGFsbCBzdXBwb3J0ZWQgY29tcGlsZXJzLiAqLworCX0KKwkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAqLworCisJI2lmICggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkKKwl7CisJCWlmKCB4UmV0dXJuID09IHBkUEFTUyApCisJCXsKKwkJCXhSZXR1cm4gPSB4VGltZXJDcmVhdGVUaW1lclRhc2soKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKwkjZW5kaWYgLyogY29uZmlnVVNFX1RJTUVSUyAqLworCisJaWYoIHhSZXR1cm4gPT0gcGRQQVNTICkKKwl7CisJCS8qIGZyZWVydG9zX3Rhc2tzX2NfYWRkaXRpb25zX2luaXQoKSBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIHVzZXIKKwkJZGVmaW5hYmxlIG1hY3JvIEZSRUVSVE9TX1RBU0tTX0NfQURESVRJT05TX0lOSVQoKSBpcyBkZWZpbmVkLCBhcyB0aGF0IGlzCisJCXRoZSBvbmx5IG1hY3JvIGNhbGxlZCBieSB0aGUgZnVuY3Rpb24uICovCisJCSNpZmRlZiBGUkVFUlRPU19UQVNLU19DX0FERElUSU9OU19JTklUCisJCXsKKwkJCWZyZWVydG9zX3Rhc2tzX2NfYWRkaXRpb25zX2luaXQoKTsKKwkJfQorCQkjZW5kaWYKKworCQkvKiBJbnRlcnJ1cHRzIGFyZSB0dXJuZWQgb2ZmIGhlcmUsIHRvIGVuc3VyZSBhIHRpY2sgZG9lcyBub3Qgb2NjdXIKKwkJYmVmb3JlIG9yIGR1cmluZyB0aGUgY2FsbCB0byB4UG9ydFN0YXJ0U2NoZWR1bGVyKCkuICBUaGUgc3RhY2tzIG9mCisJCXRoZSBjcmVhdGVkIHRhc2tzIGNvbnRhaW4gYSBzdGF0dXMgd29yZCB3aXRoIGludGVycnVwdHMgc3dpdGNoZWQgb24KKwkJc28gaW50ZXJydXB0cyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IHJlLWVuYWJsZWQgd2hlbiB0aGUgZmlyc3QgdGFzaworCQlzdGFydHMgdG8gcnVuLiAqLworCQlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisKKwkJI2lmICggY29uZmlnVVNFX05FV0xJQl9SRUVOVFJBTlQgPT0gMSApCisJCXsKKwkJCS8qIFN3aXRjaCBOZXdsaWIncyBfaW1wdXJlX3B0ciB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgX3JlZW50CisJCQlzdHJ1Y3R1cmUgc3BlY2lmaWMgdG8gdGhlIHRhc2sgdGhhdCB3aWxsIHJ1biBmaXJzdC4gKi8KKwkJCV9pbXB1cmVfcHRyID0gJiggcHhDdXJyZW50VENCLT54TmV3TGliX3JlZW50ICk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ1VTRV9ORVdMSUJfUkVFTlRSQU5UICovCisKKwkJeE5leHRUYXNrVW5ibG9ja1RpbWUgPSBwb3J0TUFYX0RFTEFZOworCQl4U2NoZWR1bGVyUnVubmluZyA9IHBkVFJVRTsKKwkJeFRpY2tDb3VudCA9ICggVGlja1R5cGVfdCApIDBVOworCisJCS8qIElmIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTIGlzIGRlZmluZWQgdGhlbiB0aGUgZm9sbG93aW5nCisJCW1hY3JvIG11c3QgYmUgZGVmaW5lZCB0byBjb25maWd1cmUgdGhlIHRpbWVyL2NvdW50ZXIgdXNlZCB0byBnZW5lcmF0ZQorCQl0aGUgcnVuIHRpbWUgY291bnRlciB0aW1lIGJhc2UuICAgTk9URTogIElmIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTCisJCWlzIHNldCB0byAwIGFuZCB0aGUgZm9sbG93aW5nIGxpbmUgZmFpbHMgdG8gYnVpbGQgdGhlbiBlbnN1cmUgeW91IGRvIG5vdAorCQloYXZlIHBvcnRDT05GSUdVUkVfVElNRVJfRk9SX1JVTl9USU1FX1NUQVRTKCkgZGVmaW5lZCBpbiB5b3VyCisJCUZyZWVSVE9TQ29uZmlnLmggZmlsZS4gKi8KKwkJcG9ydENPTkZJR1VSRV9USU1FUl9GT1JfUlVOX1RJTUVfU1RBVFMoKTsKKworCQkvKiBTZXR0aW5nIHVwIHRoZSB0aW1lciB0aWNrIGlzIGhhcmR3YXJlIHNwZWNpZmljIGFuZCB0aHVzIGluIHRoZQorCQlwb3J0YWJsZSBpbnRlcmZhY2UuICovCisJCWlmKCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIFNob3VsZCBub3QgcmVhY2ggaGVyZSBhcyBpZiB0aGUgc2NoZWR1bGVyIGlzIHJ1bm5pbmcgdGhlCisJCQlmdW5jdGlvbiB3aWxsIG5vdCByZXR1cm4uICovCisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTaG91bGQgb25seSByZWFjaCBoZXJlIGlmIGEgdGFzayBjYWxscyB4VGFza0VuZFNjaGVkdWxlcigpLiAqLworCQl9CisJfQorCWVsc2UKKwl7CisJCS8qIFRoaXMgbGluZSB3aWxsIG9ubHkgYmUgcmVhY2hlZCBpZiB0aGUga2VybmVsIGNvdWxkIG5vdCBiZSBzdGFydGVkLAorCQliZWNhdXNlIHRoZXJlIHdhcyBub3QgZW5vdWdoIEZyZWVSVE9TIGhlYXAgdG8gY3JlYXRlIHRoZSBpZGxlIHRhc2sKKwkJb3IgdGhlIHRpbWVyIHRhc2suICovCisJCWNvbmZpZ0FTU0VSVCggeFJldHVybiAhPSBlcnJDT1VMRF9OT1RfQUxMT0NBVEVfUkVRVUlSRURfTUVNT1JZICk7CisJfQorCisJLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBpZiBJTkNMVURFX3hUYXNrR2V0SWRsZVRhc2tIYW5kbGUgaXMgc2V0IHRvIDAsCisJbWVhbmluZyB4SWRsZVRhc2tIYW5kbGUgaXMgbm90IHVzZWQgYW55d2hlcmUgZWxzZS4gKi8KKwkoIHZvaWQgKSB4SWRsZVRhc2tIYW5kbGU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2VGFza0VuZFNjaGVkdWxlciggdm9pZCApCit7CisJLyogU3RvcCB0aGUgc2NoZWR1bGVyIGludGVycnVwdHMgYW5kIGNhbGwgdGhlIHBvcnRhYmxlIHNjaGVkdWxlciBlbmQKKwlyb3V0aW5lIHNvIHRoZSBvcmlnaW5hbCBJU1JzIGNhbiBiZSByZXN0b3JlZCBpZiBuZWNlc3NhcnkuICBUaGUgcG9ydAorCWxheWVyIG11c3QgZW5zdXJlIGludGVycnVwdHMgZW5hYmxlCWJpdCBpcyBsZWZ0IGluIHRoZSBjb3JyZWN0IHN0YXRlLiAqLworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl4U2NoZWR1bGVyUnVubmluZyA9IHBkRkFMU0U7CisJdlBvcnRFbmRTY2hlZHVsZXIoKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlRhc2tTdXNwZW5kQWxsKCB2b2lkICkKK3sKKwkvKiBBIGNyaXRpY2FsIHNlY3Rpb24gaXMgbm90IHJlcXVpcmVkIGFzIHRoZSB2YXJpYWJsZSBpcyBvZiB0eXBlCisJQmFzZVR5cGVfdC4gIFBsZWFzZSByZWFkIFJpY2hhcmQgQmFycnkncyByZXBseSBpbiB0aGUgZm9sbG93aW5nIGxpbmsgdG8gYQorCXBvc3QgaW4gdGhlIEZyZWVSVE9TIHN1cHBvcnQgZm9ydW0gYmVmb3JlIHJlcG9ydGluZyB0aGlzIGFzIGEgYnVnISAtCisJaHR0cDovL2dvby5nbC93dTRhY3IgKi8KKwkrK3V4U2NoZWR1bGVyU3VzcGVuZGVkOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgIT0gMCApCisKKwlzdGF0aWMgVGlja1R5cGVfdCBwcnZHZXRFeHBlY3RlZElkbGVUaW1lKCB2b2lkICkKKwl7CisJVGlja1R5cGVfdCB4UmV0dXJuOworCVVCYXNlVHlwZV90IHV4SGlnaGVyUHJpb3JpdHlSZWFkeVRhc2tzID0gcGRGQUxTRTsKKworCQkvKiB1eEhpZ2hlclByaW9yaXR5UmVhZHlUYXNrcyB0YWtlcyBjYXJlIG9mIHRoZSBjYXNlIHdoZXJlCisJCWNvbmZpZ1VTRV9QUkVFTVBUSU9OIGlzIDAsIHNvIHRoZXJlIG1heSBiZSB0YXNrcyBhYm92ZSB0aGUgaWRsZSBwcmlvcml0eQorCQl0YXNrIHRoYXQgYXJlIGluIHRoZSBSZWFkeSBzdGF0ZSwgZXZlbiB0aG91Z2ggdGhlIGlkbGUgdGFzayBpcworCQlydW5uaW5nLiAqLworCQkjaWYoIGNvbmZpZ1VTRV9QT1JUX09QVElNSVNFRF9UQVNLX1NFTEVDVElPTiA9PSAwICkKKwkJeworCQkJaWYoIHV4VG9wUmVhZHlQcmlvcml0eSA+IHRza0lETEVfUFJJT1JJVFkgKQorCQkJeworCQkJCXV4SGlnaGVyUHJpb3JpdHlSZWFkeVRhc2tzID0gcGRUUlVFOworCQkJfQorCQl9CisJCSNlbHNlCisJCXsKKwkJCWNvbnN0IFVCYXNlVHlwZV90IHV4TGVhc3RTaWduaWZpY2FudEJpdCA9ICggVUJhc2VUeXBlX3QgKSAweDAxOworCisJCQkvKiBXaGVuIHBvcnQgb3B0aW1pc2VkIHRhc2sgc2VsZWN0aW9uIGlzIHVzZWQgdGhlIHV4VG9wUmVhZHlQcmlvcml0eQorCQkJdmFyaWFibGUgaXMgdXNlZCBhcyBhIGJpdCBtYXAuICBJZiBiaXRzIG90aGVyIHRoYW4gdGhlIGxlYXN0CisJCQlzaWduaWZpY2FudCBiaXQgYXJlIHNldCB0aGVuIHRoZXJlIGFyZSB0YXNrcyB0aGF0IGhhdmUgYSBwcmlvcml0eQorCQkJYWJvdmUgdGhlIGlkbGUgcHJpb3JpdHkgdGhhdCBhcmUgaW4gdGhlIFJlYWR5IHN0YXRlLiAgVGhpcyB0YWtlcworCQkJY2FyZSBvZiB0aGUgY2FzZSB3aGVyZSB0aGUgY28tb3BlcmF0aXZlIHNjaGVkdWxlciBpcyBpbiB1c2UuICovCisJCQlpZiggdXhUb3BSZWFkeVByaW9yaXR5ID4gdXhMZWFzdFNpZ25pZmljYW50Qml0ICkKKwkJCXsKKwkJCQl1eEhpZ2hlclByaW9yaXR5UmVhZHlUYXNrcyA9IHBkVFJVRTsKKwkJCX0KKwkJfQorCQkjZW5kaWYKKworCQlpZiggcHhDdXJyZW50VENCLT51eFByaW9yaXR5ID4gdHNrSURMRV9QUklPUklUWSApCisJCXsKKwkJCXhSZXR1cm4gPSAwOworCQl9CisJCWVsc2UgaWYoIGxpc3RDVVJSRU5UX0xJU1RfTEVOR1RIKCAmKCBweFJlYWR5VGFza3NMaXN0c1sgdHNrSURMRV9QUklPUklUWSBdICkgKSA+IDEgKQorCQl7CisJCQkvKiBUaGVyZSBhcmUgb3RoZXIgaWRsZSBwcmlvcml0eSB0YXNrcyBpbiB0aGUgcmVhZHkgc3RhdGUuICBJZgorCQkJdGltZSBzbGljaW5nIGlzIHVzZWQgdGhlbiB0aGUgdmVyeSBuZXh0IHRpY2sgaW50ZXJydXB0IG11c3QgYmUKKwkJCXByb2Nlc3NlZC4gKi8KKwkJCXhSZXR1cm4gPSAwOworCQl9CisJCWVsc2UgaWYoIHV4SGlnaGVyUHJpb3JpdHlSZWFkeVRhc2tzICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBUaGVyZSBhcmUgdGFza3MgaW4gdGhlIFJlYWR5IHN0YXRlIHRoYXQgaGF2ZSBhIHByaW9yaXR5IGFib3ZlIHRoZQorCQkJaWRsZSBwcmlvcml0eS4gIFRoaXMgcGF0aCBjYW4gb25seSBiZSByZWFjaGVkIGlmCisJCQljb25maWdVU0VfUFJFRU1QVElPTiBpcyAwLiAqLworCQkJeFJldHVybiA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4UmV0dXJuID0geE5leHRUYXNrVW5ibG9ja1RpbWUgLSB4VGlja0NvdW50OworCQl9CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFRhc2tSZXN1bWVBbGwoIHZvaWQgKQoreworVENCX3QgKnB4VENCID0gTlVMTDsKK0Jhc2VUeXBlX3QgeEFscmVhZHlZaWVsZGVkID0gcGRGQUxTRTsKKworCS8qIElmIHV4U2NoZWR1bGVyU3VzcGVuZGVkIGlzIHplcm8gdGhlbiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IG1hdGNoIGEKKwlwcmV2aW91cyBjYWxsIHRvIHZUYXNrU3VzcGVuZEFsbCgpLiAqLworCWNvbmZpZ0FTU0VSVCggdXhTY2hlZHVsZXJTdXNwZW5kZWQgKTsKKworCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgYW4gSVNSIGNhdXNlZCBhIHRhc2sgdG8gYmUgcmVtb3ZlZCBmcm9tIGFuIGV2ZW50CisJbGlzdCB3aGlsZSB0aGUgc2NoZWR1bGVyIHdhcyBzdXNwZW5kZWQuICBJZiB0aGlzIHdhcyB0aGUgY2FzZSB0aGVuIHRoZQorCXJlbW92ZWQgdGFzayB3aWxsIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgeFBlbmRpbmdSZWFkeUxpc3QuICBPbmNlIHRoZQorCXNjaGVkdWxlciBoYXMgYmVlbiByZXN1bWVkIGl0IGlzIHNhZmUgdG8gbW92ZSBhbGwgdGhlIHBlbmRpbmcgcmVhZHkKKwl0YXNrcyBmcm9tIHRoaXMgbGlzdCBpbnRvIHRoZWlyIGFwcHJvcHJpYXRlIHJlYWR5IGxpc3QuICovCisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJeworCQktLXV4U2NoZWR1bGVyU3VzcGVuZGVkOworCisJCWlmKCB1eFNjaGVkdWxlclN1c3BlbmRlZCA9PSAoIFVCYXNlVHlwZV90ICkgcGRGQUxTRSApCisJCXsKKwkJCWlmKCB1eEN1cnJlbnROdW1iZXJPZlRhc2tzID4gKCBVQmFzZVR5cGVfdCApIDBVICkKKwkJCXsKKwkJCQkvKiBNb3ZlIGFueSByZWFkaWVkIHRhc2tzIGZyb20gdGhlIHBlbmRpbmcgbGlzdCBpbnRvIHRoZQorCQkJCWFwcHJvcHJpYXRlIHJlYWR5IGxpc3QuICovCisJCQkJd2hpbGUoIGxpc3RMSVNUX0lTX0VNUFRZKCAmeFBlbmRpbmdSZWFkeUxpc3QgKSA9PSBwZEZBTFNFICkKKwkJCQl7CisJCQkJCXB4VENCID0gKCBUQ0JfdCAqICkgbGlzdEdFVF9PV05FUl9PRl9IRUFEX0VOVFJZKCAoICZ4UGVuZGluZ1JlYWR5TGlzdCApICk7CisJCQkJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhUQ0ItPnhFdmVudExpc3RJdGVtICkgKTsKKwkJCQkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApOworCQkJCQlwcnZBZGRUYXNrVG9SZWFkeUxpc3QoIHB4VENCICk7CisKKwkJCQkJLyogSWYgdGhlIG1vdmVkIHRhc2sgaGFzIGEgcHJpb3JpdHkgaGlnaGVyIHRoYW4gdGhlIGN1cnJlbnQKKwkJCQkJdGFzayB0aGVuIGEgeWllbGQgbXVzdCBiZSBwZXJmb3JtZWQuICovCisJCQkJCWlmKCBweFRDQi0+dXhQcmlvcml0eSA+PSBweEN1cnJlbnRUQ0ItPnV4UHJpb3JpdHkgKQorCQkJCQl7CisJCQkJCQl4WWllbGRQZW5kaW5nID0gcGRUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYoIHB4VENCICE9IE5VTEwgKQorCQkJCXsKKwkJCQkJLyogQSB0YXNrIHdhcyB1bmJsb2NrZWQgd2hpbGUgdGhlIHNjaGVkdWxlciB3YXMgc3VzcGVuZGVkLAorCQkJCQl3aGljaCBtYXkgaGF2ZSBwcmV2ZW50ZWQgdGhlIG5leHQgdW5ibG9jayB0aW1lIGZyb20gYmVpbmcKKwkJCQkJcmUtY2FsY3VsYXRlZCwgaW4gd2hpY2ggY2FzZSByZS1jYWxjdWxhdGUgaXQgbm93LiAgTWFpbmx5CisJCQkJCWltcG9ydGFudCBmb3IgbG93IHBvd2VyIHRpY2tsZXNzIGltcGxlbWVudGF0aW9ucywgd2hlcmUKKwkJCQkJdGhpcyBjYW4gcHJldmVudCBhbiB1bm5lY2Vzc2FyeSBleGl0IGZyb20gbG93IHBvd2VyCisJCQkJCXN0YXRlLiAqLworCQkJCQlwcnZSZXNldE5leHRUYXNrVW5ibG9ja1RpbWUoKTsKKwkJCQl9CisKKwkJCQkvKiBJZiBhbnkgdGlja3Mgb2NjdXJyZWQgd2hpbGUgdGhlIHNjaGVkdWxlciB3YXMgc3VzcGVuZGVkIHRoZW4KKwkJCQl0aGV5IHNob3VsZCBiZSBwcm9jZXNzZWQgbm93LiAgVGhpcyBlbnN1cmVzIHRoZSB0aWNrIGNvdW50IGRvZXMKKwkJCQlub3QJc2xpcCwgYW5kIHRoYXQgYW55IGRlbGF5ZWQgdGFza3MgYXJlIHJlc3VtZWQgYXQgdGhlIGNvcnJlY3QKKwkJCQl0aW1lLiAqLworCQkJCXsKKwkJCQkJVUJhc2VUeXBlX3QgdXhQZW5kZWRDb3VudHMgPSB1eFBlbmRlZFRpY2tzOyAvKiBOb24tdm9sYXRpbGUgY29weS4gKi8KKworCQkJCQlpZiggdXhQZW5kZWRDb3VudHMgPiAoIFVCYXNlVHlwZV90ICkgMFUgKQorCQkJCQl7CisJCQkJCQlkbworCQkJCQkJeworCQkJCQkJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJCQkJCQl7CisJCQkJCQkJCXhZaWVsZFBlbmRpbmcgPSBwZFRSVUU7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCQl9CisJCQkJCQkJLS11eFBlbmRlZENvdW50czsKKwkJCQkJCX0gd2hpbGUoIHV4UGVuZGVkQ291bnRzID4gKCBVQmFzZVR5cGVfdCApIDBVICk7CisKKwkJCQkJCXV4UGVuZGVkVGlja3MgPSAwOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYoIHhZaWVsZFBlbmRpbmcgIT0gcGRGQUxTRSApCisJCQkJeworCQkJCQkjaWYoIGNvbmZpZ1VTRV9QUkVFTVBUSU9OICE9IDAgKQorCQkJCQl7CisJCQkJCQl4QWxyZWFkeVlpZWxkZWQgPSBwZFRSVUU7CisJCQkJCX0KKwkJCQkJI2VuZGlmCisJCQkJCXRhc2tZSUVMRF9JRl9VU0lOR19QUkVFTVBUSU9OKCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisJdGFza0VYSVRfQ1JJVElDQUwoKTsKKworCXJldHVybiB4QWxyZWFkeVlpZWxkZWQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworVGlja1R5cGVfdCB4VGFza0dldFRpY2tDb3VudCggdm9pZCApCit7CitUaWNrVHlwZV90IHhUaWNrczsKKworCS8qIENyaXRpY2FsIHNlY3Rpb24gcmVxdWlyZWQgaWYgcnVubmluZyBvbiBhIDE2IGJpdCBwcm9jZXNzb3IuICovCisJcG9ydFRJQ0tfVFlQRV9FTlRFUl9DUklUSUNBTCgpOworCXsKKwkJeFRpY2tzID0geFRpY2tDb3VudDsKKwl9CisJcG9ydFRJQ0tfVFlQRV9FWElUX0NSSVRJQ0FMKCk7CisKKwlyZXR1cm4geFRpY2tzOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1RpY2tUeXBlX3QgeFRhc2tHZXRUaWNrQ291bnRGcm9tSVNSKCB2b2lkICkKK3sKK1RpY2tUeXBlX3QgeFJldHVybjsKK1VCYXNlVHlwZV90IHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXM7CisKKwkvKiBSVE9TIHBvcnRzIHRoYXQgc3VwcG9ydCBpbnRlcnJ1cHQgbmVzdGluZyBoYXZlIHRoZSBjb25jZXB0IG9mIGEgbWF4aW11bQorCXN5c3RlbSBjYWxsIChvciBtYXhpbXVtIEFQSSBjYWxsKSBpbnRlcnJ1cHQgcHJpb3JpdHkuICBJbnRlcnJ1cHRzIHRoYXQgYXJlCisJYWJvdmUgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkgYXJlIGtlcHQgcGVybWFuZW50bHkgZW5hYmxlZCwgZXZlbgorCXdoZW4gdGhlIFJUT1Mga2VybmVsIGlzIGluIGEgY3JpdGljYWwgc2VjdGlvbiwgYnV0IGNhbm5vdCBtYWtlIGFueSBjYWxscyB0bworCUZyZWVSVE9TIEFQSSBmdW5jdGlvbnMuICBJZiBjb25maWdBU1NFUlQoKSBpcyBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmgKKwl0aGVuIHBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSB3aWxsIHJlc3VsdCBpbiBhbiBhc3NlcnRpb24KKwlmYWlsdXJlIGlmIGEgRnJlZVJUT1MgQVBJIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCB0aGF0IGhhcyBiZWVuCisJYXNzaWduZWQgYSBwcmlvcml0eSBhYm92ZSB0aGUgY29uZmlndXJlZCBtYXhpbXVtIHN5c3RlbSBjYWxsIHByaW9yaXR5LgorCU9ubHkgRnJlZVJUT1MgZnVuY3Rpb25zIHRoYXQgZW5kIGluIEZyb21JU1IgY2FuIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdHMKKwl0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGF0IG9yIChsb2dpY2FsbHkpIGJlbG93IHRoZSBtYXhpbXVtCisJc3lzdGVtIGNhbGwJaW50ZXJydXB0IHByaW9yaXR5LiAgRnJlZVJUT1MgbWFpbnRhaW5zIGEgc2VwYXJhdGUgaW50ZXJydXB0CisJc2FmZSBBUEkgdG8gZW5zdXJlIGludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBhcyBzaW1wbGUgYXMgcG9zc2libGUuCisJTW9yZSBpbmZvcm1hdGlvbiAoYWxiZWl0IENvcnRleC1NIHNwZWNpZmljKSBpcyBwcm92aWRlZCBvbiB0aGUgZm9sbG93aW5nCisJbGluazogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCAqLworCXBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKTsKKworCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgPSBwb3J0VElDS19UWVBFX1NFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCXsKKwkJeFJldHVybiA9IHhUaWNrQ291bnQ7CisJfQorCXBvcnRUSUNLX1RZUEVfQ0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgKTsKKworCXJldHVybiB4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1VCYXNlVHlwZV90IHV4VGFza0dldE51bWJlck9mVGFza3MoIHZvaWQgKQoreworCS8qIEEgY3JpdGljYWwgc2VjdGlvbiBpcyBub3QgcmVxdWlyZWQgYmVjYXVzZSB0aGUgdmFyaWFibGVzIGFyZSBvZiB0eXBlCisJQmFzZVR5cGVfdC4gKi8KKwlyZXR1cm4gdXhDdXJyZW50TnVtYmVyT2ZUYXNrczsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitjaGFyICpwY1Rhc2tHZXROYW1lKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1F1ZXJ5ICkgLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCit7CitUQ0JfdCAqcHhUQ0I7CisKKwkvKiBJZiBudWxsIGlzIHBhc3NlZCBpbiBoZXJlIHRoZW4gdGhlIG5hbWUgb2YgdGhlIGNhbGxpbmcgdGFzayBpcyBiZWluZworCXF1ZXJpZWQuICovCisJcHhUQ0IgPSBwcnZHZXRUQ0JGcm9tSGFuZGxlKCB4VGFza1RvUXVlcnkgKTsKKwljb25maWdBU1NFUlQoIHB4VENCICk7CisJcmV0dXJuICYoIHB4VENCLT5wY1Rhc2tOYW1lWyAwIF0gKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBJTkNMVURFX3hUYXNrR2V0SGFuZGxlID09IDEgKQorCisJc3RhdGljIFRDQl90ICpwcnZTZWFyY2hGb3JOYW1lV2l0aGluU2luZ2xlTGlzdCggTGlzdF90ICpweExpc3QsIGNvbnN0IGNoYXIgcGNOYW1lVG9RdWVyeVtdICkKKwl7CisJVENCX3QgKnB4TmV4dFRDQiwgKnB4Rmlyc3RUQ0IsICpweFJldHVybiA9IE5VTEw7CisJVUJhc2VUeXBlX3QgeDsKKwljaGFyIGNOZXh0Q2hhcjsKKworCQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBzY2hlZHVsZXIgc3VzcGVuZGVkLiAqLworCisJCWlmKCBsaXN0Q1VSUkVOVF9MSVNUX0xFTkdUSCggcHhMaXN0ICkgPiAoIFVCYXNlVHlwZV90ICkgMCApCisJCXsKKwkJCWxpc3RHRVRfT1dORVJfT0ZfTkVYVF9FTlRSWSggcHhGaXJzdFRDQiwgcHhMaXN0ICk7CisKKwkJCWRvCisJCQl7CisJCQkJbGlzdEdFVF9PV05FUl9PRl9ORVhUX0VOVFJZKCBweE5leHRUQ0IsIHB4TGlzdCApOworCisJCQkJLyogQ2hlY2sgZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIG5hbWUgbG9va2luZyBmb3IgYSBtYXRjaCBvcgorCQkJCW1pc21hdGNoLiAqLworCQkJCWZvciggeCA9ICggVUJhc2VUeXBlX3QgKSAwOyB4IDwgKCBVQmFzZVR5cGVfdCApIGNvbmZpZ01BWF9UQVNLX05BTUVfTEVOOyB4KysgKQorCQkJCXsKKwkJCQkJY05leHRDaGFyID0gcHhOZXh0VENCLT5wY1Rhc2tOYW1lWyB4IF07CisKKwkJCQkJaWYoIGNOZXh0Q2hhciAhPSBwY05hbWVUb1F1ZXJ5WyB4IF0gKQorCQkJCQl7CisJCQkJCQkvKiBDaGFyYWN0ZXJzIGRpZG4ndCBtYXRjaC4gKi8KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWVsc2UgaWYoIGNOZXh0Q2hhciA9PSAweDAwICkKKwkJCQkJeworCQkJCQkJLyogQm90aCBzdHJpbmdzIHRlcm1pbmF0ZWQsIGEgbWF0Y2ggbXVzdCBoYXZlIGJlZW4KKwkJCQkJCWZvdW5kLiAqLworCQkJCQkJcHhSZXR1cm4gPSBweE5leHRUQ0I7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmKCBweFJldHVybiAhPSBOVUxMICkKKwkJCQl7CisJCQkJCS8qIFRoZSBoYW5kbGUgaGFzIGJlZW4gZm91bmQuICovCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfSB3aGlsZSggcHhOZXh0VENCICE9IHB4Rmlyc3RUQ0IgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCXJldHVybiBweFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBJTkNMVURFX3hUYXNrR2V0SGFuZGxlICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV94VGFza0dldEhhbmRsZSA9PSAxICkKKworCVRhc2tIYW5kbGVfdCB4VGFza0dldEhhbmRsZSggY29uc3QgY2hhciAqcGNOYW1lVG9RdWVyeSApIC8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworCXsKKwlVQmFzZVR5cGVfdCB1eFF1ZXVlID0gY29uZmlnTUFYX1BSSU9SSVRJRVM7CisJVENCX3QqIHB4VENCOworCisJCS8qIFRhc2sgbmFtZXMgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gY29uZmlnTUFYX1RBU0tfTkFNRV9MRU4gLSAxIGJ5dGVzLiAqLworCQljb25maWdBU1NFUlQoIHN0cmxlbiggcGNOYW1lVG9RdWVyeSApIDwgY29uZmlnTUFYX1RBU0tfTkFNRV9MRU4gKTsKKworCQl2VGFza1N1c3BlbmRBbGwoKTsKKwkJeworCQkJLyogU2VhcmNoIHRoZSByZWFkeSBsaXN0cy4gKi8KKwkJCWRvCisJCQl7CisJCQkJdXhRdWV1ZS0tOworCQkJCXB4VENCID0gcHJ2U2VhcmNoRm9yTmFtZVdpdGhpblNpbmdsZUxpc3QoICggTGlzdF90ICogKSAmKCBweFJlYWR5VGFza3NMaXN0c1sgdXhRdWV1ZSBdICksIHBjTmFtZVRvUXVlcnkgKTsKKworCQkJCWlmKCBweFRDQiAhPSBOVUxMICkKKwkJCQl7CisJCQkJCS8qIEZvdW5kIHRoZSBoYW5kbGUuICovCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfSB3aGlsZSggdXhRdWV1ZSA+ICggVUJhc2VUeXBlX3QgKSB0c2tJRExFX1BSSU9SSVRZICk7IC8qbGludCAhZTk2MSBNSVNSQSBleGNlcHRpb24gYXMgdGhlIGNhc3RzIGFyZSBvbmx5IHJlZHVuZGFudCBmb3Igc29tZSBwb3J0cy4gKi8KKworCQkJLyogU2VhcmNoIHRoZSBkZWxheWVkIGxpc3RzLiAqLworCQkJaWYoIHB4VENCID09IE5VTEwgKQorCQkJeworCQkJCXB4VENCID0gcHJ2U2VhcmNoRm9yTmFtZVdpdGhpblNpbmdsZUxpc3QoICggTGlzdF90ICogKSBweERlbGF5ZWRUYXNrTGlzdCwgcGNOYW1lVG9RdWVyeSApOworCQkJfQorCisJCQlpZiggcHhUQ0IgPT0gTlVMTCApCisJCQl7CisJCQkJcHhUQ0IgPSBwcnZTZWFyY2hGb3JOYW1lV2l0aGluU2luZ2xlTGlzdCggKCBMaXN0X3QgKiApIHB4T3ZlcmZsb3dEZWxheWVkVGFza0xpc3QsIHBjTmFtZVRvUXVlcnkgKTsKKwkJCX0KKworCQkJI2lmICggSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSApCisJCQl7CisJCQkJaWYoIHB4VENCID09IE5VTEwgKQorCQkJCXsKKwkJCQkJLyogU2VhcmNoIHRoZSBzdXNwZW5kZWQgbGlzdC4gKi8KKwkJCQkJcHhUQ0IgPSBwcnZTZWFyY2hGb3JOYW1lV2l0aGluU2luZ2xlTGlzdCggJnhTdXNwZW5kZWRUYXNrTGlzdCwgcGNOYW1lVG9RdWVyeSApOworCQkJCX0KKwkJCX0KKwkJCSNlbmRpZgorCisJCQkjaWYoIElOQ0xVREVfdlRhc2tEZWxldGUgPT0gMSApCisJCQl7CisJCQkJaWYoIHB4VENCID09IE5VTEwgKQorCQkJCXsKKwkJCQkJLyogU2VhcmNoIHRoZSBkZWxldGVkIGxpc3QuICovCisJCQkJCXB4VENCID0gcHJ2U2VhcmNoRm9yTmFtZVdpdGhpblNpbmdsZUxpc3QoICZ4VGFza3NXYWl0aW5nVGVybWluYXRpb24sIHBjTmFtZVRvUXVlcnkgKTsKKwkJCQl9CisJCQl9CisJCQkjZW5kaWYKKwkJfQorCQkoIHZvaWQgKSB4VGFza1Jlc3VtZUFsbCgpOworCisJCXJldHVybiAoIFRhc2tIYW5kbGVfdCApIHB4VENCOworCX0KKworI2VuZGlmIC8qIElOQ0xVREVfeFRhc2tHZXRIYW5kbGUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisKKwlVQmFzZVR5cGVfdCB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSggVGFza1N0YXR1c190ICogY29uc3QgcHhUYXNrU3RhdHVzQXJyYXksIGNvbnN0IFVCYXNlVHlwZV90IHV4QXJyYXlTaXplLCB1aW50MzJfdCAqIGNvbnN0IHB1bFRvdGFsUnVuVGltZSApCisJeworCVVCYXNlVHlwZV90IHV4VGFzayA9IDAsIHV4UXVldWUgPSBjb25maWdNQVhfUFJJT1JJVElFUzsKKworCQl2VGFza1N1c3BlbmRBbGwoKTsKKwkJeworCQkJLyogSXMgdGhlcmUgYSBzcGFjZSBpbiB0aGUgYXJyYXkgZm9yIGVhY2ggdGFzayBpbiB0aGUgc3lzdGVtPyAqLworCQkJaWYoIHV4QXJyYXlTaXplID49IHV4Q3VycmVudE51bWJlck9mVGFza3MgKQorCQkJeworCQkJCS8qIEZpbGwgaW4gYW4gVGFza1N0YXR1c190IHN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uIG9uIGVhY2gKKwkJCQl0YXNrIGluIHRoZSBSZWFkeSBzdGF0ZS4gKi8KKwkJCQlkbworCQkJCXsKKwkJCQkJdXhRdWV1ZS0tOworCQkJCQl1eFRhc2sgKz0gcHJ2TGlzdFRhc2tzV2l0aGluU2luZ2xlTGlzdCggJiggcHhUYXNrU3RhdHVzQXJyYXlbIHV4VGFzayBdICksICYoIHB4UmVhZHlUYXNrc0xpc3RzWyB1eFF1ZXVlIF0gKSwgZVJlYWR5ICk7CisKKwkJCQl9IHdoaWxlKCB1eFF1ZXVlID4gKCBVQmFzZVR5cGVfdCApIHRza0lETEVfUFJJT1JJVFkgKTsgLypsaW50ICFlOTYxIE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBvcnRzLiAqLworCisJCQkJLyogRmlsbCBpbiBhbiBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gb24gZWFjaAorCQkJCXRhc2sgaW4gdGhlIEJsb2NrZWQgc3RhdGUuICovCisJCQkJdXhUYXNrICs9IHBydkxpc3RUYXNrc1dpdGhpblNpbmdsZUxpc3QoICYoIHB4VGFza1N0YXR1c0FycmF5WyB1eFRhc2sgXSApLCAoIExpc3RfdCAqICkgcHhEZWxheWVkVGFza0xpc3QsIGVCbG9ja2VkICk7CisJCQkJdXhUYXNrICs9IHBydkxpc3RUYXNrc1dpdGhpblNpbmdsZUxpc3QoICYoIHB4VGFza1N0YXR1c0FycmF5WyB1eFRhc2sgXSApLCAoIExpc3RfdCAqICkgcHhPdmVyZmxvd0RlbGF5ZWRUYXNrTGlzdCwgZUJsb2NrZWQgKTsKKworCQkJCSNpZiggSU5DTFVERV92VGFza0RlbGV0ZSA9PSAxICkKKwkJCQl7CisJCQkJCS8qIEZpbGwgaW4gYW4gVGFza1N0YXR1c190IHN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uIG9uCisJCQkJCWVhY2ggdGFzayB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQgYnV0IG5vdCB5ZXQgY2xlYW5lZCB1cC4gKi8KKwkJCQkJdXhUYXNrICs9IHBydkxpc3RUYXNrc1dpdGhpblNpbmdsZUxpc3QoICYoIHB4VGFza1N0YXR1c0FycmF5WyB1eFRhc2sgXSApLCAmeFRhc2tzV2FpdGluZ1Rlcm1pbmF0aW9uLCBlRGVsZXRlZCApOworCQkJCX0KKwkJCQkjZW5kaWYKKworCQkJCSNpZiAoIElOQ0xVREVfdlRhc2tTdXNwZW5kID09IDEgKQorCQkJCXsKKwkJCQkJLyogRmlsbCBpbiBhbiBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gb24KKwkJCQkJZWFjaCB0YXNrIGluIHRoZSBTdXNwZW5kZWQgc3RhdGUuICovCisJCQkJCXV4VGFzayArPSBwcnZMaXN0VGFza3NXaXRoaW5TaW5nbGVMaXN0KCAmKCBweFRhc2tTdGF0dXNBcnJheVsgdXhUYXNrIF0gKSwgJnhTdXNwZW5kZWRUYXNrTGlzdCwgZVN1c3BlbmRlZCApOworCQkJCX0KKwkJCQkjZW5kaWYKKworCQkJCSNpZiAoIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTID09IDEpCisJCQkJeworCQkJCQlpZiggcHVsVG90YWxSdW5UaW1lICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQkjaWZkZWYgcG9ydEFMVF9HRVRfUlVOX1RJTUVfQ09VTlRFUl9WQUxVRQorCQkJCQkJCXBvcnRBTFRfR0VUX1JVTl9USU1FX0NPVU5URVJfVkFMVUUoICggKnB1bFRvdGFsUnVuVGltZSApICk7CisJCQkJCQkjZWxzZQorCQkJCQkJCSpwdWxUb3RhbFJ1blRpbWUgPSBwb3J0R0VUX1JVTl9USU1FX0NPVU5URVJfVkFMVUUoKTsKKwkJCQkJCSNlbmRpZgorCQkJCQl9CisJCQkJfQorCQkJCSNlbHNlCisJCQkJeworCQkJCQlpZiggcHVsVG90YWxSdW5UaW1lICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQkqcHVsVG90YWxSdW5UaW1lID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQkjZW5kaWYKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKworCQlyZXR1cm4gdXhUYXNrOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV94VGFza0dldElkbGVUYXNrSGFuZGxlID09IDEgKQorCisJVGFza0hhbmRsZV90IHhUYXNrR2V0SWRsZVRhc2tIYW5kbGUoIHZvaWQgKQorCXsKKwkJLyogSWYgeFRhc2tHZXRJZGxlVGFza0hhbmRsZSgpIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHNjaGVkdWxlciBoYXMgYmVlbgorCQlzdGFydGVkLCB0aGVuIHhJZGxlVGFza0hhbmRsZSB3aWxsIGJlIE5VTEwuICovCisJCWNvbmZpZ0FTU0VSVCggKCB4SWRsZVRhc2tIYW5kbGUgIT0gTlVMTCApICk7CisJCXJldHVybiB4SWRsZVRhc2tIYW5kbGU7CisJfQorCisjZW5kaWYgLyogSU5DTFVERV94VGFza0dldElkbGVUYXNrSGFuZGxlICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGlzIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHNob3VsZCB1c2UgaW5lcXVhbGl0eSB0byAwLCBub3QgZXF1YWxpdHkgdG8gMS4KK1RoaXMgaXMgdG8gZW5zdXJlIHZUYXNrU3RlcFRpY2soKSBpcyBhdmFpbGFibGUgd2hlbiB1c2VyIGRlZmluZWQgbG93IHBvd2VyIG1vZGUKK2ltcGxlbWVudGF0aW9ucyByZXF1aXJlIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFIHRvIGJlIHNldCB0byBhIHZhbHVlIG90aGVyIHRoYW4KKzEuICovCisjaWYgKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSAhPSAwICkKKworCXZvaWQgdlRhc2tTdGVwVGljayggY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb0p1bXAgKQorCXsKKwkJLyogQ29ycmVjdCB0aGUgdGljayBjb3VudCB2YWx1ZSBhZnRlciBhIHBlcmlvZCBkdXJpbmcgd2hpY2ggdGhlIHRpY2sKKwkJd2FzIHN1cHByZXNzZWQuICBOb3RlIHRoaXMgZG9lcyAqbm90KiBjYWxsIHRoZSB0aWNrIGhvb2sgZnVuY3Rpb24gZm9yCisJCWVhY2ggc3RlcHBlZCB0aWNrLiAqLworCQljb25maWdBU1NFUlQoICggeFRpY2tDb3VudCArIHhUaWNrc1RvSnVtcCApIDw9IHhOZXh0VGFza1VuYmxvY2tUaW1lICk7CisJCXhUaWNrQ291bnQgKz0geFRpY2tzVG9KdW1wOworCQl0cmFjZUlOQ1JFQVNFX1RJQ0tfQ09VTlQoIHhUaWNrc1RvSnVtcCApOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBJTkNMVURFX3hUYXNrQWJvcnREZWxheSA9PSAxICkKKworCUJhc2VUeXBlX3QgeFRhc2tBYm9ydERlbGF5KCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCXsKKwlUQ0JfdCAqcHhUQ0IgPSAoIFRDQl90ICogKSB4VGFzazsKKwlCYXNlVHlwZV90IHhSZXR1cm47CisKKwkJY29uZmlnQVNTRVJUKCBweFRDQiApOworCisJCXZUYXNrU3VzcGVuZEFsbCgpOworCQl7CisJCQkvKiBBIHRhc2sgY2FuIG9ubHkgYmUgcHJlbWF0dXJlbHkgcmVtb3ZlZCBmcm9tIHRoZSBCbG9ja2VkIHN0YXRlIGlmCisJCQlpdCBpcyBhY3R1YWxseSBpbiB0aGUgQmxvY2tlZCBzdGF0ZS4gKi8KKwkJCWlmKCBlVGFza0dldFN0YXRlKCB4VGFzayApID09IGVCbG9ja2VkICkKKwkJCXsKKwkJCQl4UmV0dXJuID0gcGRQQVNTOworCisJCQkJLyogUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHRhc2sgZnJvbSB0aGUgYmxvY2tlZCBsaXN0LiAgQW4KKwkJCQlpbnRlcnJ1cHQgd29uJ3QgdG91Y2ggdGhlIHhTdGF0ZUxpc3RJdGVtIGJlY2F1c2UgdGhlCisJCQkJc2NoZWR1bGVyIGlzIHN1c3BlbmRlZC4gKi8KKwkJCQkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICYoIHB4VENCLT54U3RhdGVMaXN0SXRlbSApICk7CisKKwkJCQkvKiBJcyB0aGUgdGFzayB3YWl0aW5nIG9uIGFuIGV2ZW50IGFsc28/ICBJZiBzbyByZW1vdmUgaXQgZnJvbQorCQkJCXRoZSBldmVudCBsaXN0IHRvby4gIEludGVycnVwdHMgY2FuIHRvdWNoIHRoZSBldmVudCBsaXN0IGl0ZW0sCisJCQkJZXZlbiB0aG91Z2ggdGhlIHNjaGVkdWxlciBpcyBzdXNwZW5kZWQsIHNvIGEgY3JpdGljYWwgc2VjdGlvbgorCQkJCWlzIHVzZWQuICovCisJCQkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJCQkJeworCQkJCQlpZiggbGlzdExJU1RfSVRFTV9DT05UQUlORVIoICYoIHB4VENCLT54RXZlbnRMaXN0SXRlbSApICkgIT0gTlVMTCApCisJCQkJCXsKKwkJCQkJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhUQ0ItPnhFdmVudExpc3RJdGVtICkgKTsKKwkJCQkJCXB4VENCLT51Y0RlbGF5QWJvcnRlZCA9IHBkVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJCQkJLyogUGxhY2UgdGhlIHVuYmxvY2tlZCB0YXNrIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlYWR5IGxpc3QuICovCisJCQkJcHJ2QWRkVGFza1RvUmVhZHlMaXN0KCBweFRDQiApOworCisJCQkJLyogQSB0YXNrIGJlaW5nIHVuYmxvY2tlZCBjYW5ub3QgY2F1c2UgYW4gaW1tZWRpYXRlIGNvbnRleHQKKwkJCQlzd2l0Y2ggaWYgcHJlZW1wdGlvbiBpcyB0dXJuZWQgb2ZmLiAqLworCQkJCSNpZiAoICBjb25maWdVU0VfUFJFRU1QVElPTiA9PSAxICkKKwkJCQl7CisJCQkJCS8qIFByZWVtcHRpb24gaXMgb24sIGJ1dCBhIGNvbnRleHQgc3dpdGNoIHNob3VsZCBvbmx5IGJlCisJCQkJCXBlcmZvcm1lZCBpZiB0aGUgdW5ibG9ja2VkIHRhc2sgaGFzIGEgcHJpb3JpdHkgdGhhdCBpcworCQkJCQllcXVhbCB0byBvciBoaWdoZXIgdGhhbiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrLiAqLworCQkJCQlpZiggcHhUQ0ItPnV4UHJpb3JpdHkgPiBweEN1cnJlbnRUQ0ItPnV4UHJpb3JpdHkgKQorCQkJCQl7CisJCQkJCQkvKiBQZW5kIHRoZSB5aWVsZCB0byBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgc2NoZWR1bGVyCisJCQkJCQlpcyB1bnN1c3BlbmRlZC4gKi8KKwkJCQkJCXhZaWVsZFBlbmRpbmcgPSBwZFRSVUU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJI2VuZGlmIC8qIGNvbmZpZ1VTRV9QUkVFTVBUSU9OICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJeFJldHVybiA9IHBkRkFJTDsKKwkJCX0KKwkJfQorCQkoIHZvaWQgKSB4VGFza1Jlc3VtZUFsbCgpOworCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIElOQ0xVREVfeFRhc2tBYm9ydERlbGF5ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhUYXNrSW5jcmVtZW50VGljayggdm9pZCApCit7CitUQ0JfdCAqIHB4VENCOworVGlja1R5cGVfdCB4SXRlbVZhbHVlOworQmFzZVR5cGVfdCB4U3dpdGNoUmVxdWlyZWQgPSBwZEZBTFNFOworCisJLyogQ2FsbGVkIGJ5IHRoZSBwb3J0YWJsZSBsYXllciBlYWNoIHRpbWUgYSB0aWNrIGludGVycnVwdCBvY2N1cnMuCisJSW5jcmVtZW50cyB0aGUgdGljayB0aGVuIGNoZWNrcyB0byBzZWUgaWYgdGhlIG5ldyB0aWNrIHZhbHVlIHdpbGwgY2F1c2UgYW55CisJdGFza3MgdG8gYmUgdW5ibG9ja2VkLiAqLworCXRyYWNlVEFTS19JTkNSRU1FTlRfVElDSyggeFRpY2tDb3VudCApOworCWlmKCB1eFNjaGVkdWxlclN1c3BlbmRlZCA9PSAoIFVCYXNlVHlwZV90ICkgcGRGQUxTRSApCisJeworCQkvKiBNaW5vciBvcHRpbWlzYXRpb24uICBUaGUgdGljayBjb3VudCBjYW5ub3QgY2hhbmdlIGluIHRoaXMKKwkJYmxvY2suICovCisJCWNvbnN0IFRpY2tUeXBlX3QgeENvbnN0VGlja0NvdW50ID0geFRpY2tDb3VudCArICggVGlja1R5cGVfdCApIDE7CisKKwkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2ssIHN3aXRjaGluZyB0aGUgZGVsYXllZCBhbmQgb3ZlcmZsb3dlZAorCQlkZWxheWVkIGxpc3RzIGlmIGl0IHdyYXBzIHRvIDAuICovCisJCXhUaWNrQ291bnQgPSB4Q29uc3RUaWNrQ291bnQ7CisKKwkJaWYoIHhDb25zdFRpY2tDb3VudCA9PSAoIFRpY2tUeXBlX3QgKSAwVSApIC8qbGludCAhZTc3NCAnaWYnIGRvZXMgbm90IGFsd2F5cyBldmFsdWF0ZSB0byBmYWxzZSBhcyBpdCBpcyBsb29raW5nIGZvciBhbiBvdmVyZmxvdy4gKi8KKwkJeworCQkJdGFza1NXSVRDSF9ERUxBWUVEX0xJU1RTKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKworCQkvKiBTZWUgaWYgdGhpcyB0aWNrIGhhcyBtYWRlIGEgdGltZW91dCBleHBpcmUuICBUYXNrcyBhcmUgc3RvcmVkIGluCisJCXRoZQlxdWV1ZSBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgd2FrZSB0aW1lIC0gbWVhbmluZyBvbmNlIG9uZSB0YXNrCisJCWhhcyBiZWVuIGZvdW5kIHdob3NlIGJsb2NrIHRpbWUgaGFzIG5vdCBleHBpcmVkIHRoZXJlIGlzIG5vIG5lZWQgdG8KKwkJbG9vayBhbnkgZnVydGhlciBkb3duIHRoZSBsaXN0LiAqLworCQlpZiggeENvbnN0VGlja0NvdW50ID49IHhOZXh0VGFza1VuYmxvY2tUaW1lICkKKwkJeworCQkJZm9yKCA7OyApCisJCQl7CisJCQkJaWYoIGxpc3RMSVNUX0lTX0VNUFRZKCBweERlbGF5ZWRUYXNrTGlzdCApICE9IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJLyogVGhlIGRlbGF5ZWQgbGlzdCBpcyBlbXB0eS4gIFNldCB4TmV4dFRhc2tVbmJsb2NrVGltZQorCQkJCQl0byB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSBzbyBpdCBpcyBleHRyZW1lbHkKKwkJCQkJdW5saWtlbHkgdGhhdCB0aGUKKwkJCQkJaWYoIHhUaWNrQ291bnQgPj0geE5leHRUYXNrVW5ibG9ja1RpbWUgKSB0ZXN0IHdpbGwgcGFzcworCQkJCQluZXh0IHRpbWUgdGhyb3VnaC4gKi8KKwkJCQkJeE5leHRUYXNrVW5ibG9ja1RpbWUgPSBwb3J0TUFYX0RFTEFZOyAvKmxpbnQgIWU5NjEgTUlTUkEgZXhjZXB0aW9uIGFzIHRoZSBjYXN0cyBhcmUgb25seSByZWR1bmRhbnQgZm9yIHNvbWUgcG9ydHMuICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBUaGUgZGVsYXllZCBsaXN0IGlzIG5vdCBlbXB0eSwgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUKKwkJCQkJaXRlbSBhdCB0aGUgaGVhZCBvZiB0aGUgZGVsYXllZCBsaXN0LiAgVGhpcyBpcyB0aGUgdGltZQorCQkJCQlhdCB3aGljaCB0aGUgdGFzayBhdCB0aGUgaGVhZCBvZiB0aGUgZGVsYXllZCBsaXN0IG11c3QKKwkJCQkJYmUgcmVtb3ZlZCBmcm9tIHRoZSBCbG9ja2VkIHN0YXRlLiAqLworCQkJCQlweFRDQiA9ICggVENCX3QgKiApIGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggcHhEZWxheWVkVGFza0xpc3QgKTsKKwkJCQkJeEl0ZW1WYWx1ZSA9IGxpc3RHRVRfTElTVF9JVEVNX1ZBTFVFKCAmKCBweFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApOworCisJCQkJCWlmKCB4Q29uc3RUaWNrQ291bnQgPCB4SXRlbVZhbHVlICkKKwkJCQkJeworCQkJCQkJLyogSXQgaXMgbm90IHRpbWUgdG8gdW5ibG9jayB0aGlzIGl0ZW0geWV0LCBidXQgdGhlCisJCQkJCQlpdGVtIHZhbHVlIGlzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSB0YXNrIGF0IHRoZSBoZWFkCisJCQkJCQlvZiB0aGUgYmxvY2tlZCBsaXN0IG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBCbG9ja2VkCisJCQkJCQlzdGF0ZSAtCXNvIHJlY29yZCB0aGUgaXRlbSB2YWx1ZSBpbgorCQkJCQkJeE5leHRUYXNrVW5ibG9ja1RpbWUuICovCisJCQkJCQl4TmV4dFRhc2tVbmJsb2NrVGltZSA9IHhJdGVtVmFsdWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCisJCQkJCS8qIEl0IGlzIHRpbWUgdG8gcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIEJsb2NrZWQgc3RhdGUuICovCisJCQkJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKTsKKworCQkJCQkvKiBJcyB0aGUgdGFzayB3YWl0aW5nIG9uIGFuIGV2ZW50IGFsc28/ICBJZiBzbyByZW1vdmUKKwkJCQkJaXQgZnJvbSB0aGUgZXZlbnQgbGlzdC4gKi8KKwkJCQkJaWYoIGxpc3RMSVNUX0lURU1fQ09OVEFJTkVSKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICYoIHB4VENCLT54RXZlbnRMaXN0SXRlbSApICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKworCQkJCQkvKiBQbGFjZSB0aGUgdW5ibG9ja2VkIHRhc2sgaW50byB0aGUgYXBwcm9wcmlhdGUgcmVhZHkKKwkJCQkJbGlzdC4gKi8KKwkJCQkJcHJ2QWRkVGFza1RvUmVhZHlMaXN0KCBweFRDQiApOworCisJCQkJCS8qIEEgdGFzayBiZWluZyB1bmJsb2NrZWQgY2Fubm90IGNhdXNlIGFuIGltbWVkaWF0ZQorCQkJCQljb250ZXh0IHN3aXRjaCBpZiBwcmVlbXB0aW9uIGlzIHR1cm5lZCBvZmYuICovCisJCQkJCSNpZiAoICBjb25maWdVU0VfUFJFRU1QVElPTiA9PSAxICkKKwkJCQkJeworCQkJCQkJLyogUHJlZW1wdGlvbiBpcyBvbiwgYnV0IGEgY29udGV4dCBzd2l0Y2ggc2hvdWxkCisJCQkJCQlvbmx5IGJlIHBlcmZvcm1lZCBpZiB0aGUgdW5ibG9ja2VkIHRhc2sgaGFzIGEKKwkJCQkJCXByaW9yaXR5IHRoYXQgaXMgZXF1YWwgdG8gb3IgaGlnaGVyIHRoYW4gdGhlCisJCQkJCQljdXJyZW50bHkgZXhlY3V0aW5nIHRhc2suICovCisJCQkJCQlpZiggcHhUQ0ItPnV4UHJpb3JpdHkgPj0gcHhDdXJyZW50VENCLT51eFByaW9yaXR5ICkKKwkJCQkJCXsKKwkJCQkJCQl4U3dpdGNoUmVxdWlyZWQgPSBwZFRSVUU7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCSNlbmRpZiAvKiBjb25maWdVU0VfUFJFRU1QVElPTiAqLworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIFRhc2tzIG9mIGVxdWFsIHByaW9yaXR5IHRvIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrIHdpbGwgc2hhcmUKKwkJcHJvY2Vzc2luZyB0aW1lICh0aW1lIHNsaWNlKSBpZiBwcmVlbXB0aW9uIGlzIG9uLCBhbmQgdGhlIGFwcGxpY2F0aW9uCisJCXdyaXRlciBoYXMgbm90IGV4cGxpY2l0bHkgdHVybmVkIHRpbWUgc2xpY2luZyBvZmYuICovCisJCSNpZiAoICggY29uZmlnVVNFX1BSRUVNUFRJT04gPT0gMSApICYmICggY29uZmlnVVNFX1RJTUVfU0xJQ0lORyA9PSAxICkgKQorCQl7CisJCQlpZiggbGlzdENVUlJFTlRfTElTVF9MRU5HVEgoICYoIHB4UmVhZHlUYXNrc0xpc3RzWyBweEN1cnJlbnRUQ0ItPnV4UHJpb3JpdHkgXSApICkgPiAoIFVCYXNlVHlwZV90ICkgMSApCisJCQl7CisJCQkJeFN3aXRjaFJlcXVpcmVkID0gcGRUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQkjZW5kaWYgLyogKCAoIGNvbmZpZ1VTRV9QUkVFTVBUSU9OID09IDEgKSAmJiAoIGNvbmZpZ1VTRV9USU1FX1NMSUNJTkcgPT0gMSApICkgKi8KKworCQkjaWYgKCBjb25maWdVU0VfVElDS19IT09LID09IDEgKQorCQl7CisJCQkvKiBHdWFyZCBhZ2FpbnN0IHRoZSB0aWNrIGhvb2sgYmVpbmcgY2FsbGVkIHdoZW4gdGhlIHBlbmRlZCB0aWNrCisJCQljb3VudCBpcyBiZWluZyB1bndvdW5kICh3aGVuIHRoZSBzY2hlZHVsZXIgaXMgYmVpbmcgdW5sb2NrZWQpLiAqLworCQkJaWYoIHV4UGVuZGVkVGlja3MgPT0gKCBVQmFzZVR5cGVfdCApIDBVICkKKwkJCXsKKwkJCQl2QXBwbGljYXRpb25UaWNrSG9vaygpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tfSE9PSyAqLworCX0KKwllbHNlCisJeworCQkrK3V4UGVuZGVkVGlja3M7CisKKwkJLyogVGhlIHRpY2sgaG9vayBnZXRzIGNhbGxlZCBhdCByZWd1bGFyIGludGVydmFscywgZXZlbiBpZiB0aGUKKwkJc2NoZWR1bGVyIGlzIGxvY2tlZC4gKi8KKwkJI2lmICggY29uZmlnVVNFX1RJQ0tfSE9PSyA9PSAxICkKKwkJeworCQkJdkFwcGxpY2F0aW9uVGlja0hvb2soKTsKKwkJfQorCQkjZW5kaWYKKwl9CisKKwkjaWYgKCBjb25maWdVU0VfUFJFRU1QVElPTiA9PSAxICkKKwl7CisJCWlmKCB4WWllbGRQZW5kaW5nICE9IHBkRkFMU0UgKQorCQl7CisJCQl4U3dpdGNoUmVxdWlyZWQgPSBwZFRSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisJI2VuZGlmIC8qIGNvbmZpZ1VTRV9QUkVFTVBUSU9OICovCisKKwlyZXR1cm4geFN3aXRjaFJlcXVpcmVkOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyA9PSAxICkKKworCXZvaWQgdlRhc2tTZXRBcHBsaWNhdGlvblRhc2tUYWcoIFRhc2tIYW5kbGVfdCB4VGFzaywgVGFza0hvb2tGdW5jdGlvbl90IHB4SG9va0Z1bmN0aW9uICkKKwl7CisJVENCX3QgKnhUQ0I7CisKKwkJLyogSWYgeFRhc2sgaXMgTlVMTCB0aGVuIGl0IGlzIHRoZSB0YXNrIGhvb2sgb2YgdGhlIGNhbGxpbmcgdGFzayB0aGF0IGlzCisJCWdldHRpbmcgc2V0LiAqLworCQlpZiggeFRhc2sgPT0gTlVMTCApCisJCXsKKwkJCXhUQ0IgPSAoIFRDQl90ICogKSBweEN1cnJlbnRUQ0I7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4VENCID0gKCBUQ0JfdCAqICkgeFRhc2s7CisJCX0KKworCQkvKiBTYXZlIHRoZSBob29rIGZ1bmN0aW9uIGluIHRoZSBUQ0IuICBBIGNyaXRpY2FsIHNlY3Rpb24gaXMgcmVxdWlyZWQgYXMKKwkJdGhlIHZhbHVlIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIGFuIGludGVycnVwdC4gKi8KKwkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJCQl4VENCLT5weFRhc2tUYWcgPSBweEhvb2tGdW5jdGlvbjsKKwkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgPT0gMSApCisKKwlUYXNrSG9va0Z1bmN0aW9uX3QgeFRhc2tHZXRBcHBsaWNhdGlvblRhc2tUYWcoIFRhc2tIYW5kbGVfdCB4VGFzayApCisJeworCVRDQl90ICp4VENCOworCVRhc2tIb29rRnVuY3Rpb25fdCB4UmV0dXJuOworCisJCS8qIElmIHhUYXNrIGlzIE5VTEwgdGhlbiB3ZSBhcmUgc2V0dGluZyBvdXIgb3duIHRhc2sgaG9vay4gKi8KKwkJaWYoIHhUYXNrID09IE5VTEwgKQorCQl7CisJCQl4VENCID0gKCBUQ0JfdCAqICkgcHhDdXJyZW50VENCOworCQl9CisJCWVsc2UKKwkJeworCQkJeFRDQiA9ICggVENCX3QgKiApIHhUYXNrOworCQl9CisKKwkJLyogU2F2ZSB0aGUgaG9vayBmdW5jdGlvbiBpbiB0aGUgVENCLiAgQSBjcml0aWNhbCBzZWN0aW9uIGlzIHJlcXVpcmVkIGFzCisJCXRoZSB2YWx1ZSBjYW4gYmUgYWNjZXNzZWQgZnJvbSBhbiBpbnRlcnJ1cHQuICovCisJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQl7CisJCQl4UmV0dXJuID0geFRDQi0+cHhUYXNrVGFnOworCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX0FQUExJQ0FUSU9OX1RBU0tfVEFHICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX0FQUExJQ0FUSU9OX1RBU0tfVEFHID09IDEgKQorCisJQmFzZVR5cGVfdCB4VGFza0NhbGxBcHBsaWNhdGlvblRhc2tIb29rKCBUYXNrSGFuZGxlX3QgeFRhc2ssIHZvaWQgKnB2UGFyYW1ldGVyICkKKwl7CisJVENCX3QgKnhUQ0I7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCisJCS8qIElmIHhUYXNrIGlzIE5VTEwgdGhlbiB3ZSBhcmUgY2FsbGluZyBvdXIgb3duIHRhc2sgaG9vay4gKi8KKwkJaWYoIHhUYXNrID09IE5VTEwgKQorCQl7CisJCQl4VENCID0gKCBUQ0JfdCAqICkgcHhDdXJyZW50VENCOworCQl9CisJCWVsc2UKKwkJeworCQkJeFRDQiA9ICggVENCX3QgKiApIHhUYXNrOworCQl9CisKKwkJaWYoIHhUQ0ItPnB4VGFza1RhZyAhPSBOVUxMICkKKwkJeworCQkJeFJldHVybiA9IHhUQ0ItPnB4VGFza1RhZyggcHZQYXJhbWV0ZXIgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXhSZXR1cm4gPSBwZEZBSUw7CisJCX0KKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZUYXNrU3dpdGNoQ29udGV4dCggdm9pZCApCit7CisJaWYoIHV4U2NoZWR1bGVyU3VzcGVuZGVkICE9ICggVUJhc2VUeXBlX3QgKSBwZEZBTFNFICkKKwl7CisJCS8qIFRoZSBzY2hlZHVsZXIgaXMgY3VycmVudGx5IHN1c3BlbmRlZCAtIGRvIG5vdCBhbGxvdyBhIGNvbnRleHQKKwkJc3dpdGNoLiAqLworCQl4WWllbGRQZW5kaW5nID0gcGRUUlVFOworCX0KKwllbHNlCisJeworCQl4WWllbGRQZW5kaW5nID0gcGRGQUxTRTsKKwkJdHJhY2VUQVNLX1NXSVRDSEVEX09VVCgpOworCisJCSNpZiAoIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTID09IDEgKQorCQl7CisJCQkJI2lmZGVmIHBvcnRBTFRfR0VUX1JVTl9USU1FX0NPVU5URVJfVkFMVUUKKwkJCQkJcG9ydEFMVF9HRVRfUlVOX1RJTUVfQ09VTlRFUl9WQUxVRSggdWxUb3RhbFJ1blRpbWUgKTsKKwkJCQkjZWxzZQorCQkJCQl1bFRvdGFsUnVuVGltZSA9IHBvcnRHRVRfUlVOX1RJTUVfQ09VTlRFUl9WQUxVRSgpOworCQkJCSNlbmRpZgorCisJCQkJLyogQWRkIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgdGFzayBoYXMgYmVlbiBydW5uaW5nIHRvIHRoZQorCQkJCWFjY3VtdWxhdGVkIHRpbWUgc28gZmFyLiAgVGhlIHRpbWUgdGhlIHRhc2sgc3RhcnRlZCBydW5uaW5nIHdhcworCQkJCXN0b3JlZCBpbiB1bFRhc2tTd2l0Y2hlZEluVGltZS4gIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBvdmVyZmxvdworCQkJCXByb3RlY3Rpb24gaGVyZSBzbyBjb3VudCB2YWx1ZXMgYXJlIG9ubHkgdmFsaWQgdW50aWwgdGhlIHRpbWVyCisJCQkJb3ZlcmZsb3dzLiAgVGhlIGd1YXJkIGFnYWluc3QgbmVnYXRpdmUgdmFsdWVzIGlzIHRvIHByb3RlY3QKKwkJCQlhZ2FpbnN0IHN1c3BlY3QgcnVuIHRpbWUgc3RhdCBjb3VudGVyIGltcGxlbWVudGF0aW9ucyAtIHdoaWNoCisJCQkJYXJlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgbm90IHRoZSBrZXJuZWwuICovCisJCQkJaWYoIHVsVG90YWxSdW5UaW1lID4gdWxUYXNrU3dpdGNoZWRJblRpbWUgKQorCQkJCXsKKwkJCQkJcHhDdXJyZW50VENCLT51bFJ1blRpbWVDb3VudGVyICs9ICggdWxUb3RhbFJ1blRpbWUgLSB1bFRhc2tTd2l0Y2hlZEluVGltZSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJCXVsVGFza1N3aXRjaGVkSW5UaW1lID0gdWxUb3RhbFJ1blRpbWU7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTICovCisKKwkJLyogQ2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93LCBpZiBjb25maWd1cmVkLiAqLworCQl0YXNrQ0hFQ0tfRk9SX1NUQUNLX09WRVJGTE9XKCk7CisKKwkJLyogU2VsZWN0IGEgbmV3IHRhc2sgdG8gcnVuIHVzaW5nIGVpdGhlciB0aGUgZ2VuZXJpYyBDIG9yIHBvcnQKKwkJb3B0aW1pc2VkIGFzbSBjb2RlLiAqLworCQl0YXNrU0VMRUNUX0hJR0hFU1RfUFJJT1JJVFlfVEFTSygpOworCQl0cmFjZVRBU0tfU1dJVENIRURfSU4oKTsKKworCQkjaWYgKCBjb25maWdVU0VfTkVXTElCX1JFRU5UUkFOVCA9PSAxICkKKwkJeworCQkJLyogU3dpdGNoIE5ld2xpYidzIF9pbXB1cmVfcHRyIHZhcmlhYmxlIHRvIHBvaW50IHRvIHRoZSBfcmVlbnQKKwkJCXN0cnVjdHVyZSBzcGVjaWZpYyB0byB0aGlzIHRhc2suICovCisJCQlfaW1wdXJlX3B0ciA9ICYoIHB4Q3VycmVudFRDQi0+eE5ld0xpYl9yZWVudCApOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdVU0VfTkVXTElCX1JFRU5UUkFOVCAqLworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZUYXNrUGxhY2VPbkV2ZW50TGlzdCggTGlzdF90ICogY29uc3QgcHhFdmVudExpc3QsIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKK3sKKwljb25maWdBU1NFUlQoIHB4RXZlbnRMaXN0ICk7CisKKwkvKiBUSElTIEZVTkNUSU9OIE1VU1QgQkUgQ0FMTEVEIFdJVEggRUlUSEVSIElOVEVSUlVQVFMgRElTQUJMRUQgT1IgVEhFCisJU0NIRURVTEVSIFNVU1BFTkRFRCBBTkQgVEhFIFFVRVVFIEJFSU5HIEFDQ0VTU0VEIExPQ0tFRC4gKi8KKworCS8qIFBsYWNlIHRoZSBldmVudCBsaXN0IGl0ZW0gb2YgdGhlIFRDQiBpbiB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbGlzdC4KKwlUaGlzIGlzIHBsYWNlZCBpbiB0aGUgbGlzdCBpbiBwcmlvcml0eSBvcmRlciBzbyB0aGUgaGlnaGVzdCBwcmlvcml0eSB0YXNrCisJaXMgdGhlIGZpcnN0IHRvIGJlIHdva2VuIGJ5IHRoZSBldmVudC4gIFRoZSBxdWV1ZSB0aGF0IGNvbnRhaW5zIHRoZSBldmVudAorCWxpc3QgaXMgbG9ja2VkLCBwcmV2ZW50aW5nIHNpbXVsdGFuZW91cyBhY2Nlc3MgZnJvbSBpbnRlcnJ1cHRzLiAqLworCXZMaXN0SW5zZXJ0KCBweEV2ZW50TGlzdCwgJiggcHhDdXJyZW50VENCLT54RXZlbnRMaXN0SXRlbSApICk7CisKKwlwcnZBZGRDdXJyZW50VGFza1RvRGVsYXllZExpc3QoIHhUaWNrc1RvV2FpdCwgcGRUUlVFICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2VGFza1BsYWNlT25Vbm9yZGVyZWRFdmVudExpc3QoIExpc3RfdCAqIHB4RXZlbnRMaXN0LCBjb25zdCBUaWNrVHlwZV90IHhJdGVtVmFsdWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKK3sKKwljb25maWdBU1NFUlQoIHB4RXZlbnRMaXN0ICk7CisKKwkvKiBUSElTIEZVTkNUSU9OIE1VU1QgQkUgQ0FMTEVEIFdJVEggVEhFIFNDSEVEVUxFUiBTVVNQRU5ERUQuICBJdCBpcyB1c2VkIGJ5CisJdGhlIGV2ZW50IGdyb3VwcyBpbXBsZW1lbnRhdGlvbi4gKi8KKwljb25maWdBU1NFUlQoIHV4U2NoZWR1bGVyU3VzcGVuZGVkICE9IDAgKTsKKworCS8qIFN0b3JlIHRoZSBpdGVtIHZhbHVlIGluIHRoZSBldmVudCBsaXN0IGl0ZW0uICBJdCBpcyBzYWZlIHRvIGFjY2VzcyB0aGUKKwlldmVudCBsaXN0IGl0ZW0gaGVyZSBhcyBpbnRlcnJ1cHRzIHdvbid0IGFjY2VzcyB0aGUgZXZlbnQgbGlzdCBpdGVtIG9mIGEKKwl0YXNrIHRoYXQgaXMgbm90IGluIHRoZSBCbG9ja2VkIHN0YXRlLiAqLworCWxpc3RTRVRfTElTVF9JVEVNX1ZBTFVFKCAmKCBweEN1cnJlbnRUQ0ItPnhFdmVudExpc3RJdGVtICksIHhJdGVtVmFsdWUgfCB0YXNrRVZFTlRfTElTVF9JVEVNX1ZBTFVFX0lOX1VTRSApOworCisJLyogUGxhY2UgdGhlIGV2ZW50IGxpc3QgaXRlbSBvZiB0aGUgVENCIGF0IHRoZSBlbmQgb2YgdGhlIGFwcHJvcHJpYXRlIGV2ZW50CisJbGlzdC4gIEl0IGlzIHNhZmUgdG8gYWNjZXNzIHRoZSBldmVudCBsaXN0IGhlcmUgYmVjYXVzZSBpdCBpcyBwYXJ0IG9mIGFuCisJZXZlbnQgZ3JvdXAgaW1wbGVtZW50YXRpb24gLSBhbmQgaW50ZXJydXB0cyBkb24ndCBhY2Nlc3MgZXZlbnQgZ3JvdXBzCisJZGlyZWN0bHkgKGluc3RlYWQgdGhleSBhY2Nlc3MgdGhlbSBpbmRpcmVjdGx5IGJ5IHBlbmRpbmcgZnVuY3Rpb24gY2FsbHMgdG8KKwl0aGUgdGFzayBsZXZlbCkuICovCisJdkxpc3RJbnNlcnRFbmQoIHB4RXZlbnRMaXN0LCAmKCBweEN1cnJlbnRUQ0ItPnhFdmVudExpc3RJdGVtICkgKTsKKworCXBydkFkZEN1cnJlbnRUYXNrVG9EZWxheWVkTGlzdCggeFRpY2tzVG9XYWl0LCBwZFRSVUUgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApCisKKwl2b2lkIHZUYXNrUGxhY2VPbkV2ZW50TGlzdFJlc3RyaWN0ZWQoIExpc3RfdCAqIGNvbnN0IHB4RXZlbnRMaXN0LCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCwgY29uc3QgQmFzZVR5cGVfdCB4V2FpdEluZGVmaW5pdGVseSApCisJeworCQljb25maWdBU1NFUlQoIHB4RXZlbnRMaXN0ICk7CisKKwkJLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBhcHBsaWNhdGlvbiBjb2RlIGhlbmNlIHRoZQorCQknUmVzdHJpY3RlZCcgaW4gaXRzIG5hbWUuICBJdCBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gIEl0IGlzCisJCWRlc2lnbmVkIGZvciB1c2UgYnkga2VybmVsIGNvZGUsIGFuZCBoYXMgc3BlY2lhbCBjYWxsaW5nIHJlcXVpcmVtZW50cyAtCisJCWl0IHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgc2NoZWR1bGVyIHN1c3BlbmRlZC4gKi8KKworCisJCS8qIFBsYWNlIHRoZSBldmVudCBsaXN0IGl0ZW0gb2YgdGhlIFRDQiBpbiB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbGlzdC4KKwkJSW4gdGhpcyBjYXNlIGl0IGlzIGFzc3VtZSB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgdGFzayB0aGF0IGlzIGdvaW5nIHRvCisJCWJlIHdhaXRpbmcgb24gdGhpcyBldmVudCBsaXN0LCBzbyB0aGUgZmFzdGVyIHZMaXN0SW5zZXJ0RW5kKCkgZnVuY3Rpb24KKwkJY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2Ygdkxpc3RJbnNlcnQuICovCisJCXZMaXN0SW5zZXJ0RW5kKCBweEV2ZW50TGlzdCwgJiggcHhDdXJyZW50VENCLT54RXZlbnRMaXN0SXRlbSApICk7CisKKwkJLyogSWYgdGhlIHRhc2sgc2hvdWxkIGJsb2NrIGluZGVmaW5pdGVseSB0aGVuIHNldCB0aGUgYmxvY2sgdGltZSB0byBhCisJCXZhbHVlIHRoYXQgd2lsbCBiZSByZWNvZ25pc2VkIGFzIGFuIGluZGVmaW5pdGUgZGVsYXkgaW5zaWRlIHRoZQorCQlwcnZBZGRDdXJyZW50VGFza1RvRGVsYXllZExpc3QoKSBmdW5jdGlvbi4gKi8KKwkJaWYoIHhXYWl0SW5kZWZpbml0ZWx5ICE9IHBkRkFMU0UgKQorCQl7CisJCQl4VGlja3NUb1dhaXQgPSBwb3J0TUFYX0RFTEFZOworCQl9CisKKwkJdHJhY2VUQVNLX0RFTEFZX1VOVElMKCAoIHhUaWNrQ291bnQgKyB4VGlja3NUb1dhaXQgKSApOworCQlwcnZBZGRDdXJyZW50VGFza1RvRGVsYXllZExpc3QoIHhUaWNrc1RvV2FpdCwgeFdhaXRJbmRlZmluaXRlbHkgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVElNRVJTICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4VGFza1JlbW92ZUZyb21FdmVudExpc3QoIGNvbnN0IExpc3RfdCAqIGNvbnN0IHB4RXZlbnRMaXN0ICkKK3sKK1RDQl90ICpweFVuYmxvY2tlZFRDQjsKK0Jhc2VUeXBlX3QgeFJldHVybjsKKworCS8qIFRISVMgRlVOQ1RJT04gTVVTVCBCRSBDQUxMRUQgRlJPTSBBIENSSVRJQ0FMIFNFQ1RJT04uICBJdCBjYW4gYWxzbyBiZQorCWNhbGxlZCBmcm9tIGEgY3JpdGljYWwgc2VjdGlvbiB3aXRoaW4gYW4gSVNSLiAqLworCisJLyogVGhlIGV2ZW50IGxpc3QgaXMgc29ydGVkIGluIHByaW9yaXR5IG9yZGVyLCBzbyB0aGUgZmlyc3QgaW4gdGhlIGxpc3QgY2FuCisJYmUgcmVtb3ZlZCBhcyBpdCBpcyBrbm93biB0byBiZSB0aGUgaGlnaGVzdCBwcmlvcml0eS4gIFJlbW92ZSB0aGUgVENCIGZyb20KKwl0aGUgZGVsYXllZCBsaXN0LCBhbmQgYWRkIGl0IHRvIHRoZSByZWFkeSBsaXN0LgorCisJSWYgYW4gZXZlbnQgaXMgZm9yIGEgcXVldWUgdGhhdCBpcyBsb2NrZWQgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIKKwlnZXQgY2FsbGVkIC0gdGhlIGxvY2sgY291bnQgb24gdGhlIHF1ZXVlIHdpbGwgZ2V0IG1vZGlmaWVkIGluc3RlYWQuICBUaGlzCisJbWVhbnMgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgZXZlbnQgbGlzdCBpcyBndWFyYW50ZWVkIGhlcmUuCisKKwlUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIGNoZWNrIGhhcyBhbHJlYWR5IGJlZW4gbWFkZSB0byBlbnN1cmUgdGhhdAorCXB4RXZlbnRMaXN0IGlzIG5vdCBlbXB0eS4gKi8KKwlweFVuYmxvY2tlZFRDQiA9ICggVENCX3QgKiApIGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggcHhFdmVudExpc3QgKTsKKwljb25maWdBU1NFUlQoIHB4VW5ibG9ja2VkVENCICk7CisJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweFVuYmxvY2tlZFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApOworCisJaWYoIHV4U2NoZWR1bGVyU3VzcGVuZGVkID09ICggVUJhc2VUeXBlX3QgKSBwZEZBTFNFICkKKwl7CisJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhVbmJsb2NrZWRUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKTsKKwkJcHJ2QWRkVGFza1RvUmVhZHlMaXN0KCBweFVuYmxvY2tlZFRDQiApOworCX0KKwllbHNlCisJeworCQkvKiBUaGUgZGVsYXllZCBhbmQgcmVhZHkgbGlzdHMgY2Fubm90IGJlIGFjY2Vzc2VkLCBzbyBob2xkIHRoaXMgdGFzaworCQlwZW5kaW5nIHVudGlsIHRoZSBzY2hlZHVsZXIgaXMgcmVzdW1lZC4gKi8KKwkJdkxpc3RJbnNlcnRFbmQoICYoIHhQZW5kaW5nUmVhZHlMaXN0ICksICYoIHB4VW5ibG9ja2VkVENCLT54RXZlbnRMaXN0SXRlbSApICk7CisJfQorCisJaWYoIHB4VW5ibG9ja2VkVENCLT51eFByaW9yaXR5ID4gcHhDdXJyZW50VENCLT51eFByaW9yaXR5ICkKKwl7CisJCS8qIFJldHVybiB0cnVlIGlmIHRoZSB0YXNrIHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQgbGlzdCBoYXMgYSBoaWdoZXIKKwkJcHJpb3JpdHkgdGhhbiB0aGUgY2FsbGluZyB0YXNrLiAgVGhpcyBhbGxvd3MgdGhlIGNhbGxpbmcgdGFzayB0byBrbm93IGlmCisJCWl0IHNob3VsZCBmb3JjZSBhIGNvbnRleHQgc3dpdGNoIG5vdy4gKi8KKwkJeFJldHVybiA9IHBkVFJVRTsKKworCQkvKiBNYXJrIHRoYXQgYSB5aWVsZCBpcyBwZW5kaW5nIGluIGNhc2UgdGhlIHVzZXIgaXMgbm90IHVzaW5nIHRoZQorCQkieEhpZ2hlclByaW9yaXR5VGFza1dva2VuIiBwYXJhbWV0ZXIgdG8gYW4gSVNSIHNhZmUgRnJlZVJUT1MgZnVuY3Rpb24uICovCisJCXhZaWVsZFBlbmRpbmcgPSBwZFRSVUU7CisJfQorCWVsc2UKKwl7CisJCXhSZXR1cm4gPSBwZEZBTFNFOworCX0KKworCSNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgIT0gMCApCisJeworCQkvKiBJZiBhIHRhc2sgaXMgYmxvY2tlZCBvbiBhIGtlcm5lbCBvYmplY3QgdGhlbiB4TmV4dFRhc2tVbmJsb2NrVGltZQorCQltaWdodCBiZSBzZXQgdG8gdGhlIGJsb2NrZWQgdGFzaydzIHRpbWUgb3V0IHRpbWUuICBJZiB0aGUgdGFzayBpcworCQl1bmJsb2NrZWQgZm9yIGEgcmVhc29uIG90aGVyIHRoYW4gYSB0aW1lb3V0IHhOZXh0VGFza1VuYmxvY2tUaW1lIGlzCisJCW5vcm1hbGx5IGxlZnQgdW5jaGFuZ2VkLCBiZWNhdXNlIGl0IGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQgdG8gYSBuZXcKKwkJdmFsdWUgd2hlbiB0aGUgdGljayBjb3VudCBlcXVhbHMgeE5leHRUYXNrVW5ibG9ja1RpbWUuICBIb3dldmVyIGlmCisJCXRpY2tsZXNzIGlkbGluZyBpcyB1c2VkIGl0IG1pZ2h0IGJlIG1vcmUgaW1wb3J0YW50IHRvIGVudGVyIHNsZWVwIG1vZGUKKwkJYXQgdGhlIGVhcmxpZXN0IHBvc3NpYmxlIHRpbWUgLSBzbyByZXNldCB4TmV4dFRhc2tVbmJsb2NrVGltZSBoZXJlIHRvCisJCWVuc3VyZSBpdCBpcyB1cGRhdGVkIGF0IHRoZSBlYXJsaWVzdCBwb3NzaWJsZSB0aW1lLiAqLworCQlwcnZSZXNldE5leHRUYXNrVW5ibG9ja1RpbWUoKTsKKwl9CisJI2VuZGlmCisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZUYXNrUmVtb3ZlRnJvbVVub3JkZXJlZEV2ZW50TGlzdCggTGlzdEl0ZW1fdCAqIHB4RXZlbnRMaXN0SXRlbSwgY29uc3QgVGlja1R5cGVfdCB4SXRlbVZhbHVlICkKK3sKK1RDQl90ICpweFVuYmxvY2tlZFRDQjsKKworCS8qIFRISVMgRlVOQ1RJT04gTVVTVCBCRSBDQUxMRUQgV0lUSCBUSEUgU0NIRURVTEVSIFNVU1BFTkRFRC4gIEl0IGlzIHVzZWQgYnkKKwl0aGUgZXZlbnQgZmxhZ3MgaW1wbGVtZW50YXRpb24uICovCisJY29uZmlnQVNTRVJUKCB1eFNjaGVkdWxlclN1c3BlbmRlZCAhPSBwZEZBTFNFICk7CisKKwkvKiBTdG9yZSB0aGUgbmV3IGl0ZW0gdmFsdWUgaW4gdGhlIGV2ZW50IGxpc3QuICovCisJbGlzdFNFVF9MSVNUX0lURU1fVkFMVUUoIHB4RXZlbnRMaXN0SXRlbSwgeEl0ZW1WYWx1ZSB8IHRhc2tFVkVOVF9MSVNUX0lURU1fVkFMVUVfSU5fVVNFICk7CisKKwkvKiBSZW1vdmUgdGhlIGV2ZW50IGxpc3QgZm9ybSB0aGUgZXZlbnQgZmxhZy4gIEludGVycnVwdHMgZG8gbm90IGFjY2VzcworCWV2ZW50IGZsYWdzLiAqLworCXB4VW5ibG9ja2VkVENCID0gKCBUQ0JfdCAqICkgbGlzdEdFVF9MSVNUX0lURU1fT1dORVIoIHB4RXZlbnRMaXN0SXRlbSApOworCWNvbmZpZ0FTU0VSVCggcHhVbmJsb2NrZWRUQ0IgKTsKKwkoIHZvaWQgKSB1eExpc3RSZW1vdmUoIHB4RXZlbnRMaXN0SXRlbSApOworCisJLyogUmVtb3ZlIHRoZSB0YXNrIGZyb20gdGhlIGRlbGF5ZWQgbGlzdCBhbmQgYWRkIGl0IHRvIHRoZSByZWFkeSBsaXN0LiAgVGhlCisJc2NoZWR1bGVyIGlzIHN1c3BlbmRlZCBzbyBpbnRlcnJ1cHRzIHdpbGwgbm90IGJlIGFjY2Vzc2luZyB0aGUgcmVhZHkKKwlsaXN0cy4gKi8KKwkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICYoIHB4VW5ibG9ja2VkVENCLT54U3RhdGVMaXN0SXRlbSApICk7CisJcHJ2QWRkVGFza1RvUmVhZHlMaXN0KCBweFVuYmxvY2tlZFRDQiApOworCisJaWYoIHB4VW5ibG9ja2VkVENCLT51eFByaW9yaXR5ID4gcHhDdXJyZW50VENCLT51eFByaW9yaXR5ICkKKwl7CisJCS8qIFRoZSB1bmJsb2NrZWQgdGFzayBoYXMgYSBwcmlvcml0eSBhYm92ZSB0aGF0IG9mIHRoZSBjYWxsaW5nIHRhc2ssIHNvCisJCWEgY29udGV4dCBzd2l0Y2ggaXMgcmVxdWlyZWQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZQorCQlzY2hlZHVsZXIgc3VzcGVuZGVkIHNvIHhZaWVsZFBlbmRpbmcgaXMgc2V0IHNvIHRoZSBjb250ZXh0IHN3aXRjaAorCQlvY2N1cnMgaW1tZWRpYXRlbHkgdGhhdCB0aGUgc2NoZWR1bGVyIGlzIHJlc3VtZWQgKHVuc3VzcGVuZGVkKS4gKi8KKwkJeFlpZWxkUGVuZGluZyA9IHBkVFJVRTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2VGFza1NldFRpbWVPdXRTdGF0ZSggVGltZU91dF90ICogY29uc3QgcHhUaW1lT3V0ICkKK3sKKwljb25maWdBU1NFUlQoIHB4VGltZU91dCApOworCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCXsKKwkJcHhUaW1lT3V0LT54T3ZlcmZsb3dDb3VudCA9IHhOdW1PZk92ZXJmbG93czsKKwkJcHhUaW1lT3V0LT54VGltZU9uRW50ZXJpbmcgPSB4VGlja0NvdW50OworCX0KKwl0YXNrRVhJVF9DUklUSUNBTCgpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlRhc2tJbnRlcm5hbFNldFRpbWVPdXRTdGF0ZSggVGltZU91dF90ICogY29uc3QgcHhUaW1lT3V0ICkKK3sKKwkvKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgYXMgaXQgZG9lcyBub3QgdXNlIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwlweFRpbWVPdXQtPnhPdmVyZmxvd0NvdW50ID0geE51bU9mT3ZlcmZsb3dzOworCXB4VGltZU91dC0+eFRpbWVPbkVudGVyaW5nID0geFRpY2tDb3VudDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhUYXNrQ2hlY2tGb3JUaW1lT3V0KCBUaW1lT3V0X3QgKiBjb25zdCBweFRpbWVPdXQsIFRpY2tUeXBlX3QgKiBjb25zdCBweFRpY2tzVG9XYWl0ICkKK3sKK0Jhc2VUeXBlX3QgeFJldHVybjsKKworCWNvbmZpZ0FTU0VSVCggcHhUaW1lT3V0ICk7CisJY29uZmlnQVNTRVJUKCBweFRpY2tzVG9XYWl0ICk7CisKKwl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwl7CisJCS8qIE1pbm9yIG9wdGltaXNhdGlvbi4gIFRoZSB0aWNrIGNvdW50IGNhbm5vdCBjaGFuZ2UgaW4gdGhpcyBibG9jay4gKi8KKwkJY29uc3QgVGlja1R5cGVfdCB4Q29uc3RUaWNrQ291bnQgPSB4VGlja0NvdW50OworCQljb25zdCBUaWNrVHlwZV90IHhFbGFwc2VkVGltZSA9IHhDb25zdFRpY2tDb3VudCAtIHB4VGltZU91dC0+eFRpbWVPbkVudGVyaW5nOworCisJCSNpZiggSU5DTFVERV94VGFza0Fib3J0RGVsYXkgPT0gMSApCisJCQlpZiggcHhDdXJyZW50VENCLT51Y0RlbGF5QWJvcnRlZCAhPSBwZEZBTFNFICkKKwkJCXsKKwkJCQkvKiBUaGUgZGVsYXkgd2FzIGFib3J0ZWQsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBhcyBhIHRpbWUgb3V0LAorCQkJCWJ1dCBoYXMgdGhlIHNhbWUgcmVzdWx0LiAqLworCQkJCXB4Q3VycmVudFRDQi0+dWNEZWxheUFib3J0ZWQgPSBwZEZBTFNFOworCQkJCXhSZXR1cm4gPSBwZFRSVUU7CisJCQl9CisJCQllbHNlCisJCSNlbmRpZgorCisJCSNpZiAoIElOQ0xVREVfdlRhc2tTdXNwZW5kID09IDEgKQorCQkJaWYoICpweFRpY2tzVG9XYWl0ID09IHBvcnRNQVhfREVMQVkgKQorCQkJeworCQkJCS8qIElmIElOQ0xVREVfdlRhc2tTdXNwZW5kIGlzIHNldCB0byAxIGFuZCB0aGUgYmxvY2sgdGltZQorCQkJCXNwZWNpZmllZCBpcyB0aGUgbWF4aW11bSBibG9jayB0aW1lIHRoZW4gdGhlIHRhc2sgc2hvdWxkIGJsb2NrCisJCQkJaW5kZWZpbml0ZWx5LCBhbmQgdGhlcmVmb3JlIG5ldmVyIHRpbWUgb3V0LiAqLworCQkJCXhSZXR1cm4gPSBwZEZBTFNFOworCQkJfQorCQkJZWxzZQorCQkjZW5kaWYKKworCQlpZiggKCB4TnVtT2ZPdmVyZmxvd3MgIT0gcHhUaW1lT3V0LT54T3ZlcmZsb3dDb3VudCApICYmICggeENvbnN0VGlja0NvdW50ID49IHB4VGltZU91dC0+eFRpbWVPbkVudGVyaW5nICkgKSAvKmxpbnQgIWU1MjUgSW5kZW50YXRpb24gcHJlZmVycmVkIGFzIGlzIHRvIG1ha2UgY29kZSB3aXRoaW4gcHJlLXByb2Nlc3NvciBkaXJlY3RpdmVzIGNsZWFyZXIuICovCisJCXsKKwkJCS8qIFRoZSB0aWNrIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGltZSBhdCB3aGljaAorCQkJdlRhc2tTZXRUaW1lb3V0KCkgd2FzIGNhbGxlZCwgYnV0IGhhcyBhbHNvIG92ZXJmbG93ZWQgc2luY2UKKwkJCXZUYXNrU2V0VGltZU91dCgpIHdhcyBjYWxsZWQuICBJdCBtdXN0IGhhdmUgd3JhcHBlZCBhbGwgdGhlIHdheQorCQkJYXJvdW5kIGFuZCBnb25lIHBhc3QgYWdhaW4uIFRoaXMgcGFzc2VkIHNpbmNlIHZUYXNrU2V0VGltZW91dCgpCisJCQl3YXMgY2FsbGVkLiAqLworCQkJeFJldHVybiA9IHBkVFJVRTsKKwkJfQorCQllbHNlIGlmKCB4RWxhcHNlZFRpbWUgPCAqcHhUaWNrc1RvV2FpdCApIC8qbGludCAhZTk2MSBFeHBsaWNpdCBjYXN0aW5nIGlzIG9ubHkgcmVkdW5kYW50IHdpdGggc29tZSBjb21waWxlcnMsIHdoZXJlYXMgb3RoZXJzIHJlcXVpcmUgaXQgdG8gcHJldmVudCBpbnRlZ2VyIGNvbnZlcnNpb24gZXJyb3JzLiAqLworCQl7CisJCQkvKiBOb3QgYSBnZW51aW5lIHRpbWVvdXQuIEFkanVzdCBwYXJhbWV0ZXJzIGZvciB0aW1lIHJlbWFpbmluZy4gKi8KKwkJCSpweFRpY2tzVG9XYWl0IC09IHhFbGFwc2VkVGltZTsKKwkJCXZUYXNrSW50ZXJuYWxTZXRUaW1lT3V0U3RhdGUoIHB4VGltZU91dCApOworCQkJeFJldHVybiA9IHBkRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQkqcHhUaWNrc1RvV2FpdCA9IDA7CisJCQl4UmV0dXJuID0gcGRUUlVFOworCQl9CisJfQorCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZUYXNrTWlzc2VkWWllbGQoIHZvaWQgKQoreworCXhZaWVsZFBlbmRpbmcgPSBwZFRSVUU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCisJVUJhc2VUeXBlX3QgdXhUYXNrR2V0VGFza051bWJlciggVGFza0hhbmRsZV90IHhUYXNrICkKKwl7CisJVUJhc2VUeXBlX3QgdXhSZXR1cm47CisJVENCX3QgKnB4VENCOworCisJCWlmKCB4VGFzayAhPSBOVUxMICkKKwkJeworCQkJcHhUQ0IgPSAoIFRDQl90ICogKSB4VGFzazsKKwkJCXV4UmV0dXJuID0gcHhUQ0ItPnV4VGFza051bWJlcjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXV4UmV0dXJuID0gMFU7CisJCX0KKworCQlyZXR1cm4gdXhSZXR1cm47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCisJdm9pZCB2VGFza1NldFRhc2tOdW1iZXIoIFRhc2tIYW5kbGVfdCB4VGFzaywgY29uc3QgVUJhc2VUeXBlX3QgdXhIYW5kbGUgKQorCXsKKwlUQ0JfdCAqcHhUQ0I7CisKKwkJaWYoIHhUYXNrICE9IE5VTEwgKQorCQl7CisJCQlweFRDQiA9ICggVENCX3QgKiApIHhUYXNrOworCQkJcHhUQ0ItPnV4VGFza051bWJlciA9IHV4SGFuZGxlOworCQl9CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICovCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhlIElkbGUgdGFzay4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGUgcG9ydFRBU0tfRlVOQ1RJT04oKSBtYWNybyBpcyB1c2VkIHRvIGFsbG93IHBvcnQvY29tcGlsZXIgc3BlY2lmaWMKKyAqIGxhbmd1YWdlIGV4dGVuc2lvbnMuICBUaGUgZXF1aXZhbGVudCBwcm90b3R5cGUgZm9yIHRoaXMgZnVuY3Rpb24gaXM6CisgKgorICogdm9pZCBwcnZJZGxlVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICk7CisgKgorICovCitzdGF0aWMgcG9ydFRBU0tfRlVOQ1RJT04oIHBydklkbGVUYXNrLCBwdlBhcmFtZXRlcnMgKQoreworCS8qIFN0b3Agd2FybmluZ3MuICovCisJKCB2b2lkICkgcHZQYXJhbWV0ZXJzOworCisJLyoqIFRISVMgSVMgVEhFIFJUT1MgSURMRSBUQVNLIC0gV0hJQ0ggSVMgQ1JFQVRFRCBBVVRPTUFUSUNBTExZIFdIRU4gVEhFCisJU0NIRURVTEVSIElTIFNUQVJURUQuICoqLworCisJLyogSW4gY2FzZSBhIHRhc2sgdGhhdCBoYXMgYSBzZWN1cmUgY29udGV4dCBkZWxldGVzIGl0c2VsZiwgaW4gd2hpY2ggY2FzZQorCXRoZSBpZGxlIHRhc2sgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSB0YXNrJ3Mgc2VjdXJlIGNvbnRleHQsIGlmCisJYW55LiAqLworCXBvcnRUQVNLX0NBTExTX1NFQ1VSRV9GVU5DVElPTlMoKTsKKworCWZvciggOzsgKQorCXsKKwkJLyogU2VlIGlmIGFueSB0YXNrcyBoYXZlIGRlbGV0ZWQgdGhlbXNlbHZlcyAtIGlmIHNvIHRoZW4gdGhlIGlkbGUgdGFzaworCQlpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgZGVsZXRlZCB0YXNrJ3MgVENCIGFuZCBzdGFjay4gKi8KKwkJcHJ2Q2hlY2tUYXNrc1dhaXRpbmdUZXJtaW5hdGlvbigpOworCisJCSNpZiAoIGNvbmZpZ1VTRV9QUkVFTVBUSU9OID09IDAgKQorCQl7CisJCQkvKiBJZiB3ZSBhcmUgbm90IHVzaW5nIHByZWVtcHRpb24gd2Uga2VlcCBmb3JjaW5nIGEgdGFzayBzd2l0Y2ggdG8KKwkJCXNlZSBpZiBhbnkgb3RoZXIgdGFzayBoYXMgYmVjb21lIGF2YWlsYWJsZS4gIElmIHdlIGFyZSB1c2luZworCQkJcHJlZW1wdGlvbiB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoaXMgYXMgYW55IHRhc2sgYmVjb21pbmcgYXZhaWxhYmxlCisJCQl3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IHRoZSBwcm9jZXNzb3IgYW55d2F5LiAqLworCQkJdGFza1lJRUxEKCk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ1VTRV9QUkVFTVBUSU9OICovCisKKwkJI2lmICggKCBjb25maWdVU0VfUFJFRU1QVElPTiA9PSAxICkgJiYgKCBjb25maWdJRExFX1NIT1VMRF9ZSUVMRCA9PSAxICkgKQorCQl7CisJCQkvKiBXaGVuIHVzaW5nIHByZWVtcHRpb24gdGFza3Mgb2YgZXF1YWwgcHJpb3JpdHkgd2lsbCBiZQorCQkJdGltZXNsaWNlZC4gIElmIGEgdGFzayB0aGF0IGlzIHNoYXJpbmcgdGhlIGlkbGUgcHJpb3JpdHkgaXMgcmVhZHkKKwkJCXRvIHJ1biB0aGVuIHRoZSBpZGxlIHRhc2sgc2hvdWxkIHlpZWxkIGJlZm9yZSB0aGUgZW5kIG9mIHRoZQorCQkJdGltZXNsaWNlLgorCisJCQlBIGNyaXRpY2FsIHJlZ2lvbiBpcyBub3QgcmVxdWlyZWQgaGVyZSBhcyB3ZSBhcmUganVzdCByZWFkaW5nIGZyb20KKwkJCXRoZSBsaXN0LCBhbmQgYW4gb2NjYXNpb25hbCBpbmNvcnJlY3QgdmFsdWUgd2lsbCBub3QgbWF0dGVyLiAgSWYKKwkJCXRoZSByZWFkeSBsaXN0IGF0IHRoZSBpZGxlIHByaW9yaXR5IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgdGFzaworCQkJdGhlbiBhIHRhc2sgb3RoZXIgdGhhbiB0aGUgaWRsZSB0YXNrIGlzIHJlYWR5IHRvIGV4ZWN1dGUuICovCisJCQlpZiggbGlzdENVUlJFTlRfTElTVF9MRU5HVEgoICYoIHB4UmVhZHlUYXNrc0xpc3RzWyB0c2tJRExFX1BSSU9SSVRZIF0gKSApID4gKCBVQmFzZVR5cGVfdCApIDEgKQorCQkJeworCQkJCXRhc2tZSUVMRCgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQkjZW5kaWYgLyogKCAoIGNvbmZpZ1VTRV9QUkVFTVBUSU9OID09IDEgKSAmJiAoIGNvbmZpZ0lETEVfU0hPVUxEX1lJRUxEID09IDEgKSApICovCisKKwkJI2lmICggY29uZmlnVVNFX0lETEVfSE9PSyA9PSAxICkKKwkJeworCQkJZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uSWRsZUhvb2soIHZvaWQgKTsKKworCQkJLyogQ2FsbCB0aGUgdXNlciBkZWZpbmVkIGZ1bmN0aW9uIGZyb20gd2l0aGluIHRoZSBpZGxlIHRhc2suICBUaGlzCisJCQlhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIGRlc2lnbmVyIHRvIGFkZCBiYWNrZ3JvdW5kIGZ1bmN0aW9uYWxpdHkKKwkJCXdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mIGEgc2VwYXJhdGUgdGFzay4KKwkJCU5PVEU6IHZBcHBsaWNhdGlvbklkbGVIb29rKCkgTVVTVCBOT1QsIFVOREVSIEFOWSBDSVJDVU1TVEFOQ0VTLAorCQkJQ0FMTCBBIEZVTkNUSU9OIFRIQVQgTUlHSFQgQkxPQ0suICovCisJCQl2QXBwbGljYXRpb25JZGxlSG9vaygpOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdVU0VfSURMRV9IT09LICovCisKKwkJLyogVGhpcyBjb25kaXRpb25hbCBjb21waWxhdGlvbiBzaG91bGQgdXNlIGluZXF1YWxpdHkgdG8gMCwgbm90IGVxdWFsaXR5CisJCXRvIDEuICBUaGlzIGlzIHRvIGVuc3VyZSBwb3J0U1VQUFJFU1NfVElDS1NfQU5EX1NMRUVQKCkgaXMgY2FsbGVkIHdoZW4KKwkJdXNlciBkZWZpbmVkIGxvdyBwb3dlciBtb2RlCWltcGxlbWVudGF0aW9ucyByZXF1aXJlCisJCWNvbmZpZ1VTRV9USUNLTEVTU19JRExFIHRvIGJlIHNldCB0byBhIHZhbHVlIG90aGVyIHRoYW4gMS4gKi8KKwkJI2lmICggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgIT0gMCApCisJCXsKKwkJVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZTsKKworCQkJLyogSXQgaXMgbm90IGRlc2lyYWJsZSB0byBzdXNwZW5kIHRoZW4gcmVzdW1lIHRoZSBzY2hlZHVsZXIgb24KKwkJCWVhY2ggaXRlcmF0aW9uIG9mIHRoZSBpZGxlIHRhc2suICBUaGVyZWZvcmUsIGEgcHJlbGltaW5hcnkKKwkJCXRlc3Qgb2YgdGhlIGV4cGVjdGVkIGlkbGUgdGltZSBpcyBwZXJmb3JtZWQgd2l0aG91dCB0aGUKKwkJCXNjaGVkdWxlciBzdXNwZW5kZWQuICBUaGUgcmVzdWx0IGhlcmUgaXMgbm90IG5lY2Vzc2FyaWx5CisJCQl2YWxpZC4gKi8KKwkJCXhFeHBlY3RlZElkbGVUaW1lID0gcHJ2R2V0RXhwZWN0ZWRJZGxlVGltZSgpOworCisJCQlpZiggeEV4cGVjdGVkSWRsZVRpbWUgPj0gY29uZmlnRVhQRUNURURfSURMRV9USU1FX0JFRk9SRV9TTEVFUCApCisJCQl7CisJCQkJdlRhc2tTdXNwZW5kQWxsKCk7CisJCQkJeworCQkJCQkvKiBOb3cgdGhlIHNjaGVkdWxlciBpcyBzdXNwZW5kZWQsIHRoZSBleHBlY3RlZCBpZGxlCisJCQkJCXRpbWUgY2FuIGJlIHNhbXBsZWQgYWdhaW4sIGFuZCB0aGlzIHRpbWUgaXRzIHZhbHVlIGNhbgorCQkJCQliZSB1c2VkLiAqLworCQkJCQljb25maWdBU1NFUlQoIHhOZXh0VGFza1VuYmxvY2tUaW1lID49IHhUaWNrQ291bnQgKTsKKwkJCQkJeEV4cGVjdGVkSWRsZVRpbWUgPSBwcnZHZXRFeHBlY3RlZElkbGVUaW1lKCk7CisKKwkJCQkJLyogRGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm8gdG8gc2V0IHhFeHBlY3RlZElkbGVUaW1lIHRvIDAKKwkJCQkJaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHdhbnQKKwkJCQkJcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCgpIHRvIGJlIGNhbGxlZC4gKi8KKwkJCQkJY29uZmlnUFJFX1NVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUF9QUk9DRVNTSU5HKCB4RXhwZWN0ZWRJZGxlVGltZSApOworCisJCQkJCWlmKCB4RXhwZWN0ZWRJZGxlVGltZSA+PSBjb25maWdFWFBFQ1RFRF9JRExFX1RJTUVfQkVGT1JFX1NMRUVQICkKKwkJCQkJeworCQkJCQkJdHJhY2VMT1dfUE9XRVJfSURMRV9CRUdJTigpOworCQkJCQkJcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCggeEV4cGVjdGVkSWRsZVRpbWUgKTsKKwkJCQkJCXRyYWNlTE9XX1BPV0VSX0lETEVfRU5EKCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgIT0gMCApCisKKwllU2xlZXBNb2RlU3RhdHVzIGVUYXNrQ29uZmlybVNsZWVwTW9kZVN0YXR1cyggdm9pZCApCisJeworCS8qIFRoZSBpZGxlIHRhc2sgZXhpc3RzIGluIGFkZGl0aW9uIHRvIHRoZSBhcHBsaWNhdGlvbiB0YXNrcy4gKi8KKwljb25zdCBVQmFzZVR5cGVfdCB1eE5vbkFwcGxpY2F0aW9uVGFza3MgPSAxOworCWVTbGVlcE1vZGVTdGF0dXMgZVJldHVybiA9IGVTdGFuZGFyZFNsZWVwOworCisJCWlmKCBsaXN0Q1VSUkVOVF9MSVNUX0xFTkdUSCggJnhQZW5kaW5nUmVhZHlMaXN0ICkgIT0gMCApCisJCXsKKwkJCS8qIEEgdGFzayB3YXMgbWFkZSByZWFkeSB3aGlsZSB0aGUgc2NoZWR1bGVyIHdhcyBzdXNwZW5kZWQuICovCisJCQllUmV0dXJuID0gZUFib3J0U2xlZXA7CisJCX0KKwkJZWxzZSBpZiggeFlpZWxkUGVuZGluZyAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogQSB5aWVsZCB3YXMgcGVuZGVkIHdoaWxlIHRoZSBzY2hlZHVsZXIgd2FzIHN1c3BlbmRlZC4gKi8KKwkJCWVSZXR1cm4gPSBlQWJvcnRTbGVlcDsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIElmIGFsbCB0aGUgdGFza3MgYXJlIGluIHRoZSBzdXNwZW5kZWQgbGlzdCAod2hpY2ggbWlnaHQgbWVhbiB0aGV5CisJCQloYXZlIGFuIGluZmluaXRlIGJsb2NrIHRpbWUgcmF0aGVyIHRoYW4gYWN0dWFsbHkgYmVpbmcgc3VzcGVuZGVkKQorCQkJdGhlbiBpdCBpcyBzYWZlIHRvIHR1cm4gYWxsIGNsb2NrcyBvZmYgYW5kIGp1c3Qgd2FpdCBmb3IgZXh0ZXJuYWwKKwkJCWludGVycnVwdHMuICovCisJCQlpZiggbGlzdENVUlJFTlRfTElTVF9MRU5HVEgoICZ4U3VzcGVuZGVkVGFza0xpc3QgKSA9PSAoIHV4Q3VycmVudE51bWJlck9mVGFza3MgLSB1eE5vbkFwcGxpY2F0aW9uVGFza3MgKSApCisJCQl7CisJCQkJZVJldHVybiA9IGVOb1Rhc2tzV2FpdGluZ1RpbWVvdXQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGVSZXR1cm47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgIT0gMCApCisKKwl2b2lkIHZUYXNrU2V0VGhyZWFkTG9jYWxTdG9yYWdlUG9pbnRlciggVGFza0hhbmRsZV90IHhUYXNrVG9TZXQsIEJhc2VUeXBlX3QgeEluZGV4LCB2b2lkICpwdlZhbHVlICkKKwl7CisJVENCX3QgKnB4VENCOworCisJCWlmKCB4SW5kZXggPCBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgKQorCQl7CisJCQlweFRDQiA9IHBydkdldFRDQkZyb21IYW5kbGUoIHhUYXNrVG9TZXQgKTsKKwkJCXB4VENCLT5wdlRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXJzWyB4SW5kZXggXSA9IHB2VmFsdWU7CisJCX0KKwl9CisKKyNlbmRpZiAvKiBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgIT0gMCApCisKKwl2b2lkICpwdlRhc2tHZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1F1ZXJ5LCBCYXNlVHlwZV90IHhJbmRleCApCisJeworCXZvaWQgKnB2UmV0dXJuID0gTlVMTDsKKwlUQ0JfdCAqcHhUQ0I7CisKKwkJaWYoIHhJbmRleCA8IGNvbmZpZ05VTV9USFJFQURfTE9DQUxfU1RPUkFHRV9QT0lOVEVSUyApCisJCXsKKwkJCXB4VENCID0gcHJ2R2V0VENCRnJvbUhhbmRsZSggeFRhc2tUb1F1ZXJ5ICk7CisJCQlwdlJldHVybiA9IHB4VENCLT5wdlRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXJzWyB4SW5kZXggXTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXB2UmV0dXJuID0gTlVMTDsKKwkJfQorCisJCXJldHVybiBwdlJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdOVU1fVEhSRUFEX0xPQ0FMX1NUT1JBR0VfUE9JTlRFUlMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDEgKQorCisJdm9pZCB2VGFza0FsbG9jYXRlTVBVUmVnaW9ucyggVGFza0hhbmRsZV90IHhUYXNrVG9Nb2RpZnksIGNvbnN0IE1lbW9yeVJlZ2lvbl90ICogY29uc3QgeFJlZ2lvbnMgKQorCXsKKwlUQ0JfdCAqcHhUQ0I7CisKKwkJLyogSWYgbnVsbCBpcyBwYXNzZWQgaW4gaGVyZSB0aGVuIHdlIGFyZSBtb2RpZnlpbmcgdGhlIE1QVSBzZXR0aW5ncyBvZgorCQl0aGUgY2FsbGluZyB0YXNrLiAqLworCQlweFRDQiA9IHBydkdldFRDQkZyb21IYW5kbGUoIHhUYXNrVG9Nb2RpZnkgKTsKKworCQl2UG9ydFN0b3JlVGFza01QVVNldHRpbmdzKCAmKCBweFRDQi0+eE1QVVNldHRpbmdzICksIHhSZWdpb25zLCBOVUxMLCAwICk7CisJfQorCisjZW5kaWYgLyogcG9ydFVTSU5HX01QVV9XUkFQUEVSUyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydkluaXRpYWxpc2VUYXNrTGlzdHMoIHZvaWQgKQoreworVUJhc2VUeXBlX3QgdXhQcmlvcml0eTsKKworCWZvciggdXhQcmlvcml0eSA9ICggVUJhc2VUeXBlX3QgKSAwVTsgdXhQcmlvcml0eSA8ICggVUJhc2VUeXBlX3QgKSBjb25maWdNQVhfUFJJT1JJVElFUzsgdXhQcmlvcml0eSsrICkKKwl7CisJCXZMaXN0SW5pdGlhbGlzZSggJiggcHhSZWFkeVRhc2tzTGlzdHNbIHV4UHJpb3JpdHkgXSApICk7CisJfQorCisJdkxpc3RJbml0aWFsaXNlKCAmeERlbGF5ZWRUYXNrTGlzdDEgKTsKKwl2TGlzdEluaXRpYWxpc2UoICZ4RGVsYXllZFRhc2tMaXN0MiApOworCXZMaXN0SW5pdGlhbGlzZSggJnhQZW5kaW5nUmVhZHlMaXN0ICk7CisKKwkjaWYgKCBJTkNMVURFX3ZUYXNrRGVsZXRlID09IDEgKQorCXsKKwkJdkxpc3RJbml0aWFsaXNlKCAmeFRhc2tzV2FpdGluZ1Rlcm1pbmF0aW9uICk7CisJfQorCSNlbmRpZiAvKiBJTkNMVURFX3ZUYXNrRGVsZXRlICovCisKKwkjaWYgKCBJTkNMVURFX3ZUYXNrU3VzcGVuZCA9PSAxICkKKwl7CisJCXZMaXN0SW5pdGlhbGlzZSggJnhTdXNwZW5kZWRUYXNrTGlzdCApOworCX0KKwkjZW5kaWYgLyogSU5DTFVERV92VGFza1N1c3BlbmQgKi8KKworCS8qIFN0YXJ0IHdpdGggcHhEZWxheWVkVGFza0xpc3QgdXNpbmcgbGlzdDEgYW5kIHRoZSBweE92ZXJmbG93RGVsYXllZFRhc2tMaXN0CisJdXNpbmcgbGlzdDIuICovCisJcHhEZWxheWVkVGFza0xpc3QgPSAmeERlbGF5ZWRUYXNrTGlzdDE7CisJcHhPdmVyZmxvd0RlbGF5ZWRUYXNrTGlzdCA9ICZ4RGVsYXllZFRhc2tMaXN0MjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZDaGVja1Rhc2tzV2FpdGluZ1Rlcm1pbmF0aW9uKCB2b2lkICkKK3sKKworCS8qKiBUSElTIEZVTkNUSU9OIElTIENBTExFRCBGUk9NIFRIRSBSVE9TIElETEUgVEFTSyAqKi8KKworCSNpZiAoIElOQ0xVREVfdlRhc2tEZWxldGUgPT0gMSApCisJeworCQlUQ0JfdCAqcHhUQ0I7CisKKwkJLyogdXhEZWxldGVkVGFza3NXYWl0aW5nQ2xlYW5VcCBpcyB1c2VkIHRvIHByZXZlbnQgdlRhc2tTdXNwZW5kQWxsKCkKKwkJYmVpbmcgY2FsbGVkIHRvbyBvZnRlbiBpbiB0aGUgaWRsZSB0YXNrLiAqLworCQl3aGlsZSggdXhEZWxldGVkVGFza3NXYWl0aW5nQ2xlYW5VcCA+ICggVUJhc2VUeXBlX3QgKSAwVSApCisJCXsKKwkJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQkJeworCQkJCXB4VENCID0gKCBUQ0JfdCAqICkgbGlzdEdFVF9PV05FUl9PRl9IRUFEX0VOVFJZKCAoICZ4VGFza3NXYWl0aW5nVGVybWluYXRpb24gKSApOworCQkJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKTsKKwkJCQktLXV4Q3VycmVudE51bWJlck9mVGFza3M7CisJCQkJLS11eERlbGV0ZWRUYXNrc1dhaXRpbmdDbGVhblVwOworCQkJfQorCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKworCQkJcHJ2RGVsZXRlVENCKCBweFRDQiApOworCQl9CisJfQorCSNlbmRpZiAvKiBJTkNMVURFX3ZUYXNrRGVsZXRlICovCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisKKwl2b2lkIHZUYXNrR2V0SW5mbyggVGFza0hhbmRsZV90IHhUYXNrLCBUYXNrU3RhdHVzX3QgKnB4VGFza1N0YXR1cywgQmFzZVR5cGVfdCB4R2V0RnJlZVN0YWNrU3BhY2UsIGVUYXNrU3RhdGUgZVN0YXRlICkKKwl7CisJVENCX3QgKnB4VENCOworCisJCS8qIHhUYXNrIGlzIE5VTEwgdGhlbiBnZXQgdGhlIHN0YXRlIG9mIHRoZSBjYWxsaW5nIHRhc2suICovCisJCXB4VENCID0gcHJ2R2V0VENCRnJvbUhhbmRsZSggeFRhc2sgKTsKKworCQlweFRhc2tTdGF0dXMtPnhIYW5kbGUgPSAoIFRhc2tIYW5kbGVfdCApIHB4VENCOworCQlweFRhc2tTdGF0dXMtPnBjVGFza05hbWUgPSAoIGNvbnN0IGNoYXIgKiApICYoIHB4VENCLT5wY1Rhc2tOYW1lIFsgMCBdICk7CisJCXB4VGFza1N0YXR1cy0+dXhDdXJyZW50UHJpb3JpdHkgPSBweFRDQi0+dXhQcmlvcml0eTsKKwkJcHhUYXNrU3RhdHVzLT5weFN0YWNrQmFzZSA9IHB4VENCLT5weFN0YWNrOworCQlweFRhc2tTdGF0dXMtPnhUYXNrTnVtYmVyID0gcHhUQ0ItPnV4VENCTnVtYmVyOworCisJCSNpZiAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKQorCQl7CisJCQlweFRhc2tTdGF0dXMtPnV4QmFzZVByaW9yaXR5ID0gcHhUQ0ItPnV4QmFzZVByaW9yaXR5OworCQl9CisJCSNlbHNlCisJCXsKKwkJCXB4VGFza1N0YXR1cy0+dXhCYXNlUHJpb3JpdHkgPSAwOworCQl9CisJCSNlbmRpZgorCisJCSNpZiAoIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTID09IDEgKQorCQl7CisJCQlweFRhc2tTdGF0dXMtPnVsUnVuVGltZUNvdW50ZXIgPSBweFRDQi0+dWxSdW5UaW1lQ291bnRlcjsKKwkJfQorCQkjZWxzZQorCQl7CisJCQlweFRhc2tTdGF0dXMtPnVsUnVuVGltZUNvdW50ZXIgPSAwOworCQl9CisJCSNlbmRpZgorCisJCS8qIE9idGFpbmluZyB0aGUgdGFzayBzdGF0ZSBpcyBhIGxpdHRsZSBmaWRkbHksIHNvIGlzIG9ubHkgZG9uZSBpZiB0aGUKKwkJdmFsdWUgb2YgZVN0YXRlIHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24gaXMgZUludmFsaWQgLSBvdGhlcndpc2UgdGhlCisJCXN0YXRlIGlzIGp1c3Qgc2V0IHRvIHdoYXRldmVyIGlzIHBhc3NlZCBpbi4gKi8KKwkJaWYoIGVTdGF0ZSAhPSBlSW52YWxpZCApCisJCXsKKwkJCWlmKCBweFRDQiA9PSBweEN1cnJlbnRUQ0IgKQorCQkJeworCQkJCXB4VGFza1N0YXR1cy0+ZUN1cnJlbnRTdGF0ZSA9IGVSdW5uaW5nOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXB4VGFza1N0YXR1cy0+ZUN1cnJlbnRTdGF0ZSA9IGVTdGF0ZTsKKworCQkJCSNpZiAoIElOQ0xVREVfdlRhc2tTdXNwZW5kID09IDEgKQorCQkJCXsKKwkJCQkJLyogSWYgdGhlIHRhc2sgaXMgaW4gdGhlIHN1c3BlbmRlZCBsaXN0IHRoZW4gdGhlcmUgaXMgYQorCQkJCQljaGFuY2UgaXQgaXMgYWN0dWFsbHkganVzdCBibG9ja2VkIGluZGVmaW5pdGVseSAtIHNvIHJlYWxseQorCQkJCQlpdCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgYmVpbmcgaW4gdGhlIEJsb2NrZWQgc3RhdGUuICovCisJCQkJCWlmKCBlU3RhdGUgPT0gZVN1c3BlbmRlZCApCisJCQkJCXsKKwkJCQkJCXZUYXNrU3VzcGVuZEFsbCgpOworCQkJCQkJeworCQkJCQkJCWlmKCBsaXN0TElTVF9JVEVNX0NPTlRBSU5FUiggJiggcHhUQ0ItPnhFdmVudExpc3RJdGVtICkgKSAhPSBOVUxMICkKKwkJCQkJCQl7CisJCQkJCQkJCXB4VGFza1N0YXR1cy0+ZUN1cnJlbnRTdGF0ZSA9IGVCbG9ja2VkOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCSggdm9pZCApIHhUYXNrUmVzdW1lQWxsKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJI2VuZGlmIC8qIElOQ0xVREVfdlRhc2tTdXNwZW5kICovCisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlweFRhc2tTdGF0dXMtPmVDdXJyZW50U3RhdGUgPSBlVGFza0dldFN0YXRlKCBweFRDQiApOworCQl9CisKKwkJLyogT2J0YWluaW5nIHRoZSBzdGFjayBzcGFjZSB0YWtlcyBzb21lIHRpbWUsIHNvIHRoZSB4R2V0RnJlZVN0YWNrU3BhY2UKKwkJcGFyYW1ldGVyIGlzIHByb3ZpZGVkIHRvIGFsbG93IGl0IHRvIGJlIHNraXBwZWQuICovCisJCWlmKCB4R2V0RnJlZVN0YWNrU3BhY2UgIT0gcGRGQUxTRSApCisJCXsKKwkJCSNpZiAoIHBvcnRTVEFDS19HUk9XVEggPiAwICkKKwkJCXsKKwkJCQlweFRhc2tTdGF0dXMtPnVzU3RhY2tIaWdoV2F0ZXJNYXJrID0gcHJ2VGFza0NoZWNrRnJlZVN0YWNrU3BhY2UoICggdWludDhfdCAqICkgcHhUQ0ItPnB4RW5kT2ZTdGFjayApOworCQkJfQorCQkJI2Vsc2UKKwkJCXsKKwkJCQlweFRhc2tTdGF0dXMtPnVzU3RhY2tIaWdoV2F0ZXJNYXJrID0gcHJ2VGFza0NoZWNrRnJlZVN0YWNrU3BhY2UoICggdWludDhfdCAqICkgcHhUQ0ItPnB4U3RhY2sgKTsKKwkJCX0KKwkJCSNlbmRpZgorCQl9CisJCWVsc2UKKwkJeworCQkJcHhUYXNrU3RhdHVzLT51c1N0YWNrSGlnaFdhdGVyTWFyayA9IDA7CisJCX0KKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisKKwlzdGF0aWMgVUJhc2VUeXBlX3QgcHJ2TGlzdFRhc2tzV2l0aGluU2luZ2xlTGlzdCggVGFza1N0YXR1c190ICpweFRhc2tTdGF0dXNBcnJheSwgTGlzdF90ICpweExpc3QsIGVUYXNrU3RhdGUgZVN0YXRlICkKKwl7CisJY29uZmlnTElTVF9WT0xBVElMRSBUQ0JfdCAqcHhOZXh0VENCLCAqcHhGaXJzdFRDQjsKKwlVQmFzZVR5cGVfdCB1eFRhc2sgPSAwOworCisJCWlmKCBsaXN0Q1VSUkVOVF9MSVNUX0xFTkdUSCggcHhMaXN0ICkgPiAoIFVCYXNlVHlwZV90ICkgMCApCisJCXsKKwkJCWxpc3RHRVRfT1dORVJfT0ZfTkVYVF9FTlRSWSggcHhGaXJzdFRDQiwgcHhMaXN0ICk7CisKKwkJCS8qIFBvcHVsYXRlIGFuIFRhc2tTdGF0dXNfdCBzdHJ1Y3R1cmUgd2l0aGluIHRoZQorCQkJcHhUYXNrU3RhdHVzQXJyYXkgYXJyYXkgZm9yIGVhY2ggdGFzayB0aGF0IGlzIHJlZmVyZW5jZWQgZnJvbQorCQkJcHhMaXN0LiAgU2VlIHRoZSBkZWZpbml0aW9uIG9mIFRhc2tTdGF0dXNfdCBpbiB0YXNrLmggZm9yIHRoZQorCQkJbWVhbmluZyBvZiBlYWNoIFRhc2tTdGF0dXNfdCBzdHJ1Y3R1cmUgbWVtYmVyLiAqLworCQkJZG8KKwkJCXsKKwkJCQlsaXN0R0VUX09XTkVSX09GX05FWFRfRU5UUlkoIHB4TmV4dFRDQiwgcHhMaXN0ICk7CisJCQkJdlRhc2tHZXRJbmZvKCAoIFRhc2tIYW5kbGVfdCApIHB4TmV4dFRDQiwgJiggcHhUYXNrU3RhdHVzQXJyYXlbIHV4VGFzayBdICksIHBkVFJVRSwgZVN0YXRlICk7CisJCQkJdXhUYXNrKys7CisJCQl9IHdoaWxlKCBweE5leHRUQ0IgIT0gcHhGaXJzdFRDQiApOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisKKwkJcmV0dXJuIHV4VGFzazsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkgfHwgKCBJTkNMVURFX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayA9PSAxICkgKQorCisJc3RhdGljIHVpbnQxNl90IHBydlRhc2tDaGVja0ZyZWVTdGFja1NwYWNlKCBjb25zdCB1aW50OF90ICogcHVjU3RhY2tCeXRlICkKKwl7CisJdWludDMyX3QgdWxDb3VudCA9IDBVOworCisJCXdoaWxlKCAqcHVjU3RhY2tCeXRlID09ICggdWludDhfdCApIHRza1NUQUNLX0ZJTExfQllURSApCisJCXsKKwkJCXB1Y1N0YWNrQnl0ZSAtPSBwb3J0U1RBQ0tfR1JPV1RIOworCQkJdWxDb3VudCsrOworCQl9CisKKwkJdWxDb3VudCAvPSAoIHVpbnQzMl90ICkgc2l6ZW9mKCBTdGFja1R5cGVfdCApOyAvKmxpbnQgIWU5NjEgQ2FzdGluZyBpcyBub3QgcmVkdW5kYW50IG9uIHNtYWxsZXIgYXJjaGl0ZWN0dXJlcy4gKi8KKworCQlyZXR1cm4gKCB1aW50MTZfdCApIHVsQ291bnQ7CisJfQorCisjZW5kaWYgLyogKCAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkgfHwgKCBJTkNMVURFX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayA9PSAxICkgKSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIElOQ0xVREVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrID09IDEgKQorCisJVUJhc2VUeXBlX3QgdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrKCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCXsKKwlUQ0JfdCAqcHhUQ0I7CisJdWludDhfdCAqcHVjRW5kT2ZTdGFjazsKKwlVQmFzZVR5cGVfdCB1eFJldHVybjsKKworCQlweFRDQiA9IHBydkdldFRDQkZyb21IYW5kbGUoIHhUYXNrICk7CisKKwkJI2lmIHBvcnRTVEFDS19HUk9XVEggPCAwCisJCXsKKwkJCXB1Y0VuZE9mU3RhY2sgPSAoIHVpbnQ4X3QgKiApIHB4VENCLT5weFN0YWNrOworCQl9CisJCSNlbHNlCisJCXsKKwkJCXB1Y0VuZE9mU3RhY2sgPSAoIHVpbnQ4X3QgKiApIHB4VENCLT5weEVuZE9mU3RhY2s7CisJCX0KKwkJI2VuZGlmCisKKwkJdXhSZXR1cm4gPSAoIFVCYXNlVHlwZV90ICkgcHJ2VGFza0NoZWNrRnJlZVN0YWNrU3BhY2UoIHB1Y0VuZE9mU3RhY2sgKTsKKworCQlyZXR1cm4gdXhSZXR1cm47CisJfQorCisjZW5kaWYgLyogSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBJTkNMVURFX3ZUYXNrRGVsZXRlID09IDEgKQorCisJc3RhdGljIHZvaWQgcHJ2RGVsZXRlVENCKCBUQ0JfdCAqcHhUQ0IgKQorCXsKKwkJLyogVGhpcyBjYWxsIGlzIHJlcXVpcmVkIHNwZWNpZmljYWxseSBmb3IgdGhlIFRyaUNvcmUgcG9ydC4gIEl0IG11c3QgYmUKKwkJYWJvdmUgdGhlIHZQb3J0RnJlZSgpIGNhbGxzLiAgVGhlIGNhbGwgaXMgYWxzbyB1c2VkIGJ5IHBvcnRzL2RlbW9zIHRoYXQKKwkJd2FudCB0byBhbGxvY2F0ZSBhbmQgY2xlYW4gUkFNIHN0YXRpY2FsbHkuICovCisJCXBvcnRDTEVBTl9VUF9UQ0IoIHB4VENCICk7CisKKwkJLyogRnJlZSB1cCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgc2NoZWR1bGVyIGZvciB0aGUgdGFzay4gIEl0IGlzIHVwCisJCXRvIHRoZSB0YXNrIHRvIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgYXQgdGhlIGFwcGxpY2F0aW9uIGxldmVsLiAqLworCQkjaWYgKCBjb25maWdVU0VfTkVXTElCX1JFRU5UUkFOVCA9PSAxICkKKwkJeworCQkJX3JlY2xhaW1fcmVlbnQoICYoIHB4VENCLT54TmV3TGliX3JlZW50ICkgKTsKKwkJfQorCQkjZW5kaWYgLyogY29uZmlnVVNFX05FV0xJQl9SRUVOVFJBTlQgKi8KKworCQkjaWYoICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAwICkgJiYgKCBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDAgKSApCisJCXsKKwkJCS8qIFRoZSB0YXNrIGNhbiBvbmx5IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgLSBmcmVlIGJvdGgKKwkJCXRoZSBzdGFjayBhbmQgVENCLiAqLworCQkJdlBvcnRGcmVlKCBweFRDQi0+cHhTdGFjayApOworCQkJdlBvcnRGcmVlKCBweFRDQiApOworCQl9CisJCSNlbGlmKCB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRSAhPSAwICkgLypsaW50ICFlNzMxIE1hY3JvIGhhcyBiZWVuIGNvbnNvbGlkYXRlZCBmb3IgcmVhZGFiaWxpdHkgcmVhc29ucy4gKi8KKwkJeworCQkJLyogVGhlIHRhc2sgY291bGQgaGF2ZSBiZWVuIGFsbG9jYXRlZCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBzbworCQkJY2hlY2sgd2hhdCB3YXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgYmVmb3JlIHRyeWluZyB0byBmcmVlIHRoZQorCQkJbWVtb3J5LiAqLworCQkJaWYoIHB4VENCLT51Y1N0YXRpY2FsbHlBbGxvY2F0ZWQgPT0gdHNrRFlOQU1JQ0FMTFlfQUxMT0NBVEVEX1NUQUNLX0FORF9UQ0IgKQorCQkJeworCQkJCS8qIEJvdGggdGhlIHN0YWNrIGFuZCBUQ0Igd2VyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHksIHNvIGJvdGgKKwkJCQltdXN0IGJlIGZyZWVkLiAqLworCQkJCXZQb3J0RnJlZSggcHhUQ0ItPnB4U3RhY2sgKTsKKwkJCQl2UG9ydEZyZWUoIHB4VENCICk7CisJCQl9CisJCQllbHNlIGlmKCBweFRDQi0+dWNTdGF0aWNhbGx5QWxsb2NhdGVkID09IHRza1NUQVRJQ0FMTFlfQUxMT0NBVEVEX1NUQUNLX09OTFkgKQorCQkJeworCQkJCS8qIE9ubHkgdGhlIHN0YWNrIHdhcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCwgc28gdGhlIFRDQiBpcyB0aGUKKwkJCQlvbmx5IG1lbW9yeSB0aGF0IG11c3QgYmUgZnJlZWQuICovCisJCQkJdlBvcnRGcmVlKCBweFRDQiApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIE5laXRoZXIgdGhlIHN0YWNrIG5vciB0aGUgVENCIHdlcmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LCBzbworCQkJCW5vdGhpbmcgbmVlZHMgdG8gYmUgZnJlZWQuICovCisJCQkJY29uZmlnQVNTRVJUKCBweFRDQi0+dWNTdGF0aWNhbGx5QWxsb2NhdGVkID09IHRza1NUQVRJQ0FMTFlfQUxMT0NBVEVEX1NUQUNLX0FORF9UQ0IJKTsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OICovCisJfQorCisjZW5kaWYgLyogSU5DTFVERV92VGFza0RlbGV0ZSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlJlc2V0TmV4dFRhc2tVbmJsb2NrVGltZSggdm9pZCApCit7CitUQ0JfdCAqcHhUQ0I7CisKKwlpZiggbGlzdExJU1RfSVNfRU1QVFkoIHB4RGVsYXllZFRhc2tMaXN0ICkgIT0gcGRGQUxTRSApCisJeworCQkvKiBUaGUgbmV3IGN1cnJlbnQgZGVsYXllZCBsaXN0IGlzIGVtcHR5LiAgU2V0IHhOZXh0VGFza1VuYmxvY2tUaW1lIHRvCisJCXRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlIHNvIGl0IGlzCWV4dHJlbWVseSB1bmxpa2VseSB0aGF0IHRoZQorCQlpZiggeFRpY2tDb3VudCA+PSB4TmV4dFRhc2tVbmJsb2NrVGltZSApIHRlc3Qgd2lsbCBwYXNzIHVudGlsCisJCXRoZXJlIGlzIGFuIGl0ZW0gaW4gdGhlIGRlbGF5ZWQgbGlzdC4gKi8KKwkJeE5leHRUYXNrVW5ibG9ja1RpbWUgPSBwb3J0TUFYX0RFTEFZOworCX0KKwllbHNlCisJeworCQkvKiBUaGUgbmV3IGN1cnJlbnQgZGVsYXllZCBsaXN0IGlzIG5vdCBlbXB0eSwgZ2V0IHRoZSB2YWx1ZSBvZgorCQl0aGUgaXRlbSBhdCB0aGUgaGVhZCBvZiB0aGUgZGVsYXllZCBsaXN0LiAgVGhpcyBpcyB0aGUgdGltZSBhdAorCQl3aGljaCB0aGUgdGFzayBhdCB0aGUgaGVhZCBvZiB0aGUgZGVsYXllZCBsaXN0IHNob3VsZCBiZSByZW1vdmVkCisJCWZyb20gdGhlIEJsb2NrZWQgc3RhdGUuICovCisJCSggcHhUQ0IgKSA9ICggVENCX3QgKiApIGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggcHhEZWxheWVkVGFza0xpc3QgKTsKKwkJeE5leHRUYXNrVW5ibG9ja1RpbWUgPSBsaXN0R0VUX0xJU1RfSVRFTV9WQUxVRSggJiggKCBweFRDQiApLT54U3RhdGVMaXN0SXRlbSApICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoICggSU5DTFVERV94VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlID09IDEgKSB8fCAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKSApCisKKwlUYXNrSGFuZGxlX3QgeFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSggdm9pZCApCisJeworCVRhc2tIYW5kbGVfdCB4UmV0dXJuOworCisJCS8qIEEgY3JpdGljYWwgc2VjdGlvbiBpcyBub3QgcmVxdWlyZWQgYXMgdGhpcyBpcyBub3QgY2FsbGVkIGZyb20KKwkJYW4gaW50ZXJydXB0IGFuZCB0aGUgY3VycmVudCBUQ0Igd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgZm9yIGFueQorCQlpbmRpdmlkdWFsIGV4ZWN1dGlvbiB0aHJlYWQuICovCisJCXhSZXR1cm4gPSBweEN1cnJlbnRUQ0I7CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorCisjZW5kaWYgLyogKCAoIElOQ0xVREVfeFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSA9PSAxICkgfHwgKCBjb25maWdVU0VfTVVURVhFUyA9PSAxICkgKSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoICggSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlID09IDEgKSB8fCAoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApICkKKworCUJhc2VUeXBlX3QgeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSggdm9pZCApCisJeworCUJhc2VUeXBlX3QgeFJldHVybjsKKworCQlpZiggeFNjaGVkdWxlclJ1bm5pbmcgPT0gcGRGQUxTRSApCisJCXsKKwkJCXhSZXR1cm4gPSB0YXNrU0NIRURVTEVSX05PVF9TVEFSVEVEOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoIHV4U2NoZWR1bGVyU3VzcGVuZGVkID09ICggVUJhc2VUeXBlX3QgKSBwZEZBTFNFICkKKwkJCXsKKwkJCQl4UmV0dXJuID0gdGFza1NDSEVEVUxFUl9SVU5OSU5HOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXhSZXR1cm4gPSB0YXNrU0NIRURVTEVSX1NVU1BFTkRFRDsKKwkJCX0KKwkJfQorCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qICggKCBJTkNMVURFX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUgPT0gMSApIHx8ICggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkgKSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKQorCisJQmFzZVR5cGVfdCB4VGFza1ByaW9yaXR5SW5oZXJpdCggVGFza0hhbmRsZV90IGNvbnN0IHB4TXV0ZXhIb2xkZXIgKQorCXsKKwlUQ0JfdCAqIGNvbnN0IHB4TXV0ZXhIb2xkZXJUQ0IgPSAoIFRDQl90ICogKSBweE11dGV4SG9sZGVyOworCUJhc2VUeXBlX3QgeFJldHVybiA9IHBkRkFMU0U7CisKKwkJLyogSWYgdGhlIG11dGV4IHdhcyBnaXZlbiBiYWNrIGJ5IGFuIGludGVycnVwdCB3aGlsZSB0aGUgcXVldWUgd2FzCisJCWxvY2tlZCB0aGVuIHRoZSBtdXRleCBob2xkZXIgbWlnaHQgbm93IGJlIE5VTEwuICBfUkJfIElzIHRoaXMgc3RpbGwKKwkJbmVlZGVkIGFzIGludGVycnVwdHMgY2FuIG5vIGxvbmdlciB1c2UgbXV0ZXhlcz8gKi8KKwkJaWYoIHB4TXV0ZXhIb2xkZXIgIT0gTlVMTCApCisJCXsKKwkJCS8qIElmIHRoZSBob2xkZXIgb2YgdGhlIG11dGV4IGhhcyBhIHByaW9yaXR5IGJlbG93IHRoZSBwcmlvcml0eSBvZgorCQkJdGhlIHRhc2sgYXR0ZW1wdGluZyB0byBvYnRhaW4gdGhlIG11dGV4IHRoZW4gaXQgd2lsbCB0ZW1wb3JhcmlseQorCQkJaW5oZXJpdCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sgYXR0ZW1wdGluZyB0byBvYnRhaW4gdGhlIG11dGV4LiAqLworCQkJaWYoIHB4TXV0ZXhIb2xkZXJUQ0ItPnV4UHJpb3JpdHkgPCBweEN1cnJlbnRUQ0ItPnV4UHJpb3JpdHkgKQorCQkJeworCQkJCS8qIEFkanVzdCB0aGUgbXV0ZXggaG9sZGVyIHN0YXRlIHRvIGFjY291bnQgZm9yIGl0cyBuZXcKKwkJCQlwcmlvcml0eS4gIE9ubHkgcmVzZXQgdGhlIGV2ZW50IGxpc3QgaXRlbSB2YWx1ZSBpZiB0aGUgdmFsdWUgaXMKKwkJCQlub3QgYmVpbmcgdXNlZCBmb3IgYW55dGhpbmcgZWxzZS4gKi8KKwkJCQlpZiggKCBsaXN0R0VUX0xJU1RfSVRFTV9WQUxVRSggJiggcHhNdXRleEhvbGRlclRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApICYgdGFza0VWRU5UX0xJU1RfSVRFTV9WQUxVRV9JTl9VU0UgKSA9PSAwVUwgKQorCQkJCXsKKwkJCQkJbGlzdFNFVF9MSVNUX0lURU1fVkFMVUUoICYoIHB4TXV0ZXhIb2xkZXJUQ0ItPnhFdmVudExpc3RJdGVtICksICggVGlja1R5cGVfdCApIGNvbmZpZ01BWF9QUklPUklUSUVTIC0gKCBUaWNrVHlwZV90ICkgcHhDdXJyZW50VENCLT51eFByaW9yaXR5ICk7IC8qbGludCAhZTk2MSBNSVNSQSBleGNlcHRpb24gYXMgdGhlIGNhc3RzIGFyZSBvbmx5IHJlZHVuZGFudCBmb3Igc29tZSBwb3J0cy4gKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKworCQkJCS8qIElmIHRoZSB0YXNrIGJlaW5nIG1vZGlmaWVkIGlzIGluIHRoZSByZWFkeSBzdGF0ZSBpdCB3aWxsIG5lZWQKKwkJCQl0byBiZSBtb3ZlZCBpbnRvIGEgbmV3IGxpc3QuICovCisJCQkJaWYoIGxpc3RJU19DT05UQUlORURfV0lUSElOKCAmKCBweFJlYWR5VGFza3NMaXN0c1sgcHhNdXRleEhvbGRlclRDQi0+dXhQcmlvcml0eSBdICksICYoIHB4TXV0ZXhIb2xkZXJUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKSAhPSBwZEZBTFNFICkKKwkJCQl7CisJCQkJCWlmKCB1eExpc3RSZW1vdmUoICYoIHB4TXV0ZXhIb2xkZXJUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKSA9PSAoIFVCYXNlVHlwZV90ICkgMCApCisJCQkJCXsKKwkJCQkJCXRhc2tSRVNFVF9SRUFEWV9QUklPUklUWSggcHhNdXRleEhvbGRlclRDQi0+dXhQcmlvcml0eSApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisKKwkJCQkJLyogSW5oZXJpdCB0aGUgcHJpb3JpdHkgYmVmb3JlIGJlaW5nIG1vdmVkIGludG8gdGhlIG5ldyBsaXN0LiAqLworCQkJCQlweE11dGV4SG9sZGVyVENCLT51eFByaW9yaXR5ID0gcHhDdXJyZW50VENCLT51eFByaW9yaXR5OworCQkJCQlwcnZBZGRUYXNrVG9SZWFkeUxpc3QoIHB4TXV0ZXhIb2xkZXJUQ0IgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogSnVzdCBpbmhlcml0IHRoZSBwcmlvcml0eS4gKi8KKwkJCQkJcHhNdXRleEhvbGRlclRDQi0+dXhQcmlvcml0eSA9IHB4Q3VycmVudFRDQi0+dXhQcmlvcml0eTsKKwkJCQl9CisKKwkJCQl0cmFjZVRBU0tfUFJJT1JJVFlfSU5IRVJJVCggcHhNdXRleEhvbGRlclRDQiwgcHhDdXJyZW50VENCLT51eFByaW9yaXR5ICk7CisKKwkJCQkvKiBJbmhlcml0YW5jZSBvY2N1cnJlZC4gKi8KKwkJCQl4UmV0dXJuID0gcGRUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKCBweE11dGV4SG9sZGVyVENCLT51eEJhc2VQcmlvcml0eSA8IHB4Q3VycmVudFRDQi0+dXhQcmlvcml0eSApCisJCQkJeworCQkJCQkvKiBUaGUgYmFzZSBwcmlvcml0eSBvZiB0aGUgbXV0ZXggaG9sZGVyIGlzIGxvd2VyIHRoYW4gdGhlCisJCQkJCXByaW9yaXR5IG9mIHRoZSB0YXNrIGF0dGVtcHRpbmcgdG8gdGFrZSB0aGUgbXV0ZXgsIGJ1dCB0aGUKKwkJCQkJY3VycmVudCBwcmlvcml0eSBvZiB0aGUgbXV0ZXggaG9sZGVyIGlzIG5vdCBsb3dlciB0aGFuIHRoZQorCQkJCQlwcmlvcml0eSBvZiB0aGUgdGFzayBhdHRlbXB0aW5nIHRvIHRha2UgdGhlIG11dGV4LgorCQkJCQlUaGVyZWZvcmUgdGhlIG11dGV4IGhvbGRlciBtdXN0IGhhdmUgYWxyZWFkeSBpbmhlcml0ZWQgYQorCQkJCQlwcmlvcml0eSwgYnV0IGluaGVyaXRhbmNlIHdvdWxkIGhhdmUgb2NjdXJyZWQgaWYgdGhhdCBoYWQKKwkJCQkJbm90IGJlZW4gdGhlIGNhc2UuICovCisJCQkJCXhSZXR1cm4gPSBwZFRSVUU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfTVVURVhFUyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKQorCisJQmFzZVR5cGVfdCB4VGFza1ByaW9yaXR5RGlzaW5oZXJpdCggVGFza0hhbmRsZV90IGNvbnN0IHB4TXV0ZXhIb2xkZXIgKQorCXsKKwlUQ0JfdCAqIGNvbnN0IHB4VENCID0gKCBUQ0JfdCAqICkgcHhNdXRleEhvbGRlcjsKKwlCYXNlVHlwZV90IHhSZXR1cm4gPSBwZEZBTFNFOworCisJCWlmKCBweE11dGV4SG9sZGVyICE9IE5VTEwgKQorCQl7CisJCQkvKiBBIHRhc2sgY2FuIG9ubHkgaGF2ZSBhbiBpbmhlcml0ZWQgcHJpb3JpdHkgaWYgaXQgaG9sZHMgdGhlIG11dGV4LgorCQkJSWYgdGhlIG11dGV4IGlzIGhlbGQgYnkgYSB0YXNrIHRoZW4gaXQgY2Fubm90IGJlIGdpdmVuIGZyb20gYW4KKwkJCWludGVycnVwdCwgYW5kIGlmIGEgbXV0ZXggaXMgZ2l2ZW4gYnkgdGhlIGhvbGRpbmcgdGFzayB0aGVuIGl0IG11c3QKKwkJCWJlIHRoZSBydW5uaW5nIHN0YXRlIHRhc2suICovCisJCQljb25maWdBU1NFUlQoIHB4VENCID09IHB4Q3VycmVudFRDQiApOworCQkJY29uZmlnQVNTRVJUKCBweFRDQi0+dXhNdXRleGVzSGVsZCApOworCQkJKCBweFRDQi0+dXhNdXRleGVzSGVsZCApLS07CisKKwkJCS8qIEhhcyB0aGUgaG9sZGVyIG9mIHRoZSBtdXRleCBpbmhlcml0ZWQgdGhlIHByaW9yaXR5IG9mIGFub3RoZXIKKwkJCXRhc2s/ICovCisJCQlpZiggcHhUQ0ItPnV4UHJpb3JpdHkgIT0gcHhUQ0ItPnV4QmFzZVByaW9yaXR5ICkKKwkJCXsKKwkJCQkvKiBPbmx5IGRpc2luaGVyaXQgaWYgbm8gb3RoZXIgbXV0ZXhlcyBhcmUgaGVsZC4gKi8KKwkJCQlpZiggcHhUQ0ItPnV4TXV0ZXhlc0hlbGQgPT0gKCBVQmFzZVR5cGVfdCApIDAgKQorCQkJCXsKKwkJCQkJLyogQSB0YXNrIGNhbiBvbmx5IGhhdmUgYW4gaW5oZXJpdGVkIHByaW9yaXR5IGlmIGl0IGhvbGRzCisJCQkJCXRoZSBtdXRleC4gIElmIHRoZSBtdXRleCBpcyBoZWxkIGJ5IGEgdGFzayB0aGVuIGl0IGNhbm5vdCBiZQorCQkJCQlnaXZlbiBmcm9tIGFuIGludGVycnVwdCwgYW5kIGlmIGEgbXV0ZXggaXMgZ2l2ZW4gYnkgdGhlCisJCQkJCWhvbGRpbmcgdGFzayB0aGVuIGl0IG11c3QgYmUgdGhlIHJ1bm5pbmcgc3RhdGUgdGFzay4gIFJlbW92ZQorCQkJCQl0aGUgaG9sZGluZyB0YXNrIGZyb20gdGhlIHJlYWR5IGxpc3QuICovCisJCQkJCWlmKCB1eExpc3RSZW1vdmUoICYoIHB4VENCLT54U3RhdGVMaXN0SXRlbSApICkgPT0gKCBVQmFzZVR5cGVfdCApIDAgKQorCQkJCQl7CisJCQkJCQl0YXNrUkVTRVRfUkVBRFlfUFJJT1JJVFkoIHB4VENCLT51eFByaW9yaXR5ICk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKworCQkJCQkvKiBEaXNpbmhlcml0IHRoZSBwcmlvcml0eSBiZWZvcmUgYWRkaW5nIHRoZSB0YXNrIGludG8gdGhlCisJCQkJCW5ldwlyZWFkeSBsaXN0LiAqLworCQkJCQl0cmFjZVRBU0tfUFJJT1JJVFlfRElTSU5IRVJJVCggcHhUQ0IsIHB4VENCLT51eEJhc2VQcmlvcml0eSApOworCQkJCQlweFRDQi0+dXhQcmlvcml0eSA9IHB4VENCLT51eEJhc2VQcmlvcml0eTsKKworCQkJCQkvKiBSZXNldCB0aGUgZXZlbnQgbGlzdCBpdGVtIHZhbHVlLiAgSXQgY2Fubm90IGJlIGluIHVzZSBmb3IKKwkJCQkJYW55IG90aGVyIHB1cnBvc2UgaWYgdGhpcyB0YXNrIGlzIHJ1bm5pbmcsIGFuZCBpdCBtdXN0IGJlCisJCQkJCXJ1bm5pbmcgdG8gZ2l2ZSBiYWNrIHRoZSBtdXRleC4gKi8KKwkJCQkJbGlzdFNFVF9MSVNUX0lURU1fVkFMVUUoICYoIHB4VENCLT54RXZlbnRMaXN0SXRlbSApLCAoIFRpY2tUeXBlX3QgKSBjb25maWdNQVhfUFJJT1JJVElFUyAtICggVGlja1R5cGVfdCApIHB4VENCLT51eFByaW9yaXR5ICk7IC8qbGludCAhZTk2MSBNSVNSQSBleGNlcHRpb24gYXMgdGhlIGNhc3RzIGFyZSBvbmx5IHJlZHVuZGFudCBmb3Igc29tZSBwb3J0cy4gKi8KKwkJCQkJcHJ2QWRkVGFza1RvUmVhZHlMaXN0KCBweFRDQiApOworCisJCQkJCS8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgYSBjb250ZXh0IHN3aXRjaCBpcyByZXF1aXJlZC4KKwkJCQkJVGhpcyBpcyBvbmx5IGFjdHVhbGx5IHJlcXVpcmVkIGluIHRoZSBjb3JuZXIgY2FzZSB3aGVyZWJ5CisJCQkJCW11bHRpcGxlIG11dGV4ZXMgd2VyZSBoZWxkIGFuZCB0aGUgbXV0ZXhlcyB3ZXJlIGdpdmVuIGJhY2sKKwkJCQkJaW4gYW4gb3JkZXIgZGlmZmVyZW50IHRvIHRoYXQgaW4gd2hpY2ggdGhleSB3ZXJlIHRha2VuLgorCQkJCQlJZiBhIGNvbnRleHQgc3dpdGNoIGRpZCBub3Qgb2NjdXIgd2hlbiB0aGUgZmlyc3QgbXV0ZXggd2FzCisJCQkJCXJldHVybmVkLCBldmVuIGlmIGEgdGFzayB3YXMgd2FpdGluZyBvbiBpdCwgdGhlbiBhIGNvbnRleHQKKwkJCQkJc3dpdGNoIHNob3VsZCBvY2N1ciB3aGVuIHRoZSBsYXN0IG11dGV4IGlzIHJldHVybmVkIHdoZXRoZXIKKwkJCQkJYSB0YXNrIGlzIHdhaXRpbmcgb24gaXQgb3Igbm90LiAqLworCQkJCQl4UmV0dXJuID0gcGRUUlVFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9NVVRFWEVTICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCisKKwl2b2lkIHZUYXNrUHJpb3JpdHlEaXNpbmhlcml0QWZ0ZXJUaW1lb3V0KCBUYXNrSGFuZGxlX3QgY29uc3QgcHhNdXRleEhvbGRlciwgVUJhc2VUeXBlX3QgdXhIaWdoZXN0UHJpb3JpdHlXYWl0aW5nVGFzayApCisJeworCVRDQl90ICogY29uc3QgcHhUQ0IgPSAoIFRDQl90ICogKSBweE11dGV4SG9sZGVyOworCVVCYXNlVHlwZV90IHV4UHJpb3JpdHlVc2VkT25FbnRyeSwgdXhQcmlvcml0eVRvVXNlOworCWNvbnN0IFVCYXNlVHlwZV90IHV4T25seU9uZU11dGV4SGVsZCA9ICggVUJhc2VUeXBlX3QgKSAxOworCisJCWlmKCBweE11dGV4SG9sZGVyICE9IE5VTEwgKQorCQl7CisJCQkvKiBJZiBweE11dGV4SG9sZGVyIGlzIG5vdCBOVUxMIHRoZW4gdGhlIGhvbGRlciBtdXN0IGhvbGQgYXQgbGVhc3QKKwkJCW9uZSBtdXRleC4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggcHhUQ0ItPnV4TXV0ZXhlc0hlbGQgKTsKKworCQkJLyogRGV0ZXJtaW5lIHRoZSBwcmlvcml0eSB0byB3aGljaCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sgdGhhdAorCQkJaG9sZHMgdGhlIG11dGV4IHNob3VsZCBiZSBzZXQuICBUaGlzIHdpbGwgYmUgdGhlIGdyZWF0ZXIgb2YgdGhlCisJCQlob2xkaW5nIHRhc2sncyBiYXNlIHByaW9yaXR5IGFuZCB0aGUgcHJpb3JpdHkgb2YgdGhlIGhpZ2hlc3QKKwkJCXByaW9yaXR5IHRhc2sgdGhhdCBpcyB3YWl0aW5nIHRvIG9idGFpbiB0aGUgbXV0ZXguICovCisJCQlpZiggcHhUQ0ItPnV4QmFzZVByaW9yaXR5IDwgdXhIaWdoZXN0UHJpb3JpdHlXYWl0aW5nVGFzayApCisJCQl7CisJCQkJdXhQcmlvcml0eVRvVXNlID0gdXhIaWdoZXN0UHJpb3JpdHlXYWl0aW5nVGFzazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl1eFByaW9yaXR5VG9Vc2UgPSBweFRDQi0+dXhCYXNlUHJpb3JpdHk7CisJCQl9CisKKwkJCS8qIERvZXMgdGhlIHByaW9yaXR5IG5lZWQgdG8gY2hhbmdlPyAqLworCQkJaWYoIHB4VENCLT51eFByaW9yaXR5ICE9IHV4UHJpb3JpdHlUb1VzZSApCisJCQl7CisJCQkJLyogT25seSBkaXNpbmhlcml0IGlmIG5vIG90aGVyIG11dGV4ZXMgYXJlIGhlbGQuICBUaGlzIGlzIGEKKwkJCQlzaW1wbGlmaWNhdGlvbiBpbiB0aGUgcHJpb3JpdHkgaW5oZXJpdGFuY2UgaW1wbGVtZW50YXRpb24uICBJZgorCQkJCXRoZSB0YXNrIHRoYXQgaG9sZHMgdGhlIG11dGV4IGlzIGFsc28gaG9sZGluZyBvdGhlciBtdXRleGVzIHRoZW4KKwkJCQl0aGUgb3RoZXIgbXV0ZXhlcyBtYXkgaGF2ZSBjYXVzZWQgdGhlIHByaW9yaXR5IGluaGVyaXRhbmNlLiAqLworCQkJCWlmKCBweFRDQi0+dXhNdXRleGVzSGVsZCA9PSB1eE9ubHlPbmVNdXRleEhlbGQgKQorCQkJCXsKKwkJCQkJLyogSWYgYSB0YXNrIGhhcyB0aW1lZCBvdXQgYmVjYXVzZSBpdCBhbHJlYWR5IGhvbGRzIHRoZQorCQkJCQltdXRleCBpdCB3YXMgdHJ5aW5nIHRvIG9idGFpbiB0aGVuIGl0IGNhbm5vdCBvZiBpbmhlcml0ZWQKKwkJCQkJaXRzIG93biBwcmlvcml0eS4gKi8KKwkJCQkJY29uZmlnQVNTRVJUKCBweFRDQiAhPSBweEN1cnJlbnRUQ0IgKTsKKworCQkJCQkvKiBEaXNpbmhlcml0IHRoZSBwcmlvcml0eSwgcmVtZW1iZXJpbmcgdGhlIHByZXZpb3VzCisJCQkJCXByaW9yaXR5IHRvIGZhY2lsaXRhdGUgZGV0ZXJtaW5pbmcgdGhlIHN1YmplY3QgdGFzaydzCisJCQkJCXN0YXRlLiAqLworCQkJCQl0cmFjZVRBU0tfUFJJT1JJVFlfRElTSU5IRVJJVCggcHhUQ0IsIHB4VENCLT51eEJhc2VQcmlvcml0eSApOworCQkJCQl1eFByaW9yaXR5VXNlZE9uRW50cnkgPSBweFRDQi0+dXhQcmlvcml0eTsKKwkJCQkJcHhUQ0ItPnV4UHJpb3JpdHkgPSB1eFByaW9yaXR5VG9Vc2U7CisKKwkJCQkJLyogT25seSByZXNldCB0aGUgZXZlbnQgbGlzdCBpdGVtIHZhbHVlIGlmIHRoZSB2YWx1ZSBpcyBub3QKKwkJCQkJYmVpbmcgdXNlZCBmb3IgYW55dGhpbmcgZWxzZS4gKi8KKwkJCQkJaWYoICggbGlzdEdFVF9MSVNUX0lURU1fVkFMVUUoICYoIHB4VENCLT54RXZlbnRMaXN0SXRlbSApICkgJiB0YXNrRVZFTlRfTElTVF9JVEVNX1ZBTFVFX0lOX1VTRSApID09IDBVTCApCisJCQkJCXsKKwkJCQkJCWxpc3RTRVRfTElTVF9JVEVNX1ZBTFVFKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSwgKCBUaWNrVHlwZV90ICkgY29uZmlnTUFYX1BSSU9SSVRJRVMgLSAoIFRpY2tUeXBlX3QgKSB1eFByaW9yaXR5VG9Vc2UgKTsgLypsaW50ICFlOTYxIE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBvcnRzLiAqLworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQl9CisKKwkJCQkJLyogSWYgdGhlIHJ1bm5pbmcgdGFzayBpcyBub3QgdGhlIHRhc2sgdGhhdCBob2xkcyB0aGUgbXV0ZXgKKwkJCQkJdGhlbiB0aGUgdGFzayB0aGF0IGhvbGRzIHRoZSBtdXRleCBjb3VsZCBiZSBpbiBlaXRoZXIgdGhlCisJCQkJCVJlYWR5LCBCbG9ja2VkIG9yIFN1c3BlbmRlZCBzdGF0ZXMuICBPbmx5IHJlbW92ZSB0aGUgdGFzaworCQkJCQlmcm9tIGl0cyBjdXJyZW50IHN0YXRlIGxpc3QgaWYgaXQgaXMgaW4gdGhlIFJlYWR5IHN0YXRlIGFzCisJCQkJCXRoZSB0YXNrJ3MgcHJpb3JpdHkgaXMgZ29pbmcgdG8gY2hhbmdlIGFuZCB0aGVyZSBpcyBvbmUKKwkJCQkJUmVhZHkgbGlzdCBwZXIgcHJpb3JpdHkuICovCisJCQkJCWlmKCBsaXN0SVNfQ09OVEFJTkVEX1dJVEhJTiggJiggcHhSZWFkeVRhc2tzTGlzdHNbIHV4UHJpb3JpdHlVc2VkT25FbnRyeSBdICksICYoIHB4VENCLT54U3RhdGVMaXN0SXRlbSApICkgIT0gcGRGQUxTRSApCisJCQkJCXsKKwkJCQkJCWlmKCB1eExpc3RSZW1vdmUoICYoIHB4VENCLT54U3RhdGVMaXN0SXRlbSApICkgPT0gKCBVQmFzZVR5cGVfdCApIDAgKQorCQkJCQkJeworCQkJCQkJCXRhc2tSRVNFVF9SRUFEWV9QUklPUklUWSggcHhUQ0ItPnV4UHJpb3JpdHkgKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCQl9CisKKwkJCQkJCXBydkFkZFRhc2tUb1JlYWR5TGlzdCggcHhUQ0IgKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9NVVRFWEVTICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggcG9ydENSSVRJQ0FMX05FU1RJTkdfSU5fVENCID09IDEgKQorCisJdm9pZCB2VGFza0VudGVyQ3JpdGljYWwoIHZvaWQgKQorCXsKKwkJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCisJCWlmKCB4U2NoZWR1bGVyUnVubmluZyAhPSBwZEZBTFNFICkKKwkJeworCQkJKCBweEN1cnJlbnRUQ0ItPnV4Q3JpdGljYWxOZXN0aW5nICkrKzsKKworCQkJLyogVGhpcyBpcyBub3QgdGhlIGludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIGVudGVyIGNyaXRpY2FsCisJCQlmdW5jdGlvbiBzbwlhc3NlcnQoKSBpZiBpdCBpcyBiZWluZyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQKKwkJCWNvbnRleHQuICBPbmx5IEFQSSBmdW5jdGlvbnMgdGhhdCBlbmQgaW4gIkZyb21JU1IiIGNhbiBiZSB1c2VkIGluIGFuCisJCQlpbnRlcnJ1cHQuICBPbmx5IGFzc2VydCBpZiB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCBpcyAxIHRvCisJCQlwcm90ZWN0IGFnYWluc3QgcmVjdXJzaXZlIGNhbGxzIGlmIHRoZSBhc3NlcnQgZnVuY3Rpb24gYWxzbyB1c2VzIGEKKwkJCWNyaXRpY2FsIHNlY3Rpb24uICovCisJCQlpZiggcHhDdXJyZW50VENCLT51eENyaXRpY2FsTmVzdGluZyA9PSAxICkKKwkJCXsKKwkJCQlwb3J0QVNTRVJUX0lGX0lOX0lTUigpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCisjZW5kaWYgLyogcG9ydENSSVRJQ0FMX05FU1RJTkdfSU5fVENCICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggcG9ydENSSVRJQ0FMX05FU1RJTkdfSU5fVENCID09IDEgKQorCisJdm9pZCB2VGFza0V4aXRDcml0aWNhbCggdm9pZCApCisJeworCQlpZiggeFNjaGVkdWxlclJ1bm5pbmcgIT0gcGRGQUxTRSApCisJCXsKKwkJCWlmKCBweEN1cnJlbnRUQ0ItPnV4Q3JpdGljYWxOZXN0aW5nID4gMFUgKQorCQkJeworCQkJCSggcHhDdXJyZW50VENCLT51eENyaXRpY2FsTmVzdGluZyApLS07CisKKwkJCQlpZiggcHhDdXJyZW50VENCLT51eENyaXRpY2FsTmVzdGluZyA9PSAwVSApCisJCQkJeworCQkJCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisKKyNlbmRpZiAvKiBwb3J0Q1JJVElDQUxfTkVTVElOR19JTl9UQ0IgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkgJiYgKCBjb25maWdVU0VfU1RBVFNfRk9STUFUVElOR19GVU5DVElPTlMgPiAwICkgKQorCisJc3RhdGljIGNoYXIgKnBydldyaXRlTmFtZVRvQnVmZmVyKCBjaGFyICpwY0J1ZmZlciwgY29uc3QgY2hhciAqcGNUYXNrTmFtZSApCisJeworCXNpemVfdCB4OworCisJCS8qIFN0YXJ0IGJ5IGNvcHlpbmcgdGhlIGVudGlyZSBzdHJpbmcuICovCisJCXN0cmNweSggcGNCdWZmZXIsIHBjVGFza05hbWUgKTsKKworCQkvKiBQYWQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHdpdGggc3BhY2VzIHRvIGVuc3VyZSBjb2x1bW5zIGxpbmUgdXAgd2hlbgorCQlwcmludGVkIG91dC4gKi8KKwkJZm9yKCB4ID0gc3RybGVuKCBwY0J1ZmZlciApOyB4IDwgKCBzaXplX3QgKSAoIGNvbmZpZ01BWF9UQVNLX05BTUVfTEVOIC0gMSApOyB4KysgKQorCQl7CisJCQlwY0J1ZmZlclsgeCBdID0gJyAnOworCQl9CisKKwkJLyogVGVybWluYXRlLiAqLworCQlwY0J1ZmZlclsgeCBdID0gMHgwMDsKKworCQkvKiBSZXR1cm4gdGhlIG5ldyBlbmQgb2Ygc3RyaW5nLiAqLworCQlyZXR1cm4gJiggcGNCdWZmZXJbIHggXSApOworCX0KKworI2VuZGlmIC8qICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSAmJiAoIGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUyA+IDAgKSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSAmJiAoIGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUyA+IDAgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKSApCisKKwl2b2lkIHZUYXNrTGlzdCggY2hhciAqIHBjV3JpdGVCdWZmZXIgKQorCXsKKwlUYXNrU3RhdHVzX3QgKnB4VGFza1N0YXR1c0FycmF5OworCXZvbGF0aWxlIFVCYXNlVHlwZV90IHV4QXJyYXlTaXplLCB4OworCWNoYXIgY1N0YXR1czsKKworCQkvKgorCQkgKiBQTEVBU0UgTk9URToKKwkJICoKKwkJICogVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2Ugb25seSwgYW5kIGlzIHVzZWQgYnkgbWFueQorCQkgKiBvZiB0aGUgZGVtbyBhcHBsaWNhdGlvbnMuICBEbyBub3QgY29uc2lkZXIgaXQgdG8gYmUgcGFydCBvZiB0aGUKKwkJICogc2NoZWR1bGVyLgorCQkgKgorCQkgKiB2VGFza0xpc3QoKSBjYWxscyB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpLCB0aGVuIGZvcm1hdHMgcGFydCBvZiB0aGUKKwkJICogdXhUYXNrR2V0U3lzdGVtU3RhdGUoKSBvdXRwdXQgaW50byBhIGh1bWFuIHJlYWRhYmxlIHRhYmxlIHRoYXQKKwkJICogZGlzcGxheXMgdGFzayBuYW1lcywgc3RhdGVzIGFuZCBzdGFjayB1c2FnZS4KKwkJICoKKwkJICogdlRhc2tMaXN0KCkgaGFzIGEgZGVwZW5kZW5jeSBvbiB0aGUgc3ByaW50ZigpIEMgbGlicmFyeSBmdW5jdGlvbiB0aGF0CisJCSAqIG1pZ2h0IGJsb2F0IHRoZSBjb2RlIHNpemUsIHVzZSBhIGxvdCBvZiBzdGFjaywgYW5kIHByb3ZpZGUgZGlmZmVyZW50CisJCSAqIHJlc3VsdHMgb24gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIEFuIGFsdGVybmF0aXZlLCB0aW55LCB0aGlyZCBwYXJ0eSwKKwkJICogYW5kIGxpbWl0ZWQgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRhdGlvbiBvZiBzcHJpbnRmKCkgaXMgcHJvdmlkZWQgaW4KKwkJICogbWFueSBvZiB0aGUgRnJlZVJUT1MvRGVtbyBzdWItZGlyZWN0b3JpZXMgaW4gYSBmaWxlIGNhbGxlZAorCQkgKiBwcmludGYtc3RkYXJnLmMgKG5vdGUgcHJpbnRmLXN0ZGFyZy5jIGRvZXMgbm90IHByb3ZpZGUgYSBmdWxsCisJCSAqIHNucHJpbnRmKCkgaW1wbGVtZW50YXRpb24hKS4KKwkJICoKKwkJICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBwcm9kdWN0aW9uIHN5c3RlbXMgY2FsbCB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpCisJCSAqIGRpcmVjdGx5IHRvIGdldCBhY2Nlc3MgdG8gcmF3IHN0YXRzIGRhdGEsIHJhdGhlciB0aGFuIGluZGlyZWN0bHkKKwkJICogdGhyb3VnaCBhIGNhbGwgdG8gdlRhc2tMaXN0KCkuCisJCSAqLworCisKKwkJLyogTWFrZSBzdXJlIHRoZSB3cml0ZSBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhIHN0cmluZy4gKi8KKwkJKnBjV3JpdGVCdWZmZXIgPSAweDAwOworCisJCS8qIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgbnVtYmVyIG9mIHRhc2tzIGluIGNhc2UgaXQgY2hhbmdlcyB3aGlsZSB0aGlzCisJCWZ1bmN0aW9uIGlzIGV4ZWN1dGluZy4gKi8KKwkJdXhBcnJheVNpemUgPSB1eEN1cnJlbnROdW1iZXJPZlRhc2tzOworCisJCS8qIEFsbG9jYXRlIGFuIGFycmF5IGluZGV4IGZvciBlYWNoIHRhc2suICBOT1RFISAgaWYKKwkJY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gaXMgc2V0IHRvIDAgdGhlbiBwdlBvcnRNYWxsb2MoKSB3aWxsCisJCWVxdWF0ZSB0byBOVUxMLiAqLworCQlweFRhc2tTdGF0dXNBcnJheSA9IHB2UG9ydE1hbGxvYyggdXhDdXJyZW50TnVtYmVyT2ZUYXNrcyAqIHNpemVvZiggVGFza1N0YXR1c190ICkgKTsKKworCQlpZiggcHhUYXNrU3RhdHVzQXJyYXkgIT0gTlVMTCApCisJCXsKKwkJCS8qIEdlbmVyYXRlIHRoZSAoYmluYXJ5KSBkYXRhLiAqLworCQkJdXhBcnJheVNpemUgPSB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSggcHhUYXNrU3RhdHVzQXJyYXksIHV4QXJyYXlTaXplLCBOVUxMICk7CisKKwkJCS8qIENyZWF0ZSBhIGh1bWFuIHJlYWRhYmxlIHRhYmxlIGZyb20gdGhlIGJpbmFyeSBkYXRhLiAqLworCQkJZm9yKCB4ID0gMDsgeCA8IHV4QXJyYXlTaXplOyB4KysgKQorCQkJeworCQkJCXN3aXRjaCggcHhUYXNrU3RhdHVzQXJyYXlbIHggXS5lQ3VycmVudFN0YXRlICkKKwkJCQl7CisJCQkJCWNhc2UgZVJ1bm5pbmc6CQljU3RhdHVzID0gdHNrUlVOTklOR19DSEFSOworCQkJCQkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgZVJlYWR5OgkJY1N0YXR1cyA9IHRza1JFQURZX0NIQVI7CisJCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBlQmxvY2tlZDoJCWNTdGF0dXMgPSB0c2tCTE9DS0VEX0NIQVI7CisJCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBlU3VzcGVuZGVkOgljU3RhdHVzID0gdHNrU1VTUEVOREVEX0NIQVI7CisJCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBlRGVsZXRlZDoJCWNTdGF0dXMgPSB0c2tERUxFVEVEX0NIQVI7CisJCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoJCQkvKiBTaG91bGQgbm90IGdldCBoZXJlLCBidXQgaXQgaXMgaW5jbHVkZWQKKwkJCQkJCQkJCQl0byBwcmV2ZW50IHN0YXRpYyBjaGVja2luZyBlcnJvcnMuICovCisJCQkJCQkJCQkJY1N0YXR1cyA9IDB4MDA7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogV3JpdGUgdGhlIHRhc2sgbmFtZSB0byB0aGUgc3RyaW5nLCBwYWRkaW5nIHdpdGggc3BhY2VzIHNvIGl0CisJCQkJY2FuIGJlIHByaW50ZWQgaW4gdGFidWxhciBmb3JtIG1vcmUgZWFzaWx5LiAqLworCQkJCXBjV3JpdGVCdWZmZXIgPSBwcnZXcml0ZU5hbWVUb0J1ZmZlciggcGNXcml0ZUJ1ZmZlciwgcHhUYXNrU3RhdHVzQXJyYXlbIHggXS5wY1Rhc2tOYW1lICk7CisKKwkJCQkvKiBXcml0ZSB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nLiAqLworCQkJCXNwcmludGYoIHBjV3JpdGVCdWZmZXIsICJcdCVjXHQldVx0JXVcdCV1XHJcbiIsIGNTdGF0dXMsICggdW5zaWduZWQgaW50ICkgcHhUYXNrU3RhdHVzQXJyYXlbIHggXS51eEN1cnJlbnRQcmlvcml0eSwgKCB1bnNpZ25lZCBpbnQgKSBweFRhc2tTdGF0dXNBcnJheVsgeCBdLnVzU3RhY2tIaWdoV2F0ZXJNYXJrLCAoIHVuc2lnbmVkIGludCApIHB4VGFza1N0YXR1c0FycmF5WyB4IF0ueFRhc2tOdW1iZXIgKTsKKwkJCQlwY1dyaXRlQnVmZmVyICs9IHN0cmxlbiggcGNXcml0ZUJ1ZmZlciApOworCQkJfQorCisJCQkvKiBGcmVlIHRoZSBhcnJheSBhZ2Fpbi4gIE5PVEUhICBJZiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTgorCQkJaXMgMCB0aGVuIHZQb3J0RnJlZSgpIHdpbGwgYmUgI2RlZmluZWQgdG8gbm90aGluZy4gKi8KKwkJCXZQb3J0RnJlZSggcHhUYXNrU3RhdHVzQXJyYXkgKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKworI2VuZGlmIC8qICggKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApICYmICggY29uZmlnVVNFX1NUQVRTX0ZPUk1BVFRJTkdfRlVOQ1RJT05TID4gMCApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoICggY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgPT0gMSApICYmICggY29uZmlnVVNFX1NUQVRTX0ZPUk1BVFRJTkdfRlVOQ1RJT05TID4gMCApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKKworCXZvaWQgdlRhc2tHZXRSdW5UaW1lU3RhdHMoIGNoYXIgKnBjV3JpdGVCdWZmZXIgKQorCXsKKwlUYXNrU3RhdHVzX3QgKnB4VGFza1N0YXR1c0FycmF5OworCXZvbGF0aWxlIFVCYXNlVHlwZV90IHV4QXJyYXlTaXplLCB4OworCXVpbnQzMl90IHVsVG90YWxUaW1lLCB1bFN0YXRzQXNQZXJjZW50YWdlOworCisJCSNpZiggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICE9IDEgKQorCQl7CisJCQkjZXJyb3IgY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZIG11c3QgYWxzbyBiZSBzZXQgdG8gMSBpbiBGcmVlUlRPU0NvbmZpZy5oIHRvIHVzZSB2VGFza0dldFJ1blRpbWVTdGF0cygpLgorCQl9CisJCSNlbmRpZgorCisJCS8qCisJCSAqIFBMRUFTRSBOT1RFOgorCQkgKgorCQkgKiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZSBvbmx5LCBhbmQgaXMgdXNlZCBieSBtYW55CisJCSAqIG9mIHRoZSBkZW1vIGFwcGxpY2F0aW9ucy4gIERvIG5vdCBjb25zaWRlciBpdCB0byBiZSBwYXJ0IG9mIHRoZQorCQkgKiBzY2hlZHVsZXIuCisJCSAqCisJCSAqIHZUYXNrR2V0UnVuVGltZVN0YXRzKCkgY2FsbHMgdXhUYXNrR2V0U3lzdGVtU3RhdGUoKSwgdGhlbiBmb3JtYXRzIHBhcnQKKwkJICogb2YgdGhlIHV4VGFza0dldFN5c3RlbVN0YXRlKCkgb3V0cHV0IGludG8gYSBodW1hbiByZWFkYWJsZSB0YWJsZSB0aGF0CisJCSAqIGRpc3BsYXlzIHRoZSBhbW91bnQgb2YgdGltZSBlYWNoIHRhc2sgaGFzIHNwZW50IGluIHRoZSBSdW5uaW5nIHN0YXRlCisJCSAqIGluIGJvdGggYWJzb2x1dGUgYW5kIHBlcmNlbnRhZ2UgdGVybXMuCisJCSAqCisJCSAqIHZUYXNrR2V0UnVuVGltZVN0YXRzKCkgaGFzIGEgZGVwZW5kZW5jeSBvbiB0aGUgc3ByaW50ZigpIEMgbGlicmFyeQorCQkgKiBmdW5jdGlvbiB0aGF0IG1pZ2h0IGJsb2F0IHRoZSBjb2RlIHNpemUsIHVzZSBhIGxvdCBvZiBzdGFjaywgYW5kCisJCSAqIHByb3ZpZGUgZGlmZmVyZW50IHJlc3VsdHMgb24gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIEFuIGFsdGVybmF0aXZlLAorCQkgKiB0aW55LCB0aGlyZCBwYXJ0eSwgYW5kIGxpbWl0ZWQgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRhdGlvbiBvZgorCQkgKiBzcHJpbnRmKCkgaXMgcHJvdmlkZWQgaW4gbWFueSBvZiB0aGUgRnJlZVJUT1MvRGVtbyBzdWItZGlyZWN0b3JpZXMgaW4KKwkJICogYSBmaWxlIGNhbGxlZCBwcmludGYtc3RkYXJnLmMgKG5vdGUgcHJpbnRmLXN0ZGFyZy5jIGRvZXMgbm90IHByb3ZpZGUKKwkJICogYSBmdWxsIHNucHJpbnRmKCkgaW1wbGVtZW50YXRpb24hKS4KKwkJICoKKwkJICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBwcm9kdWN0aW9uIHN5c3RlbXMgY2FsbCB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSgpCisJCSAqIGRpcmVjdGx5IHRvIGdldCBhY2Nlc3MgdG8gcmF3IHN0YXRzIGRhdGEsIHJhdGhlciB0aGFuIGluZGlyZWN0bHkKKwkJICogdGhyb3VnaCBhIGNhbGwgdG8gdlRhc2tHZXRSdW5UaW1lU3RhdHMoKS4KKwkJICovCisKKwkJLyogTWFrZSBzdXJlIHRoZSB3cml0ZSBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhIHN0cmluZy4gKi8KKwkJKnBjV3JpdGVCdWZmZXIgPSAweDAwOworCisJCS8qIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgbnVtYmVyIG9mIHRhc2tzIGluIGNhc2UgaXQgY2hhbmdlcyB3aGlsZSB0aGlzCisJCWZ1bmN0aW9uIGlzIGV4ZWN1dGluZy4gKi8KKwkJdXhBcnJheVNpemUgPSB1eEN1cnJlbnROdW1iZXJPZlRhc2tzOworCisJCS8qIEFsbG9jYXRlIGFuIGFycmF5IGluZGV4IGZvciBlYWNoIHRhc2suICBOT1RFISAgSWYKKwkJY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gaXMgc2V0IHRvIDAgdGhlbiBwdlBvcnRNYWxsb2MoKSB3aWxsCisJCWVxdWF0ZSB0byBOVUxMLiAqLworCQlweFRhc2tTdGF0dXNBcnJheSA9IHB2UG9ydE1hbGxvYyggdXhDdXJyZW50TnVtYmVyT2ZUYXNrcyAqIHNpemVvZiggVGFza1N0YXR1c190ICkgKTsKKworCQlpZiggcHhUYXNrU3RhdHVzQXJyYXkgIT0gTlVMTCApCisJCXsKKwkJCS8qIEdlbmVyYXRlIHRoZSAoYmluYXJ5KSBkYXRhLiAqLworCQkJdXhBcnJheVNpemUgPSB1eFRhc2tHZXRTeXN0ZW1TdGF0ZSggcHhUYXNrU3RhdHVzQXJyYXksIHV4QXJyYXlTaXplLCAmdWxUb3RhbFRpbWUgKTsKKworCQkJLyogRm9yIHBlcmNlbnRhZ2UgY2FsY3VsYXRpb25zLiAqLworCQkJdWxUb3RhbFRpbWUgLz0gMTAwVUw7CisKKwkJCS8qIEF2b2lkIGRpdmlkZSBieSB6ZXJvIGVycm9ycy4gKi8KKwkJCWlmKCB1bFRvdGFsVGltZSA+IDAgKQorCQkJeworCQkJCS8qIENyZWF0ZSBhIGh1bWFuIHJlYWRhYmxlIHRhYmxlIGZyb20gdGhlIGJpbmFyeSBkYXRhLiAqLworCQkJCWZvciggeCA9IDA7IHggPCB1eEFycmF5U2l6ZTsgeCsrICkKKwkJCQl7CisJCQkJCS8qIFdoYXQgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgcnVuIHRpbWUgaGFzIHRoZSB0YXNrIHVzZWQ/CisJCQkJCVRoaXMgd2lsbCBhbHdheXMgYmUgcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuCisJCQkJCXVsVG90YWxSdW5UaW1lRGl2MTAwIGhhcyBhbHJlYWR5IGJlZW4gZGl2aWRlZCBieSAxMDAuICovCisJCQkJCXVsU3RhdHNBc1BlcmNlbnRhZ2UgPSBweFRhc2tTdGF0dXNBcnJheVsgeCBdLnVsUnVuVGltZUNvdW50ZXIgLyB1bFRvdGFsVGltZTsKKworCQkJCQkvKiBXcml0ZSB0aGUgdGFzayBuYW1lIHRvIHRoZSBzdHJpbmcsIHBhZGRpbmcgd2l0aAorCQkJCQlzcGFjZXMgc28gaXQgY2FuIGJlIHByaW50ZWQgaW4gdGFidWxhciBmb3JtIG1vcmUKKwkJCQkJZWFzaWx5LiAqLworCQkJCQlwY1dyaXRlQnVmZmVyID0gcHJ2V3JpdGVOYW1lVG9CdWZmZXIoIHBjV3JpdGVCdWZmZXIsIHB4VGFza1N0YXR1c0FycmF5WyB4IF0ucGNUYXNrTmFtZSApOworCisJCQkJCWlmKCB1bFN0YXRzQXNQZXJjZW50YWdlID4gMFVMICkKKwkJCQkJeworCQkJCQkJI2lmZGVmIHBvcnRMVV9QUklOVEZfU1BFQ0lGSUVSX1JFUVVJUkVECisJCQkJCQl7CisJCQkJCQkJc3ByaW50ZiggcGNXcml0ZUJ1ZmZlciwgIlx0JWx1XHRcdCVsdSUlXHJcbiIsIHB4VGFza1N0YXR1c0FycmF5WyB4IF0udWxSdW5UaW1lQ291bnRlciwgdWxTdGF0c0FzUGVyY2VudGFnZSApOworCQkJCQkJfQorCQkJCQkJI2Vsc2UKKwkJCQkJCXsKKwkJCQkJCQkvKiBzaXplb2YoIGludCApID09IHNpemVvZiggbG9uZyApIHNvIGEgc21hbGxlcgorCQkJCQkJCXByaW50ZigpIGxpYnJhcnkgY2FuIGJlIHVzZWQuICovCisJCQkJCQkJc3ByaW50ZiggcGNXcml0ZUJ1ZmZlciwgIlx0JXVcdFx0JXUlJVxyXG4iLCAoIHVuc2lnbmVkIGludCApIHB4VGFza1N0YXR1c0FycmF5WyB4IF0udWxSdW5UaW1lQ291bnRlciwgKCB1bnNpZ25lZCBpbnQgKSB1bFN0YXRzQXNQZXJjZW50YWdlICk7CisJCQkJCQl9CisJCQkJCQkjZW5kaWYKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8qIElmIHRoZSBwZXJjZW50YWdlIGlzIHplcm8gaGVyZSB0aGVuIHRoZSB0YXNrIGhhcworCQkJCQkJY29uc3VtZWQgbGVzcyB0aGFuIDElIG9mIHRoZSB0b3RhbCBydW4gdGltZS4gKi8KKwkJCQkJCSNpZmRlZiBwb3J0TFVfUFJJTlRGX1NQRUNJRklFUl9SRVFVSVJFRAorCQkJCQkJeworCQkJCQkJCXNwcmludGYoIHBjV3JpdGVCdWZmZXIsICJcdCVsdVx0XHQ8MSUlXHJcbiIsIHB4VGFza1N0YXR1c0FycmF5WyB4IF0udWxSdW5UaW1lQ291bnRlciApOworCQkJCQkJfQorCQkJCQkJI2Vsc2UKKwkJCQkJCXsKKwkJCQkJCQkvKiBzaXplb2YoIGludCApID09IHNpemVvZiggbG9uZyApIHNvIGEgc21hbGxlcgorCQkJCQkJCXByaW50ZigpIGxpYnJhcnkgY2FuIGJlIHVzZWQuICovCisJCQkJCQkJc3ByaW50ZiggcGNXcml0ZUJ1ZmZlciwgIlx0JXVcdFx0PDElJVxyXG4iLCAoIHVuc2lnbmVkIGludCApIHB4VGFza1N0YXR1c0FycmF5WyB4IF0udWxSdW5UaW1lQ291bnRlciApOworCQkJCQkJfQorCQkJCQkJI2VuZGlmCisJCQkJCX0KKworCQkJCQlwY1dyaXRlQnVmZmVyICs9IHN0cmxlbiggcGNXcml0ZUJ1ZmZlciApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisKKwkJCS8qIEZyZWUgdGhlIGFycmF5IGFnYWluLiAgTk9URSEgIElmIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OCisJCQlpcyAwIHRoZW4gdlBvcnRGcmVlKCkgd2lsbCBiZSAjZGVmaW5lZCB0byBub3RoaW5nLiAqLworCQkJdlBvcnRGcmVlKCBweFRhc2tTdGF0dXNBcnJheSApOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCisjZW5kaWYgLyogKCAoIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTID09IDEgKSAmJiAoIGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUyA+IDAgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitUaWNrVHlwZV90IHV4VGFza1Jlc2V0RXZlbnRJdGVtVmFsdWUoIHZvaWQgKQoreworVGlja1R5cGVfdCB1eFJldHVybjsKKworCXV4UmV0dXJuID0gbGlzdEdFVF9MSVNUX0lURU1fVkFMVUUoICYoIHB4Q3VycmVudFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApOworCisJLyogUmVzZXQgdGhlIGV2ZW50IGxpc3QgaXRlbSB0byBpdHMgbm9ybWFsIHZhbHVlIC0gc28gaXQgY2FuIGJlIHVzZWQgd2l0aAorCXF1ZXVlcyBhbmQgc2VtYXBob3Jlcy4gKi8KKwlsaXN0U0VUX0xJU1RfSVRFTV9WQUxVRSggJiggcHhDdXJyZW50VENCLT54RXZlbnRMaXN0SXRlbSApLCAoICggVGlja1R5cGVfdCApIGNvbmZpZ01BWF9QUklPUklUSUVTIC0gKCBUaWNrVHlwZV90ICkgcHhDdXJyZW50VENCLT51eFByaW9yaXR5ICkgKTsgLypsaW50ICFlOTYxIE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBvcnRzLiAqLworCisJcmV0dXJuIHV4UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKQorCisJdm9pZCAqcHZUYXNrSW5jcmVtZW50TXV0ZXhIZWxkQ291bnQoIHZvaWQgKQorCXsKKwkJLyogSWYgeFNlbWFwaG9yZUNyZWF0ZU11dGV4KCkgaXMgY2FsbGVkIGJlZm9yZSBhbnkgdGFza3MgaGF2ZSBiZWVuIGNyZWF0ZWQKKwkJdGhlbiBweEN1cnJlbnRUQ0Igd2lsbCBiZSBOVUxMLiAqLworCQlpZiggcHhDdXJyZW50VENCICE9IE5VTEwgKQorCQl7CisJCQkoIHB4Q3VycmVudFRDQi0+dXhNdXRleGVzSGVsZCApKys7CisJCX0KKworCQlyZXR1cm4gcHhDdXJyZW50VENCOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9NVVRFWEVTICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TID09IDEgKQorCisJdWludDMyX3QgdWxUYXNrTm90aWZ5VGFrZSggQmFzZVR5cGVfdCB4Q2xlYXJDb3VudE9uRXhpdCwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQorCXsKKwl1aW50MzJfdCB1bFJldHVybjsKKworCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJeworCQkJLyogT25seSBibG9jayBpZiB0aGUgbm90aWZpY2F0aW9uIGNvdW50IGlzIG5vdCBhbHJlYWR5IG5vbi16ZXJvLiAqLworCQkJaWYoIHB4Q3VycmVudFRDQi0+dWxOb3RpZmllZFZhbHVlID09IDBVTCApCisJCQl7CisJCQkJLyogTWFyayB0aGlzIHRhc2sgYXMgd2FpdGluZyBmb3IgYSBub3RpZmljYXRpb24uICovCisJCQkJcHhDdXJyZW50VENCLT51Y05vdGlmeVN0YXRlID0gdGFza1dBSVRJTkdfTk9USUZJQ0FUSU9OOworCisJCQkJaWYoIHhUaWNrc1RvV2FpdCA+ICggVGlja1R5cGVfdCApIDAgKQorCQkJCXsKKwkJCQkJcHJ2QWRkQ3VycmVudFRhc2tUb0RlbGF5ZWRMaXN0KCB4VGlja3NUb1dhaXQsIHBkVFJVRSApOworCQkJCQl0cmFjZVRBU0tfTk9USUZZX1RBS0VfQkxPQ0soKTsKKworCQkJCQkvKiBBbGwgcG9ydHMgYXJlIHdyaXR0ZW4gdG8gYWxsb3cgYSB5aWVsZCBpbiBhIGNyaXRpY2FsCisJCQkJCXNlY3Rpb24gKHNvbWUgd2lsbCB5aWVsZCBpbW1lZGlhdGVseSwgb3RoZXJzIHdhaXQgdW50aWwgdGhlCisJCQkJCWNyaXRpY2FsIHNlY3Rpb24gZXhpdHMpIC0gYnV0IGl0IGlzIG5vdCBzb21ldGhpbmcgdGhhdAorCQkJCQlhcHBsaWNhdGlvbiBjb2RlIHNob3VsZCBldmVyIGRvLiAqLworCQkJCQlwb3J0WUlFTERfV0lUSElOX0FQSSgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQl7CisJCQl0cmFjZVRBU0tfTk9USUZZX1RBS0UoKTsKKwkJCXVsUmV0dXJuID0gcHhDdXJyZW50VENCLT51bE5vdGlmaWVkVmFsdWU7CisKKwkJCWlmKCB1bFJldHVybiAhPSAwVUwgKQorCQkJeworCQkJCWlmKCB4Q2xlYXJDb3VudE9uRXhpdCAhPSBwZEZBTFNFICkKKwkJCQl7CisJCQkJCXB4Q3VycmVudFRDQi0+dWxOb3RpZmllZFZhbHVlID0gMFVMOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlweEN1cnJlbnRUQ0ItPnVsTm90aWZpZWRWYWx1ZSA9IHVsUmV0dXJuIC0gKCB1aW50MzJfdCApIDE7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKworCQkJcHhDdXJyZW50VENCLT51Y05vdGlmeVN0YXRlID0gdGFza05PVF9XQUlUSU5HX05PVElGSUNBVElPTjsKKwkJfQorCQl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJCXJldHVybiB1bFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TID09IDEgKQorCisJQmFzZVR5cGVfdCB4VGFza05vdGlmeVdhaXQoIHVpbnQzMl90IHVsQml0c1RvQ2xlYXJPbkVudHJ5LCB1aW50MzJfdCB1bEJpdHNUb0NsZWFyT25FeGl0LCB1aW50MzJfdCAqcHVsTm90aWZpY2F0aW9uVmFsdWUsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKKwl7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCisJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQl7CisJCQkvKiBPbmx5IGJsb2NrIGlmIGEgbm90aWZpY2F0aW9uIGlzIG5vdCBhbHJlYWR5IHBlbmRpbmcuICovCisJCQlpZiggcHhDdXJyZW50VENCLT51Y05vdGlmeVN0YXRlICE9IHRhc2tOT1RJRklDQVRJT05fUkVDRUlWRUQgKQorCQkJeworCQkJCS8qIENsZWFyIGJpdHMgaW4gdGhlIHRhc2sncyBub3RpZmljYXRpb24gdmFsdWUgYXMgYml0cyBtYXkgZ2V0CisJCQkJc2V0CWJ5IHRoZSBub3RpZnlpbmcgdGFzayBvciBpbnRlcnJ1cHQuICBUaGlzIGNhbiBiZSB1c2VkIHRvCisJCQkJY2xlYXIgdGhlIHZhbHVlIHRvIHplcm8uICovCisJCQkJcHhDdXJyZW50VENCLT51bE5vdGlmaWVkVmFsdWUgJj0gfnVsQml0c1RvQ2xlYXJPbkVudHJ5OworCisJCQkJLyogTWFyayB0aGlzIHRhc2sgYXMgd2FpdGluZyBmb3IgYSBub3RpZmljYXRpb24uICovCisJCQkJcHhDdXJyZW50VENCLT51Y05vdGlmeVN0YXRlID0gdGFza1dBSVRJTkdfTk9USUZJQ0FUSU9OOworCisJCQkJaWYoIHhUaWNrc1RvV2FpdCA+ICggVGlja1R5cGVfdCApIDAgKQorCQkJCXsKKwkJCQkJcHJ2QWRkQ3VycmVudFRhc2tUb0RlbGF5ZWRMaXN0KCB4VGlja3NUb1dhaXQsIHBkVFJVRSApOworCQkJCQl0cmFjZVRBU0tfTk9USUZZX1dBSVRfQkxPQ0soKTsKKworCQkJCQkvKiBBbGwgcG9ydHMgYXJlIHdyaXR0ZW4gdG8gYWxsb3cgYSB5aWVsZCBpbiBhIGNyaXRpY2FsCisJCQkJCXNlY3Rpb24gKHNvbWUgd2lsbCB5aWVsZCBpbW1lZGlhdGVseSwgb3RoZXJzIHdhaXQgdW50aWwgdGhlCisJCQkJCWNyaXRpY2FsIHNlY3Rpb24gZXhpdHMpIC0gYnV0IGl0IGlzIG5vdCBzb21ldGhpbmcgdGhhdAorCQkJCQlhcHBsaWNhdGlvbiBjb2RlIHNob3VsZCBldmVyIGRvLiAqLworCQkJCQlwb3J0WUlFTERfV0lUSElOX0FQSSgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQl0YXNrRVhJVF9DUklUSUNBTCgpOworCisJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQl7CisJCQl0cmFjZVRBU0tfTk9USUZZX1dBSVQoKTsKKworCQkJaWYoIHB1bE5vdGlmaWNhdGlvblZhbHVlICE9IE5VTEwgKQorCQkJeworCQkJCS8qIE91dHB1dCB0aGUgY3VycmVudCBub3RpZmljYXRpb24gdmFsdWUsIHdoaWNoIG1heSBvciBtYXkgbm90CisJCQkJaGF2ZSBjaGFuZ2VkLiAqLworCQkJCSpwdWxOb3RpZmljYXRpb25WYWx1ZSA9IHB4Q3VycmVudFRDQi0+dWxOb3RpZmllZFZhbHVlOworCQkJfQorCisJCQkvKiBJZiB1Y05vdGlmeVZhbHVlIGlzIHNldCB0aGVuIGVpdGhlciB0aGUgdGFzayBuZXZlciBlbnRlcmVkIHRoZQorCQkJYmxvY2tlZCBzdGF0ZSAoYmVjYXVzZSBhIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSBwZW5kaW5nKSBvciB0aGUKKwkJCXRhc2sgdW5ibG9ja2VkIGJlY2F1c2Ugb2YgYSBub3RpZmljYXRpb24uICBPdGhlcndpc2UgdGhlIHRhc2sKKwkJCXVuYmxvY2tlZCBiZWNhdXNlIG9mIGEgdGltZW91dC4gKi8KKwkJCWlmKCBweEN1cnJlbnRUQ0ItPnVjTm90aWZ5U3RhdGUgIT0gdGFza05PVElGSUNBVElPTl9SRUNFSVZFRCApCisJCQl7CisJCQkJLyogQSBub3RpZmljYXRpb24gd2FzIG5vdCByZWNlaXZlZC4gKi8KKwkJCQl4UmV0dXJuID0gcGRGQUxTRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBBIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSBwZW5kaW5nIG9yIGEgbm90aWZpY2F0aW9uIHdhcworCQkJCXJlY2VpdmVkIHdoaWxlIHRoZSB0YXNrIHdhcyB3YWl0aW5nLiAqLworCQkJCXB4Q3VycmVudFRDQi0+dWxOb3RpZmllZFZhbHVlICY9IH51bEJpdHNUb0NsZWFyT25FeGl0OworCQkJCXhSZXR1cm4gPSBwZFRSVUU7CisJCQl9CisKKwkJCXB4Q3VycmVudFRDQi0+dWNOb3RpZnlTdGF0ZSA9IHRhc2tOT1RfV0FJVElOR19OT1RJRklDQVRJT047CisJCX0KKwkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TID09IDEgKQorCisJQmFzZVR5cGVfdCB4VGFza0dlbmVyaWNOb3RpZnkoIFRhc2tIYW5kbGVfdCB4VGFza1RvTm90aWZ5LCB1aW50MzJfdCB1bFZhbHVlLCBlTm90aWZ5QWN0aW9uIGVBY3Rpb24sIHVpbnQzMl90ICpwdWxQcmV2aW91c05vdGlmaWNhdGlvblZhbHVlICkKKwl7CisJVENCX3QgKiBweFRDQjsKKwlCYXNlVHlwZV90IHhSZXR1cm4gPSBwZFBBU1M7CisJdWludDhfdCB1Y09yaWdpbmFsTm90aWZ5U3RhdGU7CisKKwkJY29uZmlnQVNTRVJUKCB4VGFza1RvTm90aWZ5ICk7CisJCXB4VENCID0gKCBUQ0JfdCAqICkgeFRhc2tUb05vdGlmeTsKKworCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJeworCQkJaWYoIHB1bFByZXZpb3VzTm90aWZpY2F0aW9uVmFsdWUgIT0gTlVMTCApCisJCQl7CisJCQkJKnB1bFByZXZpb3VzTm90aWZpY2F0aW9uVmFsdWUgPSBweFRDQi0+dWxOb3RpZmllZFZhbHVlOworCQkJfQorCisJCQl1Y09yaWdpbmFsTm90aWZ5U3RhdGUgPSBweFRDQi0+dWNOb3RpZnlTdGF0ZTsKKworCQkJcHhUQ0ItPnVjTm90aWZ5U3RhdGUgPSB0YXNrTk9USUZJQ0FUSU9OX1JFQ0VJVkVEOworCisJCQlzd2l0Y2goIGVBY3Rpb24gKQorCQkJeworCQkJCWNhc2UgZVNldEJpdHMJOgorCQkJCQlweFRDQi0+dWxOb3RpZmllZFZhbHVlIHw9IHVsVmFsdWU7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBlSW5jcmVtZW50CToKKwkJCQkJKCBweFRDQi0+dWxOb3RpZmllZFZhbHVlICkrKzsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGVTZXRWYWx1ZVdpdGhPdmVyd3JpdGUJOgorCQkJCQlweFRDQi0+dWxOb3RpZmllZFZhbHVlID0gdWxWYWx1ZTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGVTZXRWYWx1ZVdpdGhvdXRPdmVyd3JpdGUgOgorCQkJCQlpZiggdWNPcmlnaW5hbE5vdGlmeVN0YXRlICE9IHRhc2tOT1RJRklDQVRJT05fUkVDRUlWRUQgKQorCQkJCQl7CisJCQkJCQlweFRDQi0+dWxOb3RpZmllZFZhbHVlID0gdWxWYWx1ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8qIFRoZSB2YWx1ZSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byB0aGUgdGFzay4gKi8KKwkJCQkJCXhSZXR1cm4gPSBwZEZBSUw7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGVOb0FjdGlvbjoKKwkJCQkJLyogVGhlIHRhc2sgaXMgYmVpbmcgbm90aWZpZWQgd2l0aG91dCBpdHMgbm90aWZ5IHZhbHVlIGJlaW5nCisJCQkJCXVwZGF0ZWQuICovCisJCQkJCWJyZWFrOworCQkJfQorCisJCQl0cmFjZVRBU0tfTk9USUZZKCk7CisKKwkJCS8qIElmIHRoZSB0YXNrIGlzIGluIHRoZSBibG9ja2VkIHN0YXRlIHNwZWNpZmljYWxseSB0byB3YWl0IGZvciBhCisJCQlub3RpZmljYXRpb24gdGhlbiB1bmJsb2NrIGl0IG5vdy4gKi8KKwkJCWlmKCB1Y09yaWdpbmFsTm90aWZ5U3RhdGUgPT0gdGFza1dBSVRJTkdfTk9USUZJQ0FUSU9OICkKKwkJCXsKKwkJCQkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICYoIHB4VENCLT54U3RhdGVMaXN0SXRlbSApICk7CisJCQkJcHJ2QWRkVGFza1RvUmVhZHlMaXN0KCBweFRDQiApOworCisJCQkJLyogVGhlIHRhc2sgc2hvdWxkIG5vdCBoYXZlIGJlZW4gb24gYW4gZXZlbnQgbGlzdC4gKi8KKwkJCQljb25maWdBU1NFUlQoIGxpc3RMSVNUX0lURU1fQ09OVEFJTkVSKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApID09IE5VTEwgKTsKKworCQkJCSNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgIT0gMCApCisJCQkJeworCQkJCQkvKiBJZiBhIHRhc2sgaXMgYmxvY2tlZCB3YWl0aW5nIGZvciBhIG5vdGlmaWNhdGlvbiB0aGVuCisJCQkJCXhOZXh0VGFza1VuYmxvY2tUaW1lIG1pZ2h0IGJlIHNldCB0byB0aGUgYmxvY2tlZCB0YXNrJ3MgdGltZQorCQkJCQlvdXQgdGltZS4gIElmIHRoZSB0YXNrIGlzIHVuYmxvY2tlZCBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgorCQkJCQlhIHRpbWVvdXQgeE5leHRUYXNrVW5ibG9ja1RpbWUgaXMgbm9ybWFsbHkgbGVmdCB1bmNoYW5nZWQsCisJCQkJCWJlY2F1c2UgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCByZXNldCB0byBhIG5ldyB2YWx1ZSB3aGVuCisJCQkJCXRoZSB0aWNrIGNvdW50IGVxdWFscyB4TmV4dFRhc2tVbmJsb2NrVGltZS4gIEhvd2V2ZXIgaWYKKwkJCQkJdGlja2xlc3MgaWRsaW5nIGlzIHVzZWQgaXQgbWlnaHQgYmUgbW9yZSBpbXBvcnRhbnQgdG8gZW50ZXIKKwkJCQkJc2xlZXAgbW9kZSBhdCB0aGUgZWFybGllc3QgcG9zc2libGUgdGltZSAtIHNvIHJlc2V0CisJCQkJCXhOZXh0VGFza1VuYmxvY2tUaW1lIGhlcmUgdG8gZW5zdXJlIGl0IGlzIHVwZGF0ZWQgYXQgdGhlCisJCQkJCWVhcmxpZXN0IHBvc3NpYmxlIHRpbWUuICovCisJCQkJCXBydlJlc2V0TmV4dFRhc2tVbmJsb2NrVGltZSgpOworCQkJCX0KKwkJCQkjZW5kaWYKKworCQkJCWlmKCBweFRDQi0+dXhQcmlvcml0eSA+IHB4Q3VycmVudFRDQi0+dXhQcmlvcml0eSApCisJCQkJeworCQkJCQkvKiBUaGUgbm90aWZpZWQgdGFzayBoYXMgYSBwcmlvcml0eSBhYm92ZSB0aGUgY3VycmVudGx5CisJCQkJCWV4ZWN1dGluZyB0YXNrIHNvIGEgeWllbGQgaXMgcmVxdWlyZWQuICovCisJCQkJCXRhc2tZSUVMRF9JRl9VU0lOR19QUkVFTVBUSU9OKCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyA9PSAxICkKKworCUJhc2VUeXBlX3QgeFRhc2tHZW5lcmljTm90aWZ5RnJvbUlTUiggVGFza0hhbmRsZV90IHhUYXNrVG9Ob3RpZnksIHVpbnQzMl90IHVsVmFsdWUsIGVOb3RpZnlBY3Rpb24gZUFjdGlvbiwgdWludDMyX3QgKnB1bFByZXZpb3VzTm90aWZpY2F0aW9uVmFsdWUsIEJhc2VUeXBlX3QgKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKQorCXsKKwlUQ0JfdCAqIHB4VENCOworCXVpbnQ4X3QgdWNPcmlnaW5hbE5vdGlmeVN0YXRlOworCUJhc2VUeXBlX3QgeFJldHVybiA9IHBkUEFTUzsKKwlVQmFzZVR5cGVfdCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzOworCisJCWNvbmZpZ0FTU0VSVCggeFRhc2tUb05vdGlmeSApOworCisJCS8qIFJUT1MgcG9ydHMgdGhhdCBzdXBwb3J0IGludGVycnVwdCBuZXN0aW5nIGhhdmUgdGhlIGNvbmNlcHQgb2YgYQorCQltYXhpbXVtCXN5c3RlbSBjYWxsIChvciBtYXhpbXVtIEFQSSBjYWxsKSBpbnRlcnJ1cHQgcHJpb3JpdHkuCisJCUludGVycnVwdHMgdGhhdCBhcmUJYWJvdmUgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkgYXJlIGtlZXAKKwkJcGVybWFuZW50bHkgZW5hYmxlZCwgZXZlbiB3aGVuIHRoZSBSVE9TIGtlcm5lbCBpcyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sCisJCWJ1dCBjYW5ub3QgbWFrZSBhbnkgY2FsbHMgdG8gRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucy4gIElmIGNvbmZpZ0FTU0VSVCgpCisJCWlzIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaCB0aGVuCisJCXBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSB3aWxsIHJlc3VsdCBpbiBhbiBhc3NlcnRpb24KKwkJZmFpbHVyZSBpZiBhIEZyZWVSVE9TIEFQSSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgdGhhdCBoYXMKKwkJYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlIHRoZSBjb25maWd1cmVkIG1heGltdW0gc3lzdGVtIGNhbGwKKwkJcHJpb3JpdHkuICBPbmx5IEZyZWVSVE9TIGZ1bmN0aW9ucyB0aGF0IGVuZCBpbiBGcm9tSVNSIGNhbiBiZSBjYWxsZWQKKwkJZnJvbSBpbnRlcnJ1cHRzCXRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgKGxvZ2ljYWxseSkKKwkJYmVsb3cgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgaW50ZXJydXB0IHByaW9yaXR5LiAgRnJlZVJUT1MgbWFpbnRhaW5zIGEKKwkJc2VwYXJhdGUgaW50ZXJydXB0IHNhZmUgQVBJIHRvIGVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgYXMKKwkJc2ltcGxlIGFzIHBvc3NpYmxlLiAgTW9yZSBpbmZvcm1hdGlvbiAoYWxiZWl0IENvcnRleC1NIHNwZWNpZmljKSBpcworCQlwcm92aWRlZCBvbiB0aGUgZm9sbG93aW5nIGxpbms6CisJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwkJcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpOworCisJCXB4VENCID0gKCBUQ0JfdCAqICkgeFRhc2tUb05vdGlmeTsKKworCQl1eFNhdmVkSW50ZXJydXB0U3RhdHVzID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCQl7CisJCQlpZiggcHVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZSAhPSBOVUxMICkKKwkJCXsKKwkJCQkqcHVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZSA9IHB4VENCLT51bE5vdGlmaWVkVmFsdWU7CisJCQl9CisKKwkJCXVjT3JpZ2luYWxOb3RpZnlTdGF0ZSA9IHB4VENCLT51Y05vdGlmeVN0YXRlOworCQkJcHhUQ0ItPnVjTm90aWZ5U3RhdGUgPSB0YXNrTk9USUZJQ0FUSU9OX1JFQ0VJVkVEOworCisJCQlzd2l0Y2goIGVBY3Rpb24gKQorCQkJeworCQkJCWNhc2UgZVNldEJpdHMJOgorCQkJCQlweFRDQi0+dWxOb3RpZmllZFZhbHVlIHw9IHVsVmFsdWU7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBlSW5jcmVtZW50CToKKwkJCQkJKCBweFRDQi0+dWxOb3RpZmllZFZhbHVlICkrKzsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGVTZXRWYWx1ZVdpdGhPdmVyd3JpdGUJOgorCQkJCQlweFRDQi0+dWxOb3RpZmllZFZhbHVlID0gdWxWYWx1ZTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGVTZXRWYWx1ZVdpdGhvdXRPdmVyd3JpdGUgOgorCQkJCQlpZiggdWNPcmlnaW5hbE5vdGlmeVN0YXRlICE9IHRhc2tOT1RJRklDQVRJT05fUkVDRUlWRUQgKQorCQkJCQl7CisJCQkJCQlweFRDQi0+dWxOb3RpZmllZFZhbHVlID0gdWxWYWx1ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8qIFRoZSB2YWx1ZSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byB0aGUgdGFzay4gKi8KKwkJCQkJCXhSZXR1cm4gPSBwZEZBSUw7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGVOb0FjdGlvbiA6CisJCQkJCS8qIFRoZSB0YXNrIGlzIGJlaW5nIG5vdGlmaWVkIHdpdGhvdXQgaXRzIG5vdGlmeSB2YWx1ZSBiZWluZworCQkJCQl1cGRhdGVkLiAqLworCQkJCQlicmVhazsKKwkJCX0KKworCQkJdHJhY2VUQVNLX05PVElGWV9GUk9NX0lTUigpOworCisJCQkvKiBJZiB0aGUgdGFzayBpcyBpbiB0aGUgYmxvY2tlZCBzdGF0ZSBzcGVjaWZpY2FsbHkgdG8gd2FpdCBmb3IgYQorCQkJbm90aWZpY2F0aW9uIHRoZW4gdW5ibG9jayBpdCBub3cuICovCisJCQlpZiggdWNPcmlnaW5hbE5vdGlmeVN0YXRlID09IHRhc2tXQUlUSU5HX05PVElGSUNBVElPTiApCisJCQl7CisJCQkJLyogVGhlIHRhc2sgc2hvdWxkIG5vdCBoYXZlIGJlZW4gb24gYW4gZXZlbnQgbGlzdC4gKi8KKwkJCQljb25maWdBU1NFUlQoIGxpc3RMSVNUX0lURU1fQ09OVEFJTkVSKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApID09IE5VTEwgKTsKKworCQkJCWlmKCB1eFNjaGVkdWxlclN1c3BlbmRlZCA9PSAoIFVCYXNlVHlwZV90ICkgcGRGQUxTRSApCisJCQkJeworCQkJCQkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICYoIHB4VENCLT54U3RhdGVMaXN0SXRlbSApICk7CisJCQkJCXBydkFkZFRhc2tUb1JlYWR5TGlzdCggcHhUQ0IgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogVGhlIGRlbGF5ZWQgYW5kIHJlYWR5IGxpc3RzIGNhbm5vdCBiZSBhY2Nlc3NlZCwgc28gaG9sZAorCQkJCQl0aGlzIHRhc2sgcGVuZGluZyB1bnRpbCB0aGUgc2NoZWR1bGVyIGlzIHJlc3VtZWQuICovCisJCQkJCXZMaXN0SW5zZXJ0RW5kKCAmKCB4UGVuZGluZ1JlYWR5TGlzdCApLCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApOworCQkJCX0KKworCQkJCWlmKCBweFRDQi0+dXhQcmlvcml0eSA+IHB4Q3VycmVudFRDQi0+dXhQcmlvcml0eSApCisJCQkJeworCQkJCQkvKiBUaGUgbm90aWZpZWQgdGFzayBoYXMgYSBwcmlvcml0eSBhYm92ZSB0aGUgY3VycmVudGx5CisJCQkJCWV4ZWN1dGluZyB0YXNrIHNvIGEgeWllbGQgaXMgcmVxdWlyZWQuICovCisJCQkJCWlmKCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICE9IE5VTEwgKQorCQkJCQl7CisJCQkJCQkqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8qIE1hcmsgdGhhdCBhIHlpZWxkIGlzIHBlbmRpbmcgaW4gY2FzZSB0aGUgdXNlciBpcyBub3QKKwkJCQkJCXVzaW5nIHRoZSAieEhpZ2hlclByaW9yaXR5VGFza1dva2VuIiBwYXJhbWV0ZXIgdG8gYW4gSVNSCisJCQkJCQlzYWZlIEZyZWVSVE9TIGZ1bmN0aW9uLiAqLworCQkJCQkJeFlpZWxkUGVuZGluZyA9IHBkVFJVRTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdXhTYXZlZEludGVycnVwdFN0YXR1cyApOworCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgPT0gMSApCisKKwl2b2lkIHZUYXNrTm90aWZ5R2l2ZUZyb21JU1IoIFRhc2tIYW5kbGVfdCB4VGFza1RvTm90aWZ5LCBCYXNlVHlwZV90ICpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkKKwl7CisJVENCX3QgKiBweFRDQjsKKwl1aW50OF90IHVjT3JpZ2luYWxOb3RpZnlTdGF0ZTsKKwlVQmFzZVR5cGVfdCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzOworCisJCWNvbmZpZ0FTU0VSVCggeFRhc2tUb05vdGlmeSApOworCisJCS8qIFJUT1MgcG9ydHMgdGhhdCBzdXBwb3J0IGludGVycnVwdCBuZXN0aW5nIGhhdmUgdGhlIGNvbmNlcHQgb2YgYQorCQltYXhpbXVtCXN5c3RlbSBjYWxsIChvciBtYXhpbXVtIEFQSSBjYWxsKSBpbnRlcnJ1cHQgcHJpb3JpdHkuCisJCUludGVycnVwdHMgdGhhdCBhcmUJYWJvdmUgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgcHJpb3JpdHkgYXJlIGtlZXAKKwkJcGVybWFuZW50bHkgZW5hYmxlZCwgZXZlbiB3aGVuIHRoZSBSVE9TIGtlcm5lbCBpcyBpbiBhIGNyaXRpY2FsIHNlY3Rpb24sCisJCWJ1dCBjYW5ub3QgbWFrZSBhbnkgY2FsbHMgdG8gRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucy4gIElmIGNvbmZpZ0FTU0VSVCgpCisJCWlzIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaCB0aGVuCisJCXBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKSB3aWxsIHJlc3VsdCBpbiBhbiBhc3NlcnRpb24KKwkJZmFpbHVyZSBpZiBhIEZyZWVSVE9TIEFQSSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgdGhhdCBoYXMKKwkJYmVlbiBhc3NpZ25lZCBhIHByaW9yaXR5IGFib3ZlIHRoZSBjb25maWd1cmVkIG1heGltdW0gc3lzdGVtIGNhbGwKKwkJcHJpb3JpdHkuICBPbmx5IEZyZWVSVE9TIGZ1bmN0aW9ucyB0aGF0IGVuZCBpbiBGcm9tSVNSIGNhbiBiZSBjYWxsZWQKKwkJZnJvbSBpbnRlcnJ1cHRzCXRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcHJpb3JpdHkgYXQgb3IgKGxvZ2ljYWxseSkKKwkJYmVsb3cgdGhlIG1heGltdW0gc3lzdGVtIGNhbGwgaW50ZXJydXB0IHByaW9yaXR5LiAgRnJlZVJUT1MgbWFpbnRhaW5zIGEKKwkJc2VwYXJhdGUgaW50ZXJydXB0IHNhZmUgQVBJIHRvIGVuc3VyZSBpbnRlcnJ1cHQgZW50cnkgaXMgYXMgZmFzdCBhbmQgYXMKKwkJc2ltcGxlIGFzIHBvc3NpYmxlLiAgTW9yZSBpbmZvcm1hdGlvbiAoYWxiZWl0IENvcnRleC1NIHNwZWNpZmljKSBpcworCQlwcm92aWRlZCBvbiB0aGUgZm9sbG93aW5nIGxpbms6CisJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwkJcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpOworCisJCXB4VENCID0gKCBUQ0JfdCAqICkgeFRhc2tUb05vdGlmeTsKKworCQl1eFNhdmVkSW50ZXJydXB0U3RhdHVzID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCQl7CisJCQl1Y09yaWdpbmFsTm90aWZ5U3RhdGUgPSBweFRDQi0+dWNOb3RpZnlTdGF0ZTsKKwkJCXB4VENCLT51Y05vdGlmeVN0YXRlID0gdGFza05PVElGSUNBVElPTl9SRUNFSVZFRDsKKworCQkJLyogJ0dpdmluZycgaXMgZXF1aXZhbGVudCB0byBpbmNyZW1lbnRpbmcgYSBjb3VudCBpbiBhIGNvdW50aW5nCisJCQlzZW1hcGhvcmUuICovCisJCQkoIHB4VENCLT51bE5vdGlmaWVkVmFsdWUgKSsrOworCisJCQl0cmFjZVRBU0tfTk9USUZZX0dJVkVfRlJPTV9JU1IoKTsKKworCQkJLyogSWYgdGhlIHRhc2sgaXMgaW4gdGhlIGJsb2NrZWQgc3RhdGUgc3BlY2lmaWNhbGx5IHRvIHdhaXQgZm9yIGEKKwkJCW5vdGlmaWNhdGlvbiB0aGVuIHVuYmxvY2sgaXQgbm93LiAqLworCQkJaWYoIHVjT3JpZ2luYWxOb3RpZnlTdGF0ZSA9PSB0YXNrV0FJVElOR19OT1RJRklDQVRJT04gKQorCQkJeworCQkJCS8qIFRoZSB0YXNrIHNob3VsZCBub3QgaGF2ZSBiZWVuIG9uIGFuIGV2ZW50IGxpc3QuICovCisJCQkJY29uZmlnQVNTRVJUKCBsaXN0TElTVF9JVEVNX0NPTlRBSU5FUiggJiggcHhUQ0ItPnhFdmVudExpc3RJdGVtICkgKSA9PSBOVUxMICk7CisKKwkJCQlpZiggdXhTY2hlZHVsZXJTdXNwZW5kZWQgPT0gKCBVQmFzZVR5cGVfdCApIHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApOworCQkJCQlwcnZBZGRUYXNrVG9SZWFkeUxpc3QoIHB4VENCICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIFRoZSBkZWxheWVkIGFuZCByZWFkeSBsaXN0cyBjYW5ub3QgYmUgYWNjZXNzZWQsIHNvIGhvbGQKKwkJCQkJdGhpcyB0YXNrIHBlbmRpbmcgdW50aWwgdGhlIHNjaGVkdWxlciBpcyByZXN1bWVkLiAqLworCQkJCQl2TGlzdEluc2VydEVuZCggJiggeFBlbmRpbmdSZWFkeUxpc3QgKSwgJiggcHhUQ0ItPnhFdmVudExpc3RJdGVtICkgKTsKKwkJCQl9CisKKwkJCQlpZiggcHhUQ0ItPnV4UHJpb3JpdHkgPiBweEN1cnJlbnRUQ0ItPnV4UHJpb3JpdHkgKQorCQkJCXsKKwkJCQkJLyogVGhlIG5vdGlmaWVkIHRhc2sgaGFzIGEgcHJpb3JpdHkgYWJvdmUgdGhlIGN1cnJlbnRseQorCQkJCQlleGVjdXRpbmcgdGFzayBzbyBhIHlpZWxkIGlzIHJlcXVpcmVkLiAqLworCQkJCQlpZiggcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiAhPSBOVUxMICkKKwkJCQkJeworCQkJCQkJKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZFRSVUU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvKiBNYXJrIHRoYXQgYSB5aWVsZCBpcyBwZW5kaW5nIGluIGNhc2UgdGhlIHVzZXIgaXMgbm90CisJCQkJCQl1c2luZyB0aGUgInhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiIgcGFyYW1ldGVyIGluIGFuIElTUgorCQkJCQkJc2FmZSBGcmVlUlRPUyBmdW5jdGlvbi4gKi8KKwkJCQkJCXhZaWVsZFBlbmRpbmcgPSBwZFRSVUU7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJfQorCQlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgKTsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgPT0gMSApCisKKwlCYXNlVHlwZV90IHhUYXNrTm90aWZ5U3RhdGVDbGVhciggVGFza0hhbmRsZV90IHhUYXNrICkKKwl7CisJVENCX3QgKnB4VENCOworCUJhc2VUeXBlX3QgeFJldHVybjsKKworCQkvKiBJZiBudWxsIGlzIHBhc3NlZCBpbiBoZXJlIHRoZW4gaXQgaXMgdGhlIGNhbGxpbmcgdGFzayB0aGF0IGlzIGhhdmluZworCQlpdHMgbm90aWZpY2F0aW9uIHN0YXRlIGNsZWFyZWQuICovCisJCXB4VENCID0gcHJ2R2V0VENCRnJvbUhhbmRsZSggeFRhc2sgKTsKKworCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKKwkJeworCQkJaWYoIHB4VENCLT51Y05vdGlmeVN0YXRlID09IHRhc2tOT1RJRklDQVRJT05fUkVDRUlWRUQgKQorCQkJeworCQkJCXB4VENCLT51Y05vdGlmeVN0YXRlID0gdGFza05PVF9XQUlUSU5HX05PVElGSUNBVElPTjsKKwkJCQl4UmV0dXJuID0gcGRQQVNTOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXhSZXR1cm4gPSBwZEZBSUw7CisJCQl9CisJCX0KKwkJdGFza0VYSVRfQ1JJVElDQUwoKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCitzdGF0aWMgdm9pZCBwcnZBZGRDdXJyZW50VGFza1RvRGVsYXllZExpc3QoIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0LCBjb25zdCBCYXNlVHlwZV90IHhDYW5CbG9ja0luZGVmaW5pdGVseSApCit7CitUaWNrVHlwZV90IHhUaW1lVG9XYWtlOworY29uc3QgVGlja1R5cGVfdCB4Q29uc3RUaWNrQ291bnQgPSB4VGlja0NvdW50OworCisJI2lmKCBJTkNMVURFX3hUYXNrQWJvcnREZWxheSA9PSAxICkKKwl7CisJCS8qIEFib3V0IHRvIGVudGVyIGEgZGVsYXllZCBsaXN0LCBzbyBlbnN1cmUgdGhlIHVjRGVsYXlBYm9ydGVkIGZsYWcgaXMKKwkJcmVzZXQgdG8gcGRGQUxTRSBzbyBpdCBjYW4gYmUgZGV0ZWN0ZWQgYXMgaGF2aW5nIGJlZW4gc2V0IHRvIHBkVFJVRQorCQl3aGVuIHRoZSB0YXNrIGxlYXZlcyB0aGUgQmxvY2tlZCBzdGF0ZS4gKi8KKwkJcHhDdXJyZW50VENCLT51Y0RlbGF5QWJvcnRlZCA9IHBkRkFMU0U7CisJfQorCSNlbmRpZgorCisJLyogUmVtb3ZlIHRoZSB0YXNrIGZyb20gdGhlIHJlYWR5IGxpc3QgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgYmxvY2tlZCBsaXN0CisJYXMgdGhlIHNhbWUgbGlzdCBpdGVtIGlzIHVzZWQgZm9yIGJvdGggbGlzdHMuICovCisJaWYoIHV4TGlzdFJlbW92ZSggJiggcHhDdXJyZW50VENCLT54U3RhdGVMaXN0SXRlbSApICkgPT0gKCBVQmFzZVR5cGVfdCApIDAgKQorCXsKKwkJLyogVGhlIGN1cnJlbnQgdGFzayBtdXN0IGJlIGluIGEgcmVhZHkgbGlzdCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0bworCQljaGVjaywgYW5kIHRoZSBwb3J0IHJlc2V0IG1hY3JvIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkuICovCisJCXBvcnRSRVNFVF9SRUFEWV9QUklPUklUWSggcHhDdXJyZW50VENCLT51eFByaW9yaXR5LCB1eFRvcFJlYWR5UHJpb3JpdHkgKTsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCSNpZiAoIElOQ0xVREVfdlRhc2tTdXNwZW5kID09IDEgKQorCXsKKwkJaWYoICggeFRpY2tzVG9XYWl0ID09IHBvcnRNQVhfREVMQVkgKSAmJiAoIHhDYW5CbG9ja0luZGVmaW5pdGVseSAhPSBwZEZBTFNFICkgKQorCQl7CisJCQkvKiBBZGQgdGhlIHRhc2sgdG8gdGhlIHN1c3BlbmRlZCB0YXNrIGxpc3QgaW5zdGVhZCBvZiBhIGRlbGF5ZWQgdGFzaworCQkJbGlzdCB0byBlbnN1cmUgaXQgaXMgbm90IHdva2VuIGJ5IGEgdGltaW5nIGV2ZW50LiAgSXQgd2lsbCBibG9jaworCQkJaW5kZWZpbml0ZWx5LiAqLworCQkJdkxpc3RJbnNlcnRFbmQoICZ4U3VzcGVuZGVkVGFza0xpc3QsICYoIHB4Q3VycmVudFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogQ2FsY3VsYXRlIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSB0YXNrIHNob3VsZCBiZSB3b2tlbiBpZiB0aGUgZXZlbnQKKwkJCWRvZXMgbm90IG9jY3VyLiAgVGhpcyBtYXkgb3ZlcmZsb3cgYnV0IHRoaXMgZG9lc24ndCBtYXR0ZXIsIHRoZQorCQkJa2VybmVsIHdpbGwgbWFuYWdlIGl0IGNvcnJlY3RseS4gKi8KKwkJCXhUaW1lVG9XYWtlID0geENvbnN0VGlja0NvdW50ICsgeFRpY2tzVG9XYWl0OworCisJCQkvKiBUaGUgbGlzdCBpdGVtIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gd2FrZSB0aW1lIG9yZGVyLiAqLworCQkJbGlzdFNFVF9MSVNUX0lURU1fVkFMVUUoICYoIHB4Q3VycmVudFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSwgeFRpbWVUb1dha2UgKTsKKworCQkJaWYoIHhUaW1lVG9XYWtlIDwgeENvbnN0VGlja0NvdW50ICkKKwkJCXsKKwkJCQkvKiBXYWtlIHRpbWUgaGFzIG92ZXJmbG93ZWQuICBQbGFjZSB0aGlzIGl0ZW0gaW4gdGhlIG92ZXJmbG93CisJCQkJbGlzdC4gKi8KKwkJCQl2TGlzdEluc2VydCggcHhPdmVyZmxvd0RlbGF5ZWRUYXNrTGlzdCwgJiggcHhDdXJyZW50VENCLT54U3RhdGVMaXN0SXRlbSApICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogVGhlIHdha2UgdGltZSBoYXMgbm90IG92ZXJmbG93ZWQsIHNvIHRoZSBjdXJyZW50IGJsb2NrIGxpc3QKKwkJCQlpcyB1c2VkLiAqLworCQkJCXZMaXN0SW5zZXJ0KCBweERlbGF5ZWRUYXNrTGlzdCwgJiggcHhDdXJyZW50VENCLT54U3RhdGVMaXN0SXRlbSApICk7CisKKwkJCQkvKiBJZiB0aGUgdGFzayBlbnRlcmluZyB0aGUgYmxvY2tlZCBzdGF0ZSB3YXMgcGxhY2VkIGF0IHRoZQorCQkJCWhlYWQgb2YgdGhlIGxpc3Qgb2YgYmxvY2tlZCB0YXNrcyB0aGVuIHhOZXh0VGFza1VuYmxvY2tUaW1lCisJCQkJbmVlZHMgdG8gYmUgdXBkYXRlZCB0b28uICovCisJCQkJaWYoIHhUaW1lVG9XYWtlIDwgeE5leHRUYXNrVW5ibG9ja1RpbWUgKQorCQkJCXsKKwkJCQkJeE5leHRUYXNrVW5ibG9ja1RpbWUgPSB4VGltZVRvV2FrZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkjZWxzZSAvKiBJTkNMVURFX3ZUYXNrU3VzcGVuZCAqLworCXsKKwkJLyogQ2FsY3VsYXRlIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSB0YXNrIHNob3VsZCBiZSB3b2tlbiBpZiB0aGUgZXZlbnQKKwkJZG9lcyBub3Qgb2NjdXIuICBUaGlzIG1heSBvdmVyZmxvdyBidXQgdGhpcyBkb2Vzbid0IG1hdHRlciwgdGhlIGtlcm5lbAorCQl3aWxsIG1hbmFnZSBpdCBjb3JyZWN0bHkuICovCisJCXhUaW1lVG9XYWtlID0geENvbnN0VGlja0NvdW50ICsgeFRpY2tzVG9XYWl0OworCisJCS8qIFRoZSBsaXN0IGl0ZW0gd2lsbCBiZSBpbnNlcnRlZCBpbiB3YWtlIHRpbWUgb3JkZXIuICovCisJCWxpc3RTRVRfTElTVF9JVEVNX1ZBTFVFKCAmKCBweEN1cnJlbnRUQ0ItPnhTdGF0ZUxpc3RJdGVtICksIHhUaW1lVG9XYWtlICk7CisKKwkJaWYoIHhUaW1lVG9XYWtlIDwgeENvbnN0VGlja0NvdW50ICkKKwkJeworCQkJLyogV2FrZSB0aW1lIGhhcyBvdmVyZmxvd2VkLiAgUGxhY2UgdGhpcyBpdGVtIGluIHRoZSBvdmVyZmxvdyBsaXN0LiAqLworCQkJdkxpc3RJbnNlcnQoIHB4T3ZlcmZsb3dEZWxheWVkVGFza0xpc3QsICYoIHB4Q3VycmVudFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogVGhlIHdha2UgdGltZSBoYXMgbm90IG92ZXJmbG93ZWQsIHNvIHRoZSBjdXJyZW50IGJsb2NrIGxpc3QgaXMgdXNlZC4gKi8KKwkJCXZMaXN0SW5zZXJ0KCBweERlbGF5ZWRUYXNrTGlzdCwgJiggcHhDdXJyZW50VENCLT54U3RhdGVMaXN0SXRlbSApICk7CisKKwkJCS8qIElmIHRoZSB0YXNrIGVudGVyaW5nIHRoZSBibG9ja2VkIHN0YXRlIHdhcyBwbGFjZWQgYXQgdGhlIGhlYWQgb2YgdGhlCisJCQlsaXN0IG9mIGJsb2NrZWQgdGFza3MgdGhlbiB4TmV4dFRhc2tVbmJsb2NrVGltZSBuZWVkcyB0byBiZSB1cGRhdGVkCisJCQl0b28uICovCisJCQlpZiggeFRpbWVUb1dha2UgPCB4TmV4dFRhc2tVbmJsb2NrVGltZSApCisJCQl7CisJCQkJeE5leHRUYXNrVW5ibG9ja1RpbWUgPSB4VGltZVRvV2FrZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKworCQkvKiBBdm9pZCBjb21waWxlciB3YXJuaW5nIHdoZW4gSU5DTFVERV92VGFza1N1c3BlbmQgaXMgbm90IDEuICovCisJCSggdm9pZCApIHhDYW5CbG9ja0luZGVmaW5pdGVseTsKKwl9CisJI2VuZGlmIC8qIElOQ0xVREVfdlRhc2tTdXNwZW5kICovCit9CisKKy8qIENvZGUgYmVsb3cgaGVyZSBhbGxvd3MgYWRkaXRpb25hbCBjb2RlIHRvIGJlIGluc2VydGVkIGludG8gdGhpcyBzb3VyY2UgZmlsZSwKK2VzcGVjaWFsbHkgd2hlcmUgYWNjZXNzIHRvIGZpbGUgc2NvcGUgZnVuY3Rpb25zIGFuZCBkYXRhIGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUKK3doZW4gcGVyZm9ybWluZyBtb2R1bGUgdGVzdHMpLiAqLworCisjaWZkZWYgRlJFRVJUT1NfTU9EVUxFX1RFU1QKKwkjaW5jbHVkZSAidGFza3NfdGVzdF9hY2Nlc3NfZnVuY3Rpb25zLmgiCisjZW5kaWYKKworCisjaWYoIGNvbmZpZ0lOQ0xVREVfRlJFRVJUT1NfVEFTS19DX0FERElUSU9OU19IID09IDEgKQorCisJI2luY2x1ZGUgImZyZWVydG9zX3Rhc2tzX2NfYWRkaXRpb25zLmgiCisKKwlzdGF0aWMgdm9pZCBmcmVlcnRvc190YXNrc19jX2FkZGl0aW9uc19pbml0KCB2b2lkICkKKwl7CisJCSNpZmRlZiBGUkVFUlRPU19UQVNLU19DX0FERElUSU9OU19JTklUCisJCQlGUkVFUlRPU19UQVNLU19DX0FERElUSU9OU19JTklUKCk7CisJCSNlbmRpZgorCX0KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvU291cmNlL3RpbWVycy5jIGIvU291cmNlL3RpbWVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMmRkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvdGltZXJzLmMKQEAgLTAsMCArMSwxMDc2IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogU3RhbmRhcmQgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIERlZmluaW5nIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHByZXZlbnRzIHRhc2suaCBmcm9tIHJlZGVmaW5pbmcKK2FsbCB0aGUgQVBJIGZ1bmN0aW9ucyB0byB1c2UgdGhlIE1QVSB3cmFwcGVycy4gIFRoYXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuCit0YXNrLmggaXMgaW5jbHVkZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAicXVldWUuaCIKKyNpbmNsdWRlICJ0aW1lcnMuaCIKKworI2lmICggSU5DTFVERV94VGltZXJQZW5kRnVuY3Rpb25DYWxsID09IDEgKSAmJiAoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMCApCisJI2Vycm9yIGNvbmZpZ1VTRV9USU1FUlMgbXVzdCBiZSBzZXQgdG8gMSB0byBtYWtlIHRoZSB4VGltZXJQZW5kRnVuY3Rpb25DYWxsKCkgZnVuY3Rpb24gYXZhaWxhYmxlLgorI2VuZGlmCisKKy8qIExpbnQgZTk2MSBhbmQgZTc1MCBhcmUgc3VwcHJlc3NlZCBhcyBhIE1JU1JBIGV4Y2VwdGlvbiBqdXN0aWZpZWQgYmVjYXVzZSB0aGUKK01QVSBwb3J0cyByZXF1aXJlIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHRvIGJlIGRlZmluZWQgZm9yIHRoZQoraGVhZGVyIGZpbGVzIGFib3ZlLCBidXQgbm90IGluIHRoaXMgZmlsZSwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QKK3ByaXZpbGVnZWQgVnMgdW5wcml2aWxlZ2VkIGxpbmthZ2UgYW5kIHBsYWNlbWVudC4gKi8KKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSAvKmxpbnQgIWU5NjEgIWU3NTAuICovCisKKworLyogVGhpcyBlbnRpcmUgc291cmNlIGZpbGUgd2lsbCBiZSBza2lwcGVkIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgY29uZmlndXJlZAordG8gaW5jbHVkZSBzb2Z0d2FyZSB0aW1lciBmdW5jdGlvbmFsaXR5LiAgVGhpcyAjaWYgaXMgY2xvc2VkIGF0IHRoZSB2ZXJ5IGJvdHRvbQorb2YgdGhpcyBmaWxlLiAgSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBzb2Z0d2FyZSB0aW1lciBmdW5jdGlvbmFsaXR5IHRoZW4gZW5zdXJlCitjb25maWdVU0VfVElNRVJTIGlzIHNldCB0byAxIGluIEZyZWVSVE9TQ29uZmlnLmguICovCisjaWYgKCBjb25maWdVU0VfVElNRVJTID09IDEgKQorCisvKiBNaXNjIGRlZmluaXRpb25zLiAqLworI2RlZmluZSB0bXJOT19ERUxBWQkJKCBUaWNrVHlwZV90ICkgMFUKKworLyogVGhlIG5hbWUgYXNzaWduZWQgdG8gdGhlIHRpbWVyIHNlcnZpY2UgdGFzay4gIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkKK2RlZmluaW5nIHRybVRJTUVSX1NFUlZJQ0VfVEFTS19OQU1FIGluIEZyZWVSVE9TQ29uZmlnLmguICovCisjaWZuZGVmIGNvbmZpZ1RJTUVSX1NFUlZJQ0VfVEFTS19OQU1FCisJI2RlZmluZSBjb25maWdUSU1FUl9TRVJWSUNFX1RBU0tfTkFNRSAiVG1yIFN2YyIKKyNlbmRpZgorCisvKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdGltZXJzIHRoZW1zZWx2ZXMuICovCit0eXBlZGVmIHN0cnVjdCB0bXJUaW1lckNvbnRyb2wKK3sKKwljb25zdCBjaGFyCQkJCSpwY1RpbWVyTmFtZTsJCS8qPDwgVGV4dCBuYW1lLiAgVGhpcyBpcyBub3QgdXNlZCBieSB0aGUga2VybmVsLCBpdCBpcyBpbmNsdWRlZCBzaW1wbHkgdG8gbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyLiAqLyAvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KKwlMaXN0SXRlbV90CQkJCXhUaW1lckxpc3RJdGVtOwkJLyo8PCBTdGFuZGFyZCBsaW5rZWQgbGlzdCBpdGVtIGFzIHVzZWQgYnkgYWxsIGtlcm5lbCBmZWF0dXJlcyBmb3IgZXZlbnQgbWFuYWdlbWVudC4gKi8KKwlUaWNrVHlwZV90CQkJCXhUaW1lclBlcmlvZEluVGlja3M7Lyo8PCBIb3cgcXVpY2tseSBhbmQgb2Z0ZW4gdGhlIHRpbWVyIGV4cGlyZXMuICovCisJVUJhc2VUeXBlX3QJCQkJdXhBdXRvUmVsb2FkOwkJLyo8PCBTZXQgdG8gcGRUUlVFIGlmIHRoZSB0aW1lciBzaG91bGQgYmUgYXV0b21hdGljYWxseSByZXN0YXJ0ZWQgb25jZSBleHBpcmVkLiAgU2V0IHRvIHBkRkFMU0UgaWYgdGhlIHRpbWVyIGlzLCBpbiBlZmZlY3QsIGEgb25lLXNob3QgdGltZXIuICovCisJdm9pZCAJCQkJCSpwdlRpbWVySUQ7CQkJLyo8PCBBbiBJRCB0byBpZGVudGlmeSB0aGUgdGltZXIuICBUaGlzIGFsbG93cyB0aGUgdGltZXIgdG8gYmUgaWRlbnRpZmllZCB3aGVuIHRoZSBzYW1lIGNhbGxiYWNrIGlzIHVzZWQgZm9yIG11bHRpcGxlIHRpbWVycy4gKi8KKwlUaW1lckNhbGxiYWNrRnVuY3Rpb25fdAlweENhbGxiYWNrRnVuY3Rpb247CS8qPDwgVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdGltZXIgZXhwaXJlcy4gKi8KKwkjaWYoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwkJVUJhc2VUeXBlX3QJCQl1eFRpbWVyTnVtYmVyOwkJLyo8PCBBbiBJRCBhc3NpZ25lZCBieSB0cmFjZSB0b29scyBzdWNoIGFzIEZyZWVSVE9TK1RyYWNlICovCisJI2VuZGlmCisKKwkjaWYoICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCQl1aW50OF90IAkJCXVjU3RhdGljYWxseUFsbG9jYXRlZDsgLyo8PCBTZXQgdG8gcGRUUlVFIGlmIHRoZSB0aW1lciB3YXMgY3JlYXRlZCBzdGF0aWNhbGx5IHNvIG5vIGF0dGVtcHQgaXMgbWFkZSB0byBmcmVlIHRoZSBtZW1vcnkgYWdhaW4gaWYgdGhlIHRpbWVyIGlzIGxhdGVyIGRlbGV0ZWQuICovCisJI2VuZGlmCit9IHhUSU1FUjsKKworLyogVGhlIG9sZCB4VElNRVIgbmFtZSBpcyBtYWludGFpbmVkIGFib3ZlIHRoZW4gdHlwZWRlZmVkIHRvIHRoZSBuZXcgVGltZXJfdAorbmFtZSBiZWxvdyB0byBlbmFibGUgdGhlIHVzZSBvZiBvbGRlciBrZXJuZWwgYXdhcmUgZGVidWdnZXJzLiAqLwordHlwZWRlZiB4VElNRVIgVGltZXJfdDsKKworLyogVGhlIGRlZmluaXRpb24gb2YgbWVzc2FnZXMgdGhhdCBjYW4gYmUgc2VudCBhbmQgcmVjZWl2ZWQgb24gdGhlIHRpbWVyIHF1ZXVlLgorVHdvIHR5cGVzIG9mIG1lc3NhZ2UgY2FuIGJlIHF1ZXVlZCAtIG1lc3NhZ2VzIHRoYXQgbWFuaXB1bGF0ZSBhIHNvZnR3YXJlIHRpbWVyLAorYW5kIG1lc3NhZ2VzIHRoYXQgcmVxdWVzdCB0aGUgZXhlY3V0aW9uIG9mIGEgbm9uLXRpbWVyIHJlbGF0ZWQgY2FsbGJhY2suICBUaGUKK3R3byBtZXNzYWdlIHR5cGVzIGFyZSBkZWZpbmVkIGluIHR3byBzZXBhcmF0ZSBzdHJ1Y3R1cmVzLCB4VGltZXJQYXJhbWV0ZXJzVHlwZQorYW5kIHhDYWxsYmFja1BhcmFtZXRlcnNUeXBlIHJlc3BlY3RpdmVseS4gKi8KK3R5cGVkZWYgc3RydWN0IHRtclRpbWVyUGFyYW1ldGVycworeworCVRpY2tUeXBlX3QJCQl4TWVzc2FnZVZhbHVlOwkJLyo8PCBBbiBvcHRpb25hbCB2YWx1ZSB1c2VkIGJ5IGEgc3Vic2V0IG9mIGNvbW1hbmRzLCBmb3IgZXhhbXBsZSwgd2hlbiBjaGFuZ2luZyB0aGUgcGVyaW9kIG9mIGEgdGltZXIuICovCisJVGltZXJfdCAqCQkJcHhUaW1lcjsJCQkvKjw8IFRoZSB0aW1lciB0byB3aGljaCB0aGUgY29tbWFuZCB3aWxsIGJlIGFwcGxpZWQuICovCit9IFRpbWVyUGFyYW1ldGVyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgdG1yQ2FsbGJhY2tQYXJhbWV0ZXJzCit7CisJUGVuZGVkRnVuY3Rpb25fdAlweENhbGxiYWNrRnVuY3Rpb247CS8qIDw8IFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLiAqLworCXZvaWQgKnB2UGFyYW1ldGVyMTsJCQkJCQkvKiA8PCBUaGUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBmaXJzdCBwYXJhbWV0ZXIuICovCisJdWludDMyX3QgdWxQYXJhbWV0ZXIyOwkJCQkJLyogPDwgVGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgc2Vjb25kIHBhcmFtZXRlci4gKi8KK30gQ2FsbGJhY2tQYXJhbWV0ZXJzX3Q7CisKKy8qIFRoZSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgdHdvIG1lc3NhZ2UgdHlwZXMsIGFsb25nIHdpdGggYW4gaWRlbnRpZmllcgordGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBtZXNzYWdlIHR5cGUgaXMgdmFsaWQuICovCit0eXBlZGVmIHN0cnVjdCB0bXJUaW1lclF1ZXVlTWVzc2FnZQoreworCUJhc2VUeXBlX3QJCQl4TWVzc2FnZUlEOwkJCS8qPDwgVGhlIGNvbW1hbmQgYmVpbmcgc2VudCB0byB0aGUgdGltZXIgc2VydmljZSB0YXNrLiAqLworCXVuaW9uCisJeworCQlUaW1lclBhcmFtZXRlcl90IHhUaW1lclBhcmFtZXRlcnM7CisKKwkJLyogRG9uJ3QgaW5jbHVkZSB4Q2FsbGJhY2tQYXJhbWV0ZXJzIGlmIGl0IGlzIG5vdCBnb2luZyB0byBiZSB1c2VkIGFzCisJCWl0IG1ha2VzIHRoZSBzdHJ1Y3R1cmUgKGFuZCB0aGVyZWZvcmUgdGhlIHRpbWVyIHF1ZXVlKSBsYXJnZXIuICovCisJCSNpZiAoIElOQ0xVREVfeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbCA9PSAxICkKKwkJCUNhbGxiYWNrUGFyYW1ldGVyc190IHhDYWxsYmFja1BhcmFtZXRlcnM7CisJCSNlbmRpZiAvKiBJTkNMVURFX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwgKi8KKwl9IHU7Cit9IERhZW1vblRhc2tNZXNzYWdlX3Q7CisKKy8qbGludCAtc2F2ZSAtZTk1NiBBIG1hbnVhbCBhbmFseXNpcyBhbmQgaW5zcGVjdGlvbiBoYXMgYmVlbiB1c2VkIHRvIGRldGVybWluZQord2hpY2ggc3RhdGljIHZhcmlhYmxlcyBtdXN0IGJlIGRlY2xhcmVkIHZvbGF0aWxlLiAqLworCisvKiBUaGUgbGlzdCBpbiB3aGljaCBhY3RpdmUgdGltZXJzIGFyZSBzdG9yZWQuICBUaW1lcnMgYXJlIHJlZmVyZW5jZWQgaW4gZXhwaXJlCit0aW1lIG9yZGVyLCB3aXRoIHRoZSBuZWFyZXN0IGV4cGlyeSB0aW1lIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdC4gIE9ubHkgdGhlCit0aW1lciBzZXJ2aWNlIHRhc2sgaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlc2UgbGlzdHMuICovCitQUklWSUxFR0VEX0RBVEEgc3RhdGljIExpc3RfdCB4QWN0aXZlVGltZXJMaXN0MSA9IHswfTsKK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHhBY3RpdmVUaW1lckxpc3QyID0gezB9OworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgKnB4Q3VycmVudFRpbWVyTGlzdCA9IE5VTEw7CitQUklWSUxFR0VEX0RBVEEgc3RhdGljIExpc3RfdCAqcHhPdmVyZmxvd1RpbWVyTGlzdCA9IE5VTEw7CisKKy8qIEEgcXVldWUgdGhhdCBpcyB1c2VkIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIHRpbWVyIHNlcnZpY2UgdGFzay4gKi8KK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgUXVldWVIYW5kbGVfdCB4VGltZXJRdWV1ZSA9IE5VTEw7CitQUklWSUxFR0VEX0RBVEEgc3RhdGljIFRhc2tIYW5kbGVfdCB4VGltZXJUYXNrSGFuZGxlID0gTlVMTDsKKworLypsaW50IC1yZXN0b3JlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCisKKwkvKiBJZiBzdGF0aWMgYWxsb2NhdGlvbiBpcyBzdXBwb3J0ZWQgdGhlbiB0aGUgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIHRoZQorCWZvbGxvd2luZyBjYWxsYmFjayBmdW5jdGlvbiAtIHdoaWNoIGVuYWJsZXMgdGhlIGFwcGxpY2F0aW9uIHRvIG9wdGlvbmFsbHkKKwlwcm92aWRlIHRoZSBtZW1vcnkgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhlIHRpbWVyIHRhc2sgYXMgdGhlIHRhc2sncyBzdGFjaworCWFuZCBUQ0IuICovCisJZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uR2V0VGltZXJUYXNrTWVtb3J5KCBTdGF0aWNUYXNrX3QgKipwcHhUaW1lclRhc2tUQ0JCdWZmZXIsIFN0YWNrVHlwZV90ICoqcHB4VGltZXJUYXNrU3RhY2tCdWZmZXIsIHVpbnQzMl90ICpwdWxUaW1lclRhc2tTdGFja1NpemUgKTsKKworI2VuZGlmCisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBpbmZyYXN0cnVjdHVyZSB1c2VkIGJ5IHRoZSB0aW1lciBzZXJ2aWNlIHRhc2sgaWYgaXQgaGFzIG5vdAorICogYmVlbiBpbml0aWFsaXNlZCBhbHJlYWR5LgorICovCitzdGF0aWMgdm9pZCBwcnZDaGVja0ZvclZhbGlkTGlzdEFuZFF1ZXVlKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFRoZSB0aW1lciBzZXJ2aWNlIHRhc2sgKGRhZW1vbikuICBUaW1lciBmdW5jdGlvbmFsaXR5IGlzIGNvbnRyb2xsZWQgYnkgdGhpcworICogdGFzay4gIE90aGVyIHRhc2tzIGNvbW11bmljYXRlIHdpdGggdGhlIHRpbWVyIHNlcnZpY2UgdGFzayB1c2luZyB0aGUKKyAqIHhUaW1lclF1ZXVlIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBwcnZUaW1lclRhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBDYWxsZWQgYnkgdGhlIHRpbWVyIHNlcnZpY2UgdGFzayB0byBpbnRlcnByZXQgYW5kIHByb2Nlc3MgYSBjb21tYW5kIGl0CisgKiByZWNlaXZlZCBvbiB0aGUgdGltZXIgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHBydlByb2Nlc3NSZWNlaXZlZENvbW1hbmRzKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIEluc2VydCB0aGUgdGltZXIgaW50byBlaXRoZXIgeEFjdGl2ZVRpbWVyTGlzdDEsIG9yIHhBY3RpdmVUaW1lckxpc3QyLAorICogZGVwZW5kaW5nIG9uIGlmIHRoZSBleHBpcmUgdGltZSBjYXVzZXMgYSB0aW1lciBjb3VudGVyIG92ZXJmbG93LgorICovCitzdGF0aWMgQmFzZVR5cGVfdCBwcnZJbnNlcnRUaW1lckluQWN0aXZlTGlzdCggVGltZXJfdCAqIGNvbnN0IHB4VGltZXIsIGNvbnN0IFRpY2tUeXBlX3QgeE5leHRFeHBpcnlUaW1lLCBjb25zdCBUaWNrVHlwZV90IHhUaW1lTm93LCBjb25zdCBUaWNrVHlwZV90IHhDb21tYW5kVGltZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBBbiBhY3RpdmUgdGltZXIgaGFzIHJlYWNoZWQgaXRzIGV4cGlyZSB0aW1lLiAgUmVsb2FkIHRoZSB0aW1lciBpZiBpdCBpcyBhbgorICogYXV0byByZWxvYWQgdGltZXIsIHRoZW4gY2FsbCBpdHMgY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIHBydlByb2Nlc3NFeHBpcmVkVGltZXIoIGNvbnN0IFRpY2tUeXBlX3QgeE5leHRFeHBpcmVUaW1lLCBjb25zdCBUaWNrVHlwZV90IHhUaW1lTm93ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFRoZSB0aWNrIGNvdW50IGhhcyBvdmVyZmxvd2VkLiAgU3dpdGNoIHRoZSB0aW1lciBsaXN0cyBhZnRlciBlbnN1cmluZyB0aGUKKyAqIGN1cnJlbnQgdGltZXIgbGlzdCBkb2VzIG5vdCBzdGlsbCByZWZlcmVuY2Ugc29tZSB0aW1lcnMuCisgKi8KK3N0YXRpYyB2b2lkIHBydlN3aXRjaFRpbWVyTGlzdHMoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKgorICogT2J0YWluIHRoZSBjdXJyZW50IHRpY2sgY291bnQsIHNldHRpbmcgKnB4VGltZXJMaXN0c1dlcmVTd2l0Y2hlZCB0byBwZFRSVUUKKyAqIGlmIGEgdGljayBjb3VudCBvdmVyZmxvdyBvY2N1cnJlZCBzaW5jZSBwcnZTYW1wbGVUaW1lTm93KCkgd2FzIGxhc3QgY2FsbGVkLgorICovCitzdGF0aWMgVGlja1R5cGVfdCBwcnZTYW1wbGVUaW1lTm93KCBCYXNlVHlwZV90ICogY29uc3QgcHhUaW1lckxpc3RzV2VyZVN3aXRjaGVkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIElmIHRoZSB0aW1lciBsaXN0IGNvbnRhaW5zIGFueSBhY3RpdmUgdGltZXJzIHRoZW4gcmV0dXJuIHRoZSBleHBpcmUgdGltZSBvZgorICogdGhlIHRpbWVyIHRoYXQgd2lsbCBleHBpcmUgZmlyc3QgYW5kIHNldCAqcHhMaXN0V2FzRW1wdHkgdG8gZmFsc2UuICBJZiB0aGUKKyAqIHRpbWVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBhbnkgdGltZXJzIHRoZW4gcmV0dXJuIDAgYW5kIHNldCAqcHhMaXN0V2FzRW1wdHkKKyAqIHRvIHBkVFJVRS4KKyAqLworc3RhdGljIFRpY2tUeXBlX3QgcHJ2R2V0TmV4dEV4cGlyZVRpbWUoIEJhc2VUeXBlX3QgKiBjb25zdCBweExpc3RXYXNFbXB0eSApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qCisgKiBJZiBhIHRpbWVyIGhhcyBleHBpcmVkLCBwcm9jZXNzIGl0LiAgT3RoZXJ3aXNlLCBibG9jayB0aGUgdGltZXIgc2VydmljZSB0YXNrCisgKiB1bnRpbCBlaXRoZXIgYSB0aW1lciBkb2VzIGV4cGlyZSBvciBhIGNvbW1hbmQgaXMgcmVjZWl2ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBydlByb2Nlc3NUaW1lck9yQmxvY2tUYXNrKCBjb25zdCBUaWNrVHlwZV90IHhOZXh0RXhwaXJlVGltZSwgQmFzZVR5cGVfdCB4TGlzdFdhc0VtcHR5ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIENhbGxlZCBhZnRlciBhIFRpbWVyX3Qgc3RydWN0dXJlIGhhcyBiZWVuIGFsbG9jYXRlZCBlaXRoZXIgc3RhdGljYWxseSBvcgorICogZHluYW1pY2FsbHkgdG8gZmlsbCBpbiB0aGUgc3RydWN0dXJlJ3MgbWVtYmVycy4KKyAqLworc3RhdGljIHZvaWQgcHJ2SW5pdGlhbGlzZU5ld1RpbWVyKAljb25zdCBjaGFyICogY29uc3QgcGNUaW1lck5hbWUsCQkJLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCisJCQkJCQkJCQljb25zdCBUaWNrVHlwZV90IHhUaW1lclBlcmlvZEluVGlja3MsCisJCQkJCQkJCQljb25zdCBVQmFzZVR5cGVfdCB1eEF1dG9SZWxvYWQsCisJCQkJCQkJCQl2b2lkICogY29uc3QgcHZUaW1lcklELAorCQkJCQkJCQkJVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QgcHhDYWxsYmFja0Z1bmN0aW9uLAorCQkJCQkJCQkJVGltZXJfdCAqcHhOZXdUaW1lciApIFBSSVZJTEVHRURfRlVOQ1RJT047CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4VGltZXJDcmVhdGVUaW1lclRhc2soIHZvaWQgKQoreworQmFzZVR5cGVfdCB4UmV0dXJuID0gcGRGQUlMOworCisJLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgc2NoZWR1bGVyIGlzIHN0YXJ0ZWQgaWYKKwljb25maWdVU0VfVElNRVJTIGlzIHNldCB0byAxLiAgQ2hlY2sgdGhhdCB0aGUgaW5mcmFzdHJ1Y3R1cmUgdXNlZCBieSB0aGUKKwl0aW1lciBzZXJ2aWNlIHRhc2sgaGFzIGJlZW4gY3JlYXRlZC9pbml0aWFsaXNlZC4gIElmIHRpbWVycyBoYXZlIGFscmVhZHkKKwliZWVuIGNyZWF0ZWQgdGhlbiB0aGUgaW5pdGlhbGlzYXRpb24gd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBwZXJmb3JtZWQuICovCisJcHJ2Q2hlY2tGb3JWYWxpZExpc3RBbmRRdWV1ZSgpOworCisJaWYoIHhUaW1lclF1ZXVlICE9IE5VTEwgKQorCXsKKwkJI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCQl7CisJCQlTdGF0aWNUYXNrX3QgKnB4VGltZXJUYXNrVENCQnVmZmVyID0gTlVMTDsKKwkJCVN0YWNrVHlwZV90ICpweFRpbWVyVGFza1N0YWNrQnVmZmVyID0gTlVMTDsKKwkJCXVpbnQzMl90IHVsVGltZXJUYXNrU3RhY2tTaXplOworCisJCQl2QXBwbGljYXRpb25HZXRUaW1lclRhc2tNZW1vcnkoICZweFRpbWVyVGFza1RDQkJ1ZmZlciwgJnB4VGltZXJUYXNrU3RhY2tCdWZmZXIsICZ1bFRpbWVyVGFza1N0YWNrU2l6ZSApOworCQkJeFRpbWVyVGFza0hhbmRsZSA9IHhUYXNrQ3JlYXRlU3RhdGljKAlwcnZUaW1lclRhc2ssCisJCQkJCQkJCQkJCQkJY29uZmlnVElNRVJfU0VSVklDRV9UQVNLX05BTUUsCisJCQkJCQkJCQkJCQkJdWxUaW1lclRhc2tTdGFja1NpemUsCisJCQkJCQkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJCQkJCQkoICggVUJhc2VUeXBlX3QgKSBjb25maWdUSU1FUl9UQVNLX1BSSU9SSVRZICkgfCBwb3J0UFJJVklMRUdFX0JJVCwKKwkJCQkJCQkJCQkJCQlweFRpbWVyVGFza1N0YWNrQnVmZmVyLAorCQkJCQkJCQkJCQkJCXB4VGltZXJUYXNrVENCQnVmZmVyICk7CisKKwkJCWlmKCB4VGltZXJUYXNrSGFuZGxlICE9IE5VTEwgKQorCQkJeworCQkJCXhSZXR1cm4gPSBwZFBBU1M7CisJCQl9CisJCX0KKwkJI2Vsc2UKKwkJeworCQkJeFJldHVybiA9IHhUYXNrQ3JlYXRlKAlwcnZUaW1lclRhc2ssCisJCQkJCQkJCQljb25maWdUSU1FUl9TRVJWSUNFX1RBU0tfTkFNRSwKKwkJCQkJCQkJCWNvbmZpZ1RJTUVSX1RBU0tfU1RBQ0tfREVQVEgsCisJCQkJCQkJCQlOVUxMLAorCQkJCQkJCQkJKCAoIFVCYXNlVHlwZV90ICkgY29uZmlnVElNRVJfVEFTS19QUklPUklUWSApIHwgcG9ydFBSSVZJTEVHRV9CSVQsCisJCQkJCQkJCQkmeFRpbWVyVGFza0hhbmRsZSApOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OICovCisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwljb25maWdBU1NFUlQoIHhSZXR1cm4gKTsKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQorCisJVGltZXJIYW5kbGVfdCB4VGltZXJDcmVhdGUoCWNvbnN0IGNoYXIgKiBjb25zdCBwY1RpbWVyTmFtZSwJCQkvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KKwkJCQkJCQkJY29uc3QgVGlja1R5cGVfdCB4VGltZXJQZXJpb2RJblRpY2tzLAorCQkJCQkJCQljb25zdCBVQmFzZVR5cGVfdCB1eEF1dG9SZWxvYWQsCisJCQkJCQkJCXZvaWQgKiBjb25zdCBwdlRpbWVySUQsCisJCQkJCQkJCVRpbWVyQ2FsbGJhY2tGdW5jdGlvbl90IHB4Q2FsbGJhY2tGdW5jdGlvbiApCisJeworCVRpbWVyX3QgKnB4TmV3VGltZXI7CisKKwkJcHhOZXdUaW1lciA9ICggVGltZXJfdCAqICkgcHZQb3J0TWFsbG9jKCBzaXplb2YoIFRpbWVyX3QgKSApOworCisJCWlmKCBweE5ld1RpbWVyICE9IE5VTEwgKQorCQl7CisJCQlwcnZJbml0aWFsaXNlTmV3VGltZXIoIHBjVGltZXJOYW1lLCB4VGltZXJQZXJpb2RJblRpY2tzLCB1eEF1dG9SZWxvYWQsIHB2VGltZXJJRCwgcHhDYWxsYmFja0Z1bmN0aW9uLCBweE5ld1RpbWVyICk7CisKKwkJCSNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKwkJCXsKKwkJCQkvKiBUaW1lcnMgY2FuIGJlIGNyZWF0ZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgc28gbm90ZSB0aGlzCisJCQkJdGltZXIgd2FzIGNyZWF0ZWQgZHluYW1pY2FsbHkgaW4gY2FzZSB0aGUgdGltZXIgaXMgbGF0ZXIKKwkJCQlkZWxldGVkLiAqLworCQkJCXB4TmV3VGltZXItPnVjU3RhdGljYWxseUFsbG9jYXRlZCA9IHBkRkFMU0U7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAqLworCQl9CisKKwkJcmV0dXJuIHB4TmV3VGltZXI7CisJfQorCisjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKworCVRpbWVySGFuZGxlX3QgeFRpbWVyQ3JlYXRlU3RhdGljKAljb25zdCBjaGFyICogY29uc3QgcGNUaW1lck5hbWUsCQkvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KKwkJCQkJCQkJCQljb25zdCBUaWNrVHlwZV90IHhUaW1lclBlcmlvZEluVGlja3MsCisJCQkJCQkJCQkJY29uc3QgVUJhc2VUeXBlX3QgdXhBdXRvUmVsb2FkLAorCQkJCQkJCQkJCXZvaWQgKiBjb25zdCBwdlRpbWVySUQsCisJCQkJCQkJCQkJVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QgcHhDYWxsYmFja0Z1bmN0aW9uLAorCQkJCQkJCQkJCVN0YXRpY1RpbWVyX3QgKnB4VGltZXJCdWZmZXIgKQorCXsKKwlUaW1lcl90ICpweE5ld1RpbWVyOworCisJCSNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCisJCXsKKwkJCS8qIFNhbml0eSBjaGVjayB0aGF0IHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWNsYXJlIGEKKwkJCXZhcmlhYmxlIG9mIHR5cGUgU3RhdGljVGltZXJfdCBlcXVhbHMgdGhlIHNpemUgb2YgdGhlIHJlYWwgdGltZXIKKwkJCXN0cnVjdHVyZS4gKi8KKwkJCXZvbGF0aWxlIHNpemVfdCB4U2l6ZSA9IHNpemVvZiggU3RhdGljVGltZXJfdCApOworCQkJY29uZmlnQVNTRVJUKCB4U2l6ZSA9PSBzaXplb2YoIFRpbWVyX3QgKSApOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLworCisJCS8qIEEgcG9pbnRlciB0byBhIFN0YXRpY1RpbWVyX3Qgc3RydWN0dXJlIE1VU1QgYmUgcHJvdmlkZWQsIHVzZSBpdC4gKi8KKwkJY29uZmlnQVNTRVJUKCBweFRpbWVyQnVmZmVyICk7CisJCXB4TmV3VGltZXIgPSAoIFRpbWVyX3QgKiApIHB4VGltZXJCdWZmZXI7IC8qbGludCAhZTc0MCBVbnVzdWFsIGNhc3QgaXMgb2sgYXMgdGhlIHN0cnVjdHVyZXMgYXJlIGRlc2lnbmVkIHRvIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50LCBhbmQgdGhlIHNpemUgaXMgY2hlY2tlZCBieSBhbiBhc3NlcnQuICovCisKKwkJaWYoIHB4TmV3VGltZXIgIT0gTlVMTCApCisJCXsKKwkJCXBydkluaXRpYWxpc2VOZXdUaW1lciggcGNUaW1lck5hbWUsIHhUaW1lclBlcmlvZEluVGlja3MsIHV4QXV0b1JlbG9hZCwgcHZUaW1lcklELCBweENhbGxiYWNrRnVuY3Rpb24sIHB4TmV3VGltZXIgKTsKKworCQkJI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKKwkJCXsKKwkJCQkvKiBUaW1lcnMgY2FuIGJlIGNyZWF0ZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSBzbyBub3RlIHRoaXMKKwkJCQl0aW1lciB3YXMgY3JlYXRlZCBzdGF0aWNhbGx5IGluIGNhc2UgaXQgaXMgbGF0ZXIgZGVsZXRlZC4gKi8KKwkJCQlweE5ld1RpbWVyLT51Y1N0YXRpY2FsbHlBbGxvY2F0ZWQgPSBwZFRSVUU7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gKi8KKwkJfQorCisJCXJldHVybiBweE5ld1RpbWVyOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZJbml0aWFsaXNlTmV3VGltZXIoCWNvbnN0IGNoYXIgKiBjb25zdCBwY1RpbWVyTmFtZSwJCQkvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KKwkJCQkJCQkJCWNvbnN0IFRpY2tUeXBlX3QgeFRpbWVyUGVyaW9kSW5UaWNrcywKKwkJCQkJCQkJCWNvbnN0IFVCYXNlVHlwZV90IHV4QXV0b1JlbG9hZCwKKwkJCQkJCQkJCXZvaWQgKiBjb25zdCBwdlRpbWVySUQsCisJCQkJCQkJCQlUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCBweENhbGxiYWNrRnVuY3Rpb24sCisJCQkJCQkJCQlUaW1lcl90ICpweE5ld1RpbWVyICkKK3sKKwkvKiAwIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciB4VGltZXJQZXJpb2RJblRpY2tzLiAqLworCWNvbmZpZ0FTU0VSVCggKCB4VGltZXJQZXJpb2RJblRpY2tzID4gMCApICk7CisKKwlpZiggcHhOZXdUaW1lciAhPSBOVUxMICkKKwl7CisJCS8qIEVuc3VyZSB0aGUgaW5mcmFzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgdGltZXIgc2VydmljZSB0YXNrIGhhcyBiZWVuCisJCWNyZWF0ZWQvaW5pdGlhbGlzZWQuICovCisJCXBydkNoZWNrRm9yVmFsaWRMaXN0QW5kUXVldWUoKTsKKworCQkvKiBJbml0aWFsaXNlIHRoZSB0aW1lciBzdHJ1Y3R1cmUgbWVtYmVycyB1c2luZyB0aGUgZnVuY3Rpb24KKwkJcGFyYW1ldGVycy4gKi8KKwkJcHhOZXdUaW1lci0+cGNUaW1lck5hbWUgPSBwY1RpbWVyTmFtZTsKKwkJcHhOZXdUaW1lci0+eFRpbWVyUGVyaW9kSW5UaWNrcyA9IHhUaW1lclBlcmlvZEluVGlja3M7CisJCXB4TmV3VGltZXItPnV4QXV0b1JlbG9hZCA9IHV4QXV0b1JlbG9hZDsKKwkJcHhOZXdUaW1lci0+cHZUaW1lcklEID0gcHZUaW1lcklEOworCQlweE5ld1RpbWVyLT5weENhbGxiYWNrRnVuY3Rpb24gPSBweENhbGxiYWNrRnVuY3Rpb247CisJCXZMaXN0SW5pdGlhbGlzZUl0ZW0oICYoIHB4TmV3VGltZXItPnhUaW1lckxpc3RJdGVtICkgKTsKKwkJdHJhY2VUSU1FUl9DUkVBVEUoIHB4TmV3VGltZXIgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4VGltZXJHZW5lcmljQ29tbWFuZCggVGltZXJIYW5kbGVfdCB4VGltZXIsIGNvbnN0IEJhc2VUeXBlX3QgeENvbW1hbmRJRCwgY29uc3QgVGlja1R5cGVfdCB4T3B0aW9uYWxWYWx1ZSwgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4sIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKK3sKK0Jhc2VUeXBlX3QgeFJldHVybiA9IHBkRkFJTDsKK0RhZW1vblRhc2tNZXNzYWdlX3QgeE1lc3NhZ2U7CisKKwljb25maWdBU1NFUlQoIHhUaW1lciApOworCisJLyogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHRpbWVyIHNlcnZpY2UgdGFzayB0byBwZXJmb3JtIGEgcGFydGljdWxhciBhY3Rpb24KKwlvbiBhIHBhcnRpY3VsYXIgdGltZXIgZGVmaW5pdGlvbi4gKi8KKwlpZiggeFRpbWVyUXVldWUgIT0gTlVMTCApCisJeworCQkvKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgdGltZXIgc2VydmljZSB0YXNrIHRvIHN0YXJ0IHRoZSB4VGltZXIgdGltZXIuICovCisJCXhNZXNzYWdlLnhNZXNzYWdlSUQgPSB4Q29tbWFuZElEOworCQl4TWVzc2FnZS51LnhUaW1lclBhcmFtZXRlcnMueE1lc3NhZ2VWYWx1ZSA9IHhPcHRpb25hbFZhbHVlOworCQl4TWVzc2FnZS51LnhUaW1lclBhcmFtZXRlcnMucHhUaW1lciA9ICggVGltZXJfdCAqICkgeFRpbWVyOworCisJCWlmKCB4Q29tbWFuZElEIDwgdG1yRklSU1RfRlJPTV9JU1JfQ09NTUFORCApCisJCXsKKwkJCWlmKCB4VGFza0dldFNjaGVkdWxlclN0YXRlKCkgPT0gdGFza1NDSEVEVUxFUl9SVU5OSU5HICkKKwkJCXsKKwkJCQl4UmV0dXJuID0geFF1ZXVlU2VuZFRvQmFjayggeFRpbWVyUXVldWUsICZ4TWVzc2FnZSwgeFRpY2tzVG9XYWl0ICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJeFJldHVybiA9IHhRdWV1ZVNlbmRUb0JhY2soIHhUaW1lclF1ZXVlLCAmeE1lc3NhZ2UsIHRtck5PX0RFTEFZICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl4UmV0dXJuID0geFF1ZXVlU2VuZFRvQmFja0Zyb21JU1IoIHhUaW1lclF1ZXVlLCAmeE1lc3NhZ2UsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKKwkJfQorCisJCXRyYWNlVElNRVJfQ09NTUFORF9TRU5EKCB4VGltZXIsIHhDb21tYW5kSUQsIHhPcHRpb25hbFZhbHVlLCB4UmV0dXJuICk7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwlyZXR1cm4geFJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitUYXNrSGFuZGxlX3QgeFRpbWVyR2V0VGltZXJEYWVtb25UYXNrSGFuZGxlKCB2b2lkICkKK3sKKwkvKiBJZiB4VGltZXJHZXRUaW1lckRhZW1vblRhc2tIYW5kbGUoKSBpcyBjYWxsZWQgYmVmb3JlIHRoZSBzY2hlZHVsZXIgaGFzIGJlZW4KKwlzdGFydGVkLCB0aGVuIHhUaW1lclRhc2tIYW5kbGUgd2lsbCBiZSBOVUxMLiAqLworCWNvbmZpZ0FTU0VSVCggKCB4VGltZXJUYXNrSGFuZGxlICE9IE5VTEwgKSApOworCXJldHVybiB4VGltZXJUYXNrSGFuZGxlOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1RpY2tUeXBlX3QgeFRpbWVyR2V0UGVyaW9kKCBUaW1lckhhbmRsZV90IHhUaW1lciApCit7CitUaW1lcl90ICpweFRpbWVyID0gKCBUaW1lcl90ICogKSB4VGltZXI7CisKKwljb25maWdBU1NFUlQoIHhUaW1lciApOworCXJldHVybiBweFRpbWVyLT54VGltZXJQZXJpb2RJblRpY2tzOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1RpY2tUeXBlX3QgeFRpbWVyR2V0RXhwaXJ5VGltZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKQoreworVGltZXJfdCAqIHB4VGltZXIgPSAoIFRpbWVyX3QgKiApIHhUaW1lcjsKK1RpY2tUeXBlX3QgeFJldHVybjsKKworCWNvbmZpZ0FTU0VSVCggeFRpbWVyICk7CisJeFJldHVybiA9IGxpc3RHRVRfTElTVF9JVEVNX1ZBTFVFKCAmKCBweFRpbWVyLT54VGltZXJMaXN0SXRlbSApICk7CisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworY29uc3QgY2hhciAqIHBjVGltZXJHZXROYW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApIC8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworeworVGltZXJfdCAqcHhUaW1lciA9ICggVGltZXJfdCAqICkgeFRpbWVyOworCisJY29uZmlnQVNTRVJUKCB4VGltZXIgKTsKKwlyZXR1cm4gcHhUaW1lci0+cGNUaW1lck5hbWU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2UHJvY2Vzc0V4cGlyZWRUaW1lciggY29uc3QgVGlja1R5cGVfdCB4TmV4dEV4cGlyZVRpbWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpbWVOb3cgKQoreworQmFzZVR5cGVfdCB4UmVzdWx0OworVGltZXJfdCAqIGNvbnN0IHB4VGltZXIgPSAoIFRpbWVyX3QgKiApIGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggcHhDdXJyZW50VGltZXJMaXN0ICk7CisKKwkvKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHRpbWVycy4gIEEgY2hlY2sgaGFzIGFscmVhZHkKKwliZWVuIHBlcmZvcm1lZCB0byBlbnN1cmUgdGhlIGxpc3QgaXMgbm90IGVtcHR5LiAqLworCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhUaW1lci0+eFRpbWVyTGlzdEl0ZW0gKSApOworCXRyYWNlVElNRVJfRVhQSVJFRCggcHhUaW1lciApOworCisJLyogSWYgdGhlIHRpbWVyIGlzIGFuIGF1dG8gcmVsb2FkIHRpbWVyIHRoZW4gY2FsY3VsYXRlIHRoZSBuZXh0CisJZXhwaXJ5IHRpbWUgYW5kIHJlLWluc2VydCB0aGUgdGltZXIgaW4gdGhlIGxpc3Qgb2YgYWN0aXZlIHRpbWVycy4gKi8KKwlpZiggcHhUaW1lci0+dXhBdXRvUmVsb2FkID09ICggVUJhc2VUeXBlX3QgKSBwZFRSVUUgKQorCXsKKwkJLyogVGhlIHRpbWVyIGlzIGluc2VydGVkIGludG8gYSBsaXN0IHVzaW5nIGEgdGltZSByZWxhdGl2ZSB0byBhbnl0aGluZworCQlvdGhlciB0aGFuIHRoZSBjdXJyZW50IHRpbWUuICBJdCB3aWxsIHRoZXJlZm9yZSBiZSBpbnNlcnRlZCBpbnRvIHRoZQorCQljb3JyZWN0IGxpc3QgcmVsYXRpdmUgdG8gdGhlIHRpbWUgdGhpcyB0YXNrIHRoaW5rcyBpdCBpcyBub3cuICovCisJCWlmKCBwcnZJbnNlcnRUaW1lckluQWN0aXZlTGlzdCggcHhUaW1lciwgKCB4TmV4dEV4cGlyZVRpbWUgKyBweFRpbWVyLT54VGltZXJQZXJpb2RJblRpY2tzICksIHhUaW1lTm93LCB4TmV4dEV4cGlyZVRpbWUgKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogVGhlIHRpbWVyIGV4cGlyZWQgYmVmb3JlIGl0IHdhcyBhZGRlZCB0byB0aGUgYWN0aXZlIHRpbWVyCisJCQlsaXN0LiAgUmVsb2FkIGl0IG5vdy4gICovCisJCQl4UmVzdWx0ID0geFRpbWVyR2VuZXJpY0NvbW1hbmQoIHB4VGltZXIsIHRtckNPTU1BTkRfU1RBUlRfRE9OVF9UUkFDRSwgeE5leHRFeHBpcmVUaW1lLCBOVUxMLCB0bXJOT19ERUxBWSApOworCQkJY29uZmlnQVNTRVJUKCB4UmVzdWx0ICk7CisJCQkoIHZvaWQgKSB4UmVzdWx0OworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwkvKiBDYWxsIHRoZSB0aW1lciBjYWxsYmFjay4gKi8KKwlweFRpbWVyLT5weENhbGxiYWNrRnVuY3Rpb24oICggVGltZXJIYW5kbGVfdCApIHB4VGltZXIgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUaW1lclRhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApCit7CitUaWNrVHlwZV90IHhOZXh0RXhwaXJlVGltZTsKK0Jhc2VUeXBlX3QgeExpc3RXYXNFbXB0eTsKKworCS8qIEp1c3QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuICovCisJKCB2b2lkICkgcHZQYXJhbWV0ZXJzOworCisJI2lmKCBjb25maWdVU0VfREFFTU9OX1RBU0tfU1RBUlRVUF9IT09LID09IDEgKQorCXsKKwkJZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uRGFlbW9uVGFza1N0YXJ0dXBIb29rKCB2b2lkICk7CisKKwkJLyogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHdyaXRlciB0byBleGVjdXRlIHNvbWUgY29kZSBpbiB0aGUgY29udGV4dCBvZgorCQl0aGlzIHRhc2sgYXQgdGhlIHBvaW50IHRoZSB0YXNrIHN0YXJ0cyBleGVjdXRpbmcuICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUKKwkJYXBwbGljYXRpb24gaW5jbHVkZXMgaW5pdGlhbGlzYXRpb24gY29kZSB0aGF0IHdvdWxkIGJlbmVmaXQgZnJvbQorCQlleGVjdXRpbmcgYWZ0ZXIgdGhlIHNjaGVkdWxlciBoYXMgYmVlbiBzdGFydGVkLiAqLworCQl2QXBwbGljYXRpb25EYWVtb25UYXNrU3RhcnR1cEhvb2soKTsKKwl9CisJI2VuZGlmIC8qIGNvbmZpZ1VTRV9EQUVNT05fVEFTS19TVEFSVFVQX0hPT0sgKi8KKworCWZvciggOzsgKQorCXsKKwkJLyogUXVlcnkgdGhlIHRpbWVycyBsaXN0IHRvIHNlZSBpZiBpdCBjb250YWlucyBhbnkgdGltZXJzLCBhbmQgaWYgc28sCisJCW9idGFpbiB0aGUgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB0aW1lciB3aWxsIGV4cGlyZS4gKi8KKwkJeE5leHRFeHBpcmVUaW1lID0gcHJ2R2V0TmV4dEV4cGlyZVRpbWUoICZ4TGlzdFdhc0VtcHR5ICk7CisKKwkJLyogSWYgYSB0aW1lciBoYXMgZXhwaXJlZCwgcHJvY2VzcyBpdC4gIE90aGVyd2lzZSwgYmxvY2sgdGhpcyB0YXNrCisJCXVudGlsIGVpdGhlciBhIHRpbWVyIGRvZXMgZXhwaXJlLCBvciBhIGNvbW1hbmQgaXMgcmVjZWl2ZWQuICovCisJCXBydlByb2Nlc3NUaW1lck9yQmxvY2tUYXNrKCB4TmV4dEV4cGlyZVRpbWUsIHhMaXN0V2FzRW1wdHkgKTsKKworCQkvKiBFbXB0eSB0aGUgY29tbWFuZCBxdWV1ZS4gKi8KKwkJcHJ2UHJvY2Vzc1JlY2VpdmVkQ29tbWFuZHMoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2UHJvY2Vzc1RpbWVyT3JCbG9ja1Rhc2soIGNvbnN0IFRpY2tUeXBlX3QgeE5leHRFeHBpcmVUaW1lLCBCYXNlVHlwZV90IHhMaXN0V2FzRW1wdHkgKQoreworVGlja1R5cGVfdCB4VGltZU5vdzsKK0Jhc2VUeXBlX3QgeFRpbWVyTGlzdHNXZXJlU3dpdGNoZWQ7CisKKwl2VGFza1N1c3BlbmRBbGwoKTsKKwl7CisJCS8qIE9idGFpbiB0aGUgdGltZSBub3cgdG8gbWFrZSBhbiBhc3Nlc3NtZW50IGFzIHRvIHdoZXRoZXIgdGhlIHRpbWVyCisJCWhhcyBleHBpcmVkIG9yIG5vdC4gIElmIG9idGFpbmluZyB0aGUgdGltZSBjYXVzZXMgdGhlIGxpc3RzIHRvIHN3aXRjaAorCQl0aGVuIGRvbid0IHByb2Nlc3MgdGhpcyB0aW1lciBhcyBhbnkgdGltZXJzIHRoYXQgcmVtYWluZWQgaW4gdGhlIGxpc3QKKwkJd2hlbiB0aGUgbGlzdHMgd2VyZSBzd2l0Y2hlZCB3aWxsIGhhdmUgYmVlbiBwcm9jZXNzZWQgd2l0aGluIHRoZQorCQlwcnZTYW1wbGVUaW1lTm93KCkgZnVuY3Rpb24uICovCisJCXhUaW1lTm93ID0gcHJ2U2FtcGxlVGltZU5vdyggJnhUaW1lckxpc3RzV2VyZVN3aXRjaGVkICk7CisJCWlmKCB4VGltZXJMaXN0c1dlcmVTd2l0Y2hlZCA9PSBwZEZBTFNFICkKKwkJeworCQkJLyogVGhlIHRpY2sgY291bnQgaGFzIG5vdCBvdmVyZmxvd2VkLCBoYXMgdGhlIHRpbWVyIGV4cGlyZWQ/ICovCisJCQlpZiggKCB4TGlzdFdhc0VtcHR5ID09IHBkRkFMU0UgKSAmJiAoIHhOZXh0RXhwaXJlVGltZSA8PSB4VGltZU5vdyApICkKKwkJCXsKKwkJCQkoIHZvaWQgKSB4VGFza1Jlc3VtZUFsbCgpOworCQkJCXBydlByb2Nlc3NFeHBpcmVkVGltZXIoIHhOZXh0RXhwaXJlVGltZSwgeFRpbWVOb3cgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBUaGUgdGljayBjb3VudCBoYXMgbm90IG92ZXJmbG93ZWQsIGFuZCB0aGUgbmV4dCBleHBpcmUKKwkJCQl0aW1lIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC4gIFRoaXMgdGFzayBzaG91bGQgdGhlcmVmb3JlCisJCQkJYmxvY2sgdG8gd2FpdCBmb3IgdGhlIG5leHQgZXhwaXJlIHRpbWUgb3IgYSBjb21tYW5kIHRvIGJlCisJCQkJcmVjZWl2ZWQgLSB3aGljaGV2ZXIgY29tZXMgZmlyc3QuICBUaGUgZm9sbG93aW5nIGxpbmUgY2Fubm90CisJCQkJYmUgcmVhY2hlZCB1bmxlc3MgeE5leHRFeHBpcmVUaW1lID4geFRpbWVOb3csIGV4Y2VwdCBpbiB0aGUKKwkJCQljYXNlIHdoZW4gdGhlIGN1cnJlbnQgdGltZXIgbGlzdCBpcyBlbXB0eS4gKi8KKwkJCQlpZiggeExpc3RXYXNFbXB0eSAhPSBwZEZBTFNFICkKKwkJCQl7CisJCQkJCS8qIFRoZSBjdXJyZW50IHRpbWVyIGxpc3QgaXMgZW1wdHkgLSBpcyB0aGUgb3ZlcmZsb3cgbGlzdAorCQkJCQlhbHNvIGVtcHR5PyAqLworCQkJCQl4TGlzdFdhc0VtcHR5ID0gbGlzdExJU1RfSVNfRU1QVFkoIHB4T3ZlcmZsb3dUaW1lckxpc3QgKTsKKwkJCQl9CisKKwkJCQl2UXVldWVXYWl0Rm9yTWVzc2FnZVJlc3RyaWN0ZWQoIHhUaW1lclF1ZXVlLCAoIHhOZXh0RXhwaXJlVGltZSAtIHhUaW1lTm93ICksIHhMaXN0V2FzRW1wdHkgKTsKKworCQkJCWlmKCB4VGFza1Jlc3VtZUFsbCgpID09IHBkRkFMU0UgKQorCQkJCXsKKwkJCQkJLyogWWllbGQgdG8gd2FpdCBmb3IgZWl0aGVyIGEgY29tbWFuZCB0byBhcnJpdmUsIG9yIHRoZQorCQkJCQlibG9jayB0aW1lIHRvIGV4cGlyZS4gIElmIGEgY29tbWFuZCBhcnJpdmVkIGJldHdlZW4gdGhlCisJCQkJCWNyaXRpY2FsIHNlY3Rpb24gYmVpbmcgZXhpdGVkIGFuZCB0aGlzIHlpZWxkIHRoZW4gdGhlIHlpZWxkCisJCQkJCXdpbGwgbm90IGNhdXNlIHRoZSB0YXNrIHRvIGJsb2NrLiAqLworCQkJCQlwb3J0WUlFTERfV0lUSElOX0FQSSgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJKCB2b2lkICkgeFRhc2tSZXN1bWVBbGwoKTsKKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgVGlja1R5cGVfdCBwcnZHZXROZXh0RXhwaXJlVGltZSggQmFzZVR5cGVfdCAqIGNvbnN0IHB4TGlzdFdhc0VtcHR5ICkKK3sKK1RpY2tUeXBlX3QgeE5leHRFeHBpcmVUaW1lOworCisJLyogVGltZXJzIGFyZSBsaXN0ZWQgaW4gZXhwaXJ5IHRpbWUgb3JkZXIsIHdpdGggdGhlIGhlYWQgb2YgdGhlIGxpc3QKKwlyZWZlcmVuY2luZyB0aGUgdGFzayB0aGF0IHdpbGwgZXhwaXJlIGZpcnN0LiAgT2J0YWluIHRoZSB0aW1lIGF0IHdoaWNoCisJdGhlIHRpbWVyIHdpdGggdGhlIG5lYXJlc3QgZXhwaXJ5IHRpbWUgd2lsbCBleHBpcmUuICBJZiB0aGVyZSBhcmUgbm8KKwlhY3RpdmUgdGltZXJzIHRoZW4ganVzdCBzZXQgdGhlIG5leHQgZXhwaXJlIHRpbWUgdG8gMC4gIFRoYXQgd2lsbCBjYXVzZQorCXRoaXMgdGFzayB0byB1bmJsb2NrIHdoZW4gdGhlIHRpY2sgY291bnQgb3ZlcmZsb3dzLCBhdCB3aGljaCBwb2ludCB0aGUKKwl0aW1lciBsaXN0cyB3aWxsIGJlIHN3aXRjaGVkIGFuZCB0aGUgbmV4dCBleHBpcnkgdGltZSBjYW4gYmUKKwlyZS1hc3Nlc3NlZC4gICovCisJKnB4TGlzdFdhc0VtcHR5ID0gbGlzdExJU1RfSVNfRU1QVFkoIHB4Q3VycmVudFRpbWVyTGlzdCApOworCWlmKCAqcHhMaXN0V2FzRW1wdHkgPT0gcGRGQUxTRSApCisJeworCQl4TmV4dEV4cGlyZVRpbWUgPSBsaXN0R0VUX0lURU1fVkFMVUVfT0ZfSEVBRF9FTlRSWSggcHhDdXJyZW50VGltZXJMaXN0ICk7CisJfQorCWVsc2UKKwl7CisJCS8qIEVuc3VyZSB0aGUgdGFzayB1bmJsb2NrcyB3aGVuIHRoZSB0aWNrIGNvdW50IHJvbGxzIG92ZXIuICovCisJCXhOZXh0RXhwaXJlVGltZSA9ICggVGlja1R5cGVfdCApIDBVOworCX0KKworCXJldHVybiB4TmV4dEV4cGlyZVRpbWU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIFRpY2tUeXBlX3QgcHJ2U2FtcGxlVGltZU5vdyggQmFzZVR5cGVfdCAqIGNvbnN0IHB4VGltZXJMaXN0c1dlcmVTd2l0Y2hlZCApCit7CitUaWNrVHlwZV90IHhUaW1lTm93OworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBUaWNrVHlwZV90IHhMYXN0VGltZSA9ICggVGlja1R5cGVfdCApIDBVOyAvKmxpbnQgIWU5NTYgVmFyaWFibGUgaXMgb25seSBhY2Nlc3NpYmxlIHRvIG9uZSB0YXNrLiAqLworCisJeFRpbWVOb3cgPSB4VGFza0dldFRpY2tDb3VudCgpOworCisJaWYoIHhUaW1lTm93IDwgeExhc3RUaW1lICkKKwl7CisJCXBydlN3aXRjaFRpbWVyTGlzdHMoKTsKKwkJKnB4VGltZXJMaXN0c1dlcmVTd2l0Y2hlZCA9IHBkVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJKnB4VGltZXJMaXN0c1dlcmVTd2l0Y2hlZCA9IHBkRkFMU0U7CisJfQorCisJeExhc3RUaW1lID0geFRpbWVOb3c7CisKKwlyZXR1cm4geFRpbWVOb3c7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIEJhc2VUeXBlX3QgcHJ2SW5zZXJ0VGltZXJJbkFjdGl2ZUxpc3QoIFRpbWVyX3QgKiBjb25zdCBweFRpbWVyLCBjb25zdCBUaWNrVHlwZV90IHhOZXh0RXhwaXJ5VGltZSwgY29uc3QgVGlja1R5cGVfdCB4VGltZU5vdywgY29uc3QgVGlja1R5cGVfdCB4Q29tbWFuZFRpbWUgKQoreworQmFzZVR5cGVfdCB4UHJvY2Vzc1RpbWVyTm93ID0gcGRGQUxTRTsKKworCWxpc3RTRVRfTElTVF9JVEVNX1ZBTFVFKCAmKCBweFRpbWVyLT54VGltZXJMaXN0SXRlbSApLCB4TmV4dEV4cGlyeVRpbWUgKTsKKwlsaXN0U0VUX0xJU1RfSVRFTV9PV05FUiggJiggcHhUaW1lci0+eFRpbWVyTGlzdEl0ZW0gKSwgcHhUaW1lciApOworCisJaWYoIHhOZXh0RXhwaXJ5VGltZSA8PSB4VGltZU5vdyApCisJeworCQkvKiBIYXMgdGhlIGV4cGlyeSB0aW1lIGVsYXBzZWQgYmV0d2VlbiB0aGUgY29tbWFuZCB0byBzdGFydC9yZXNldCBhCisJCXRpbWVyIHdhcyBpc3N1ZWQsIGFuZCB0aGUgdGltZSB0aGUgY29tbWFuZCB3YXMgcHJvY2Vzc2VkPyAqLworCQlpZiggKCAoIFRpY2tUeXBlX3QgKSAoIHhUaW1lTm93IC0geENvbW1hbmRUaW1lICkgKSA+PSBweFRpbWVyLT54VGltZXJQZXJpb2RJblRpY2tzICkgLypsaW50ICFlOTYxIE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBvcnRzLiAqLworCQl7CisJCQkvKiBUaGUgdGltZSBiZXR3ZWVuIGEgY29tbWFuZCBiZWluZyBpc3N1ZWQgYW5kIHRoZSBjb21tYW5kIGJlaW5nCisJCQlwcm9jZXNzZWQgYWN0dWFsbHkgZXhjZWVkcyB0aGUgdGltZXJzIHBlcmlvZC4gICovCisJCQl4UHJvY2Vzc1RpbWVyTm93ID0gcGRUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJdkxpc3RJbnNlcnQoIHB4T3ZlcmZsb3dUaW1lckxpc3QsICYoIHB4VGltZXItPnhUaW1lckxpc3RJdGVtICkgKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiggKCB4VGltZU5vdyA8IHhDb21tYW5kVGltZSApICYmICggeE5leHRFeHBpcnlUaW1lID49IHhDb21tYW5kVGltZSApICkKKwkJeworCQkJLyogSWYsIHNpbmNlIHRoZSBjb21tYW5kIHdhcyBpc3N1ZWQsIHRoZSB0aWNrIGNvdW50IGhhcyBvdmVyZmxvd2VkCisJCQlidXQgdGhlIGV4cGlyeSB0aW1lIGhhcyBub3QsIHRoZW4gdGhlIHRpbWVyIG11c3QgaGF2ZSBhbHJlYWR5IHBhc3NlZAorCQkJaXRzIGV4cGlyeSB0aW1lIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5LiAqLworCQkJeFByb2Nlc3NUaW1lck5vdyA9IHBkVFJVRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXZMaXN0SW5zZXJ0KCBweEN1cnJlbnRUaW1lckxpc3QsICYoIHB4VGltZXItPnhUaW1lckxpc3RJdGVtICkgKTsKKwkJfQorCX0KKworCXJldHVybiB4UHJvY2Vzc1RpbWVyTm93OworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkCXBydlByb2Nlc3NSZWNlaXZlZENvbW1hbmRzKCB2b2lkICkKK3sKK0RhZW1vblRhc2tNZXNzYWdlX3QgeE1lc3NhZ2U7CitUaW1lcl90ICpweFRpbWVyOworQmFzZVR5cGVfdCB4VGltZXJMaXN0c1dlcmVTd2l0Y2hlZCwgeFJlc3VsdDsKK1RpY2tUeXBlX3QgeFRpbWVOb3c7CisKKwl3aGlsZSggeFF1ZXVlUmVjZWl2ZSggeFRpbWVyUXVldWUsICZ4TWVzc2FnZSwgdG1yTk9fREVMQVkgKSAhPSBwZEZBSUwgKSAvKmxpbnQgIWU2MDMgeE1lc3NhZ2UgZG9lcyBub3QgaGF2ZSB0byBiZSBpbml0aWFsaXNlZCBhcyBpdCBpcyBwYXNzZWQgb3V0LCBub3QgaW4sIGFuZCBpdCBpcyBub3QgdXNlZCB1bmxlc3MgeFF1ZXVlUmVjZWl2ZSgpIHJldHVybnMgcGRUUlVFLiAqLworCXsKKwkJI2lmICggSU5DTFVERV94VGltZXJQZW5kRnVuY3Rpb25DYWxsID09IDEgKQorCQl7CisJCQkvKiBOZWdhdGl2ZSBjb21tYW5kcyBhcmUgcGVuZGVkIGZ1bmN0aW9uIGNhbGxzIHJhdGhlciB0aGFuIHRpbWVyCisJCQljb21tYW5kcy4gKi8KKwkJCWlmKCB4TWVzc2FnZS54TWVzc2FnZUlEIDwgKCBCYXNlVHlwZV90ICkgMCApCisJCQl7CisJCQkJY29uc3QgQ2FsbGJhY2tQYXJhbWV0ZXJzX3QgKiBjb25zdCBweENhbGxiYWNrID0gJiggeE1lc3NhZ2UudS54Q2FsbGJhY2tQYXJhbWV0ZXJzICk7CisKKwkJCQkvKiBUaGUgdGltZXIgdXNlcyB0aGUgeENhbGxiYWNrUGFyYW1ldGVycyBtZW1iZXIgdG8gcmVxdWVzdCBhCisJCQkJY2FsbGJhY2sgYmUgZXhlY3V0ZWQuICBDaGVjayB0aGUgY2FsbGJhY2sgaXMgbm90IE5VTEwuICovCisJCQkJY29uZmlnQVNTRVJUKCBweENhbGxiYWNrICk7CisKKwkJCQkvKiBDYWxsIHRoZSBmdW5jdGlvbi4gKi8KKwkJCQlweENhbGxiYWNrLT5weENhbGxiYWNrRnVuY3Rpb24oIHB4Q2FsbGJhY2stPnB2UGFyYW1ldGVyMSwgcHhDYWxsYmFjay0+dWxQYXJhbWV0ZXIyICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJfQorCQl9CisJCSNlbmRpZiAvKiBJTkNMVURFX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwgKi8KKworCQkvKiBDb21tYW5kcyB0aGF0IGFyZSBwb3NpdGl2ZSBhcmUgdGltZXIgY29tbWFuZHMgcmF0aGVyIHRoYW4gcGVuZGVkCisJCWZ1bmN0aW9uIGNhbGxzLiAqLworCQlpZiggeE1lc3NhZ2UueE1lc3NhZ2VJRCA+PSAoIEJhc2VUeXBlX3QgKSAwICkKKwkJeworCQkJLyogVGhlIG1lc3NhZ2VzIHVzZXMgdGhlIHhUaW1lclBhcmFtZXRlcnMgbWVtYmVyIHRvIHdvcmsgb24gYQorCQkJc29mdHdhcmUgdGltZXIuICovCisJCQlweFRpbWVyID0geE1lc3NhZ2UudS54VGltZXJQYXJhbWV0ZXJzLnB4VGltZXI7CisKKwkJCWlmKCBsaXN0SVNfQ09OVEFJTkVEX1dJVEhJTiggTlVMTCwgJiggcHhUaW1lci0+eFRpbWVyTGlzdEl0ZW0gKSApID09IHBkRkFMU0UgKSAvKmxpbnQgIWU5NjEuIFRoZSBjYXN0IGlzIG9ubHkgcmVkdW5kYW50IHdoZW4gTlVMTCBpcyBwYXNzZWQgaW50byB0aGUgbWFjcm8uICovCisJCQl7CisJCQkJLyogVGhlIHRpbWVyIGlzIGluIGEgbGlzdCwgcmVtb3ZlIGl0LiAqLworCQkJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhUaW1lci0+eFRpbWVyTGlzdEl0ZW0gKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKworCQkJdHJhY2VUSU1FUl9DT01NQU5EX1JFQ0VJVkVEKCBweFRpbWVyLCB4TWVzc2FnZS54TWVzc2FnZUlELCB4TWVzc2FnZS51LnhUaW1lclBhcmFtZXRlcnMueE1lc3NhZ2VWYWx1ZSApOworCisJCQkvKiBJbiB0aGlzIGNhc2UgdGhlIHhUaW1lckxpc3RzV2VyZVN3aXRjaGVkIHBhcmFtZXRlciBpcyBub3QgdXNlZCwgYnV0CisJCQlpdCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGZ1bmN0aW9uIGNhbGwuICBwcnZTYW1wbGVUaW1lTm93KCkgbXVzdCBiZQorCQkJY2FsbGVkIGFmdGVyIHRoZSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20geFRpbWVyUXVldWUgc28gdGhlcmUgaXMgbm8KKwkJCXBvc3NpYmlsaXR5IG9mIGEgaGlnaGVyIHByaW9yaXR5IHRhc2sgYWRkaW5nIGEgbWVzc2FnZSB0byB0aGUgbWVzc2FnZQorCQkJcXVldWUgd2l0aCBhIHRpbWUgdGhhdCBpcyBhaGVhZCBvZiB0aGUgdGltZXIgZGFlbW9uIHRhc2sgKGJlY2F1c2UgaXQKKwkJCXByZS1lbXB0ZWQgdGhlIHRpbWVyIGRhZW1vbiB0YXNrIGFmdGVyIHRoZSB4VGltZU5vdyB2YWx1ZSB3YXMgc2V0KS4gKi8KKwkJCXhUaW1lTm93ID0gcHJ2U2FtcGxlVGltZU5vdyggJnhUaW1lckxpc3RzV2VyZVN3aXRjaGVkICk7CisKKwkJCXN3aXRjaCggeE1lc3NhZ2UueE1lc3NhZ2VJRCApCisJCQl7CisJCQkJY2FzZSB0bXJDT01NQU5EX1NUQVJUIDoKKwkJCSAgICBjYXNlIHRtckNPTU1BTkRfU1RBUlRfRlJPTV9JU1IgOgorCQkJICAgIGNhc2UgdG1yQ09NTUFORF9SRVNFVCA6CisJCQkgICAgY2FzZSB0bXJDT01NQU5EX1JFU0VUX0ZST01fSVNSIDoKKwkJCQljYXNlIHRtckNPTU1BTkRfU1RBUlRfRE9OVF9UUkFDRSA6CisJCQkJCS8qIFN0YXJ0IG9yIHJlc3RhcnQgYSB0aW1lci4gKi8KKwkJCQkJaWYoIHBydkluc2VydFRpbWVySW5BY3RpdmVMaXN0KCBweFRpbWVyLCAgeE1lc3NhZ2UudS54VGltZXJQYXJhbWV0ZXJzLnhNZXNzYWdlVmFsdWUgKyBweFRpbWVyLT54VGltZXJQZXJpb2RJblRpY2tzLCB4VGltZU5vdywgeE1lc3NhZ2UudS54VGltZXJQYXJhbWV0ZXJzLnhNZXNzYWdlVmFsdWUgKSAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJLyogVGhlIHRpbWVyIGV4cGlyZWQgYmVmb3JlIGl0IHdhcyBhZGRlZCB0byB0aGUgYWN0aXZlCisJCQkJCQl0aW1lciBsaXN0LiAgUHJvY2VzcyBpdCBub3cuICovCisJCQkJCQlweFRpbWVyLT5weENhbGxiYWNrRnVuY3Rpb24oICggVGltZXJIYW5kbGVfdCApIHB4VGltZXIgKTsKKwkJCQkJCXRyYWNlVElNRVJfRVhQSVJFRCggcHhUaW1lciApOworCisJCQkJCQlpZiggcHhUaW1lci0+dXhBdXRvUmVsb2FkID09ICggVUJhc2VUeXBlX3QgKSBwZFRSVUUgKQorCQkJCQkJeworCQkJCQkJCXhSZXN1bHQgPSB4VGltZXJHZW5lcmljQ29tbWFuZCggcHhUaW1lciwgdG1yQ09NTUFORF9TVEFSVF9ET05UX1RSQUNFLCB4TWVzc2FnZS51LnhUaW1lclBhcmFtZXRlcnMueE1lc3NhZ2VWYWx1ZSArIHB4VGltZXItPnhUaW1lclBlcmlvZEluVGlja3MsIE5VTEwsIHRtck5PX0RFTEFZICk7CisJCQkJCQkJY29uZmlnQVNTRVJUKCB4UmVzdWx0ICk7CisJCQkJCQkJKCB2b2lkICkgeFJlc3VsdDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIHRtckNPTU1BTkRfU1RPUCA6CisJCQkJY2FzZSB0bXJDT01NQU5EX1NUT1BfRlJPTV9JU1IgOgorCQkJCQkvKiBUaGUgdGltZXIgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGFjdGl2ZSBsaXN0LgorCQkJCQlUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuICovCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSB0bXJDT01NQU5EX0NIQU5HRV9QRVJJT0QgOgorCQkJCWNhc2UgdG1yQ09NTUFORF9DSEFOR0VfUEVSSU9EX0ZST01fSVNSIDoKKwkJCQkJcHhUaW1lci0+eFRpbWVyUGVyaW9kSW5UaWNrcyA9IHhNZXNzYWdlLnUueFRpbWVyUGFyYW1ldGVycy54TWVzc2FnZVZhbHVlOworCQkJCQljb25maWdBU1NFUlQoICggcHhUaW1lci0+eFRpbWVyUGVyaW9kSW5UaWNrcyA+IDAgKSApOworCisJCQkJCS8qIFRoZSBuZXcgcGVyaW9kIGRvZXMgbm90IHJlYWxseSBoYXZlIGEgcmVmZXJlbmNlLCBhbmQgY2FuCisJCQkJCWJlIGxvbmdlciBvciBzaG9ydGVyIHRoYW4gdGhlIG9sZCBvbmUuICBUaGUgY29tbWFuZCB0aW1lIGlzCisJCQkJCXRoZXJlZm9yZSBzZXQgdG8gdGhlIGN1cnJlbnQgdGltZSwgYW5kIGFzIHRoZSBwZXJpb2QgY2Fubm90CisJCQkJCWJlIHplcm8gdGhlIG5leHQgZXhwaXJ5IHRpbWUgY2FuIG9ubHkgYmUgaW4gdGhlIGZ1dHVyZSwKKwkJCQkJbWVhbmluZyAodW5saWtlIGZvciB0aGUgeFRpbWVyU3RhcnQoKSBjYXNlIGFib3ZlKSB0aGVyZSBpcworCQkJCQlubyBmYWlsIGNhc2UgdGhhdCBuZWVkcyB0byBiZSBoYW5kbGVkIGhlcmUuICovCisJCQkJCSggdm9pZCApIHBydkluc2VydFRpbWVySW5BY3RpdmVMaXN0KCBweFRpbWVyLCAoIHhUaW1lTm93ICsgcHhUaW1lci0+eFRpbWVyUGVyaW9kSW5UaWNrcyApLCB4VGltZU5vdywgeFRpbWVOb3cgKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIHRtckNPTU1BTkRfREVMRVRFIDoKKwkJCQkJLyogVGhlIHRpbWVyIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBhY3RpdmUgbGlzdCwKKwkJCQkJanVzdCBmcmVlIHVwIHRoZSBtZW1vcnkgaWYgdGhlIG1lbW9yeSB3YXMgZHluYW1pY2FsbHkKKwkJCQkJYWxsb2NhdGVkLiAqLworCQkJCQkjaWYoICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAwICkgKQorCQkJCQl7CisJCQkJCQkvKiBUaGUgdGltZXIgY2FuIG9ubHkgaGF2ZSBiZWVuIGFsbG9jYXRlZCBkeW5hbWljYWxseSAtCisJCQkJCQlmcmVlIGl0IGFnYWluLiAqLworCQkJCQkJdlBvcnRGcmVlKCBweFRpbWVyICk7CisJCQkJCX0KKwkJCQkJI2VsaWYoICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgKQorCQkJCQl7CisJCQkJCQkvKiBUaGUgdGltZXIgY291bGQgaGF2ZSBiZWVuIGFsbG9jYXRlZCBzdGF0aWNhbGx5IG9yCisJCQkJCQlkeW5hbWljYWxseSwgc28gY2hlY2sgYmVmb3JlIGF0dGVtcHRpbmcgdG8gZnJlZSB0aGUKKwkJCQkJCW1lbW9yeS4gKi8KKwkJCQkJCWlmKCBweFRpbWVyLT51Y1N0YXRpY2FsbHlBbGxvY2F0ZWQgPT0gKCB1aW50OF90ICkgcGRGQUxTRSApCisJCQkJCQl7CisJCQkJCQkJdlBvcnRGcmVlKCBweFRpbWVyICk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCSNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQJOgorCQkJCQkvKiBEb24ndCBleHBlY3QgdG8gZ2V0IGhlcmUuICovCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlN3aXRjaFRpbWVyTGlzdHMoIHZvaWQgKQoreworVGlja1R5cGVfdCB4TmV4dEV4cGlyZVRpbWUsIHhSZWxvYWRUaW1lOworTGlzdF90ICpweFRlbXA7CitUaW1lcl90ICpweFRpbWVyOworQmFzZVR5cGVfdCB4UmVzdWx0OworCisJLyogVGhlIHRpY2sgY291bnQgaGFzIG92ZXJmbG93ZWQuICBUaGUgdGltZXIgbGlzdHMgbXVzdCBiZSBzd2l0Y2hlZC4KKwlJZiB0aGVyZSBhcmUgYW55IHRpbWVycyBzdGlsbCByZWZlcmVuY2VkIGZyb20gdGhlIGN1cnJlbnQgdGltZXIgbGlzdAorCXRoZW4gdGhleSBtdXN0IGhhdmUgZXhwaXJlZCBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGxpc3RzCisJYXJlIHN3aXRjaGVkLiAqLworCXdoaWxlKCBsaXN0TElTVF9JU19FTVBUWSggcHhDdXJyZW50VGltZXJMaXN0ICkgPT0gcGRGQUxTRSApCisJeworCQl4TmV4dEV4cGlyZVRpbWUgPSBsaXN0R0VUX0lURU1fVkFMVUVfT0ZfSEVBRF9FTlRSWSggcHhDdXJyZW50VGltZXJMaXN0ICk7CisKKwkJLyogUmVtb3ZlIHRoZSB0aW1lciBmcm9tIHRoZSBsaXN0LiAqLworCQlweFRpbWVyID0gKCBUaW1lcl90ICogKSBsaXN0R0VUX09XTkVSX09GX0hFQURfRU5UUlkoIHB4Q3VycmVudFRpbWVyTGlzdCApOworCQkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICYoIHB4VGltZXItPnhUaW1lckxpc3RJdGVtICkgKTsKKwkJdHJhY2VUSU1FUl9FWFBJUkVEKCBweFRpbWVyICk7CisKKwkJLyogRXhlY3V0ZSBpdHMgY2FsbGJhY2ssIHRoZW4gc2VuZCBhIGNvbW1hbmQgdG8gcmVzdGFydCB0aGUgdGltZXIgaWYKKwkJaXQgaXMgYW4gYXV0by1yZWxvYWQgdGltZXIuICBJdCBjYW5ub3QgYmUgcmVzdGFydGVkIGhlcmUgYXMgdGhlIGxpc3RzCisJCWhhdmUgbm90IHlldCBiZWVuIHN3aXRjaGVkLiAqLworCQlweFRpbWVyLT5weENhbGxiYWNrRnVuY3Rpb24oICggVGltZXJIYW5kbGVfdCApIHB4VGltZXIgKTsKKworCQlpZiggcHhUaW1lci0+dXhBdXRvUmVsb2FkID09ICggVUJhc2VUeXBlX3QgKSBwZFRSVUUgKQorCQl7CisJCQkvKiBDYWxjdWxhdGUgdGhlIHJlbG9hZCB2YWx1ZSwgYW5kIGlmIHRoZSByZWxvYWQgdmFsdWUgcmVzdWx0cyBpbgorCQkJdGhlIHRpbWVyIGdvaW5nIGludG8gdGhlIHNhbWUgdGltZXIgbGlzdCB0aGVuIGl0IGhhcyBhbHJlYWR5IGV4cGlyZWQKKwkJCWFuZCB0aGUgdGltZXIgc2hvdWxkIGJlIHJlLWluc2VydGVkIGludG8gdGhlIGN1cnJlbnQgbGlzdCBzbyBpdCBpcworCQkJcHJvY2Vzc2VkIGFnYWluIHdpdGhpbiB0aGlzIGxvb3AuICBPdGhlcndpc2UgYSBjb21tYW5kIHNob3VsZCBiZSBzZW50CisJCQl0byByZXN0YXJ0IHRoZSB0aW1lciB0byBlbnN1cmUgaXQgaXMgb25seSBpbnNlcnRlZCBpbnRvIGEgbGlzdCBhZnRlcgorCQkJdGhlIGxpc3RzIGhhdmUgYmVlbiBzd2FwcGVkLiAqLworCQkJeFJlbG9hZFRpbWUgPSAoIHhOZXh0RXhwaXJlVGltZSArIHB4VGltZXItPnhUaW1lclBlcmlvZEluVGlja3MgKTsKKwkJCWlmKCB4UmVsb2FkVGltZSA+IHhOZXh0RXhwaXJlVGltZSApCisJCQl7CisJCQkJbGlzdFNFVF9MSVNUX0lURU1fVkFMVUUoICYoIHB4VGltZXItPnhUaW1lckxpc3RJdGVtICksIHhSZWxvYWRUaW1lICk7CisJCQkJbGlzdFNFVF9MSVNUX0lURU1fT1dORVIoICYoIHB4VGltZXItPnhUaW1lckxpc3RJdGVtICksIHB4VGltZXIgKTsKKwkJCQl2TGlzdEluc2VydCggcHhDdXJyZW50VGltZXJMaXN0LCAmKCBweFRpbWVyLT54VGltZXJMaXN0SXRlbSApICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJeFJlc3VsdCA9IHhUaW1lckdlbmVyaWNDb21tYW5kKCBweFRpbWVyLCB0bXJDT01NQU5EX1NUQVJUX0RPTlRfVFJBQ0UsIHhOZXh0RXhwaXJlVGltZSwgTlVMTCwgdG1yTk9fREVMQVkgKTsKKwkJCQljb25maWdBU1NFUlQoIHhSZXN1bHQgKTsKKwkJCQkoIHZvaWQgKSB4UmVzdWx0OworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCisJcHhUZW1wID0gcHhDdXJyZW50VGltZXJMaXN0OworCXB4Q3VycmVudFRpbWVyTGlzdCA9IHB4T3ZlcmZsb3dUaW1lckxpc3Q7CisJcHhPdmVyZmxvd1RpbWVyTGlzdCA9IHB4VGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZDaGVja0ZvclZhbGlkTGlzdEFuZFF1ZXVlKCB2b2lkICkKK3sKKwkvKiBDaGVjayB0aGF0IHRoZSBsaXN0IGZyb20gd2hpY2ggYWN0aXZlIHRpbWVycyBhcmUgcmVmZXJlbmNlZCwgYW5kIHRoZQorCXF1ZXVlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdGltZXIgc2VydmljZSwgaGF2ZSBiZWVuCisJaW5pdGlhbGlzZWQuICovCisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJeworCQlpZiggeFRpbWVyUXVldWUgPT0gTlVMTCApCisJCXsKKwkJCXZMaXN0SW5pdGlhbGlzZSggJnhBY3RpdmVUaW1lckxpc3QxICk7CisJCQl2TGlzdEluaXRpYWxpc2UoICZ4QWN0aXZlVGltZXJMaXN0MiApOworCQkJcHhDdXJyZW50VGltZXJMaXN0ID0gJnhBY3RpdmVUaW1lckxpc3QxOworCQkJcHhPdmVyZmxvd1RpbWVyTGlzdCA9ICZ4QWN0aXZlVGltZXJMaXN0MjsKKworCQkJI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQorCQkJeworCQkJCS8qIFRoZSB0aW1lciBxdWV1ZSBpcyBhbGxvY2F0ZWQgc3RhdGljYWxseSBpbiBjYXNlCisJCQkJY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gaXMgMC4gKi8KKwkJCQlzdGF0aWMgU3RhdGljUXVldWVfdCB4U3RhdGljVGltZXJRdWV1ZTsgLypsaW50ICFlOTU2IE9rIHRvIGRlY2xhcmUgaW4gdGhpcyBtYW5uZXIgdG8gcHJldmVudCBhZGRpdGlvbmFsIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGd1YXJkcyBpbiBvdGhlciBsb2NhdGlvbnMuICovCisJCQkJc3RhdGljIHVpbnQ4X3QgdWNTdGF0aWNUaW1lclF1ZXVlU3RvcmFnZVsgKCBzaXplX3QgKSBjb25maWdUSU1FUl9RVUVVRV9MRU5HVEggKiBzaXplb2YoIERhZW1vblRhc2tNZXNzYWdlX3QgKSBdOyAvKmxpbnQgIWU5NTYgT2sgdG8gZGVjbGFyZSBpbiB0aGlzIG1hbm5lciB0byBwcmV2ZW50IGFkZGl0aW9uYWwgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZ3VhcmRzIGluIG90aGVyIGxvY2F0aW9ucy4gKi8KKworCQkJCXhUaW1lclF1ZXVlID0geFF1ZXVlQ3JlYXRlU3RhdGljKCAoIFVCYXNlVHlwZV90ICkgY29uZmlnVElNRVJfUVVFVUVfTEVOR1RILCAoIFVCYXNlVHlwZV90ICkgc2l6ZW9mKCBEYWVtb25UYXNrTWVzc2FnZV90ICksICYoIHVjU3RhdGljVGltZXJRdWV1ZVN0b3JhZ2VbIDAgXSApLCAmeFN0YXRpY1RpbWVyUXVldWUgKTsKKwkJCX0KKwkJCSNlbHNlCisJCQl7CisJCQkJeFRpbWVyUXVldWUgPSB4UXVldWVDcmVhdGUoICggVUJhc2VUeXBlX3QgKSBjb25maWdUSU1FUl9RVUVVRV9MRU5HVEgsIHNpemVvZiggRGFlbW9uVGFza01lc3NhZ2VfdCApICk7CisJCQl9CisJCQkjZW5kaWYKKworCQkJI2lmICggY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDAgKQorCQkJeworCQkJCWlmKCB4VGltZXJRdWV1ZSAhPSBOVUxMICkKKwkJCQl7CisJCQkJCXZRdWV1ZUFkZFRvUmVnaXN0cnkoIHhUaW1lclF1ZXVlLCAiVG1yUSIgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFICovCisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisJdGFza0VYSVRfQ1JJVElDQUwoKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhUaW1lcklzVGltZXJBY3RpdmUoIFRpbWVySGFuZGxlX3QgeFRpbWVyICkKK3sKK0Jhc2VUeXBlX3QgeFRpbWVySXNJbkFjdGl2ZUxpc3Q7CitUaW1lcl90ICpweFRpbWVyID0gKCBUaW1lcl90ICogKSB4VGltZXI7CisKKwljb25maWdBU1NFUlQoIHhUaW1lciApOworCisJLyogSXMgdGhlIHRpbWVyIGluIHRoZSBsaXN0IG9mIGFjdGl2ZSB0aW1lcnM/ICovCisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJeworCQkvKiBDaGVja2luZyB0byBzZWUgaWYgaXQgaXMgaW4gdGhlIE5VTEwgbGlzdCBpbiBlZmZlY3QgY2hlY2tzIHRvIHNlZSBpZgorCQlpdCBpcyByZWZlcmVuY2VkIGZyb20gZWl0aGVyIHRoZSBjdXJyZW50IG9yIHRoZSBvdmVyZmxvdyB0aW1lciBsaXN0cyBpbgorCQlvbmUgZ28sIGJ1dCB0aGUgbG9naWMgaGFzIHRvIGJlIHJldmVyc2VkLCBoZW5jZSB0aGUgJyEnLiAqLworCQl4VGltZXJJc0luQWN0aXZlTGlzdCA9ICggQmFzZVR5cGVfdCApICEoIGxpc3RJU19DT05UQUlORURfV0lUSElOKCBOVUxMLCAmKCBweFRpbWVyLT54VGltZXJMaXN0SXRlbSApICkgKTsgLypsaW50ICFlOTYxLiBDYXN0IGlzIG9ubHkgcmVkdW5kYW50IHdoZW4gTlVMTCBpcyBwYXNzZWQgaW50byB0aGUgbWFjcm8uICovCisJfQorCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwlyZXR1cm4geFRpbWVySXNJbkFjdGl2ZUxpc3Q7Cit9IC8qbGludCAhZTgxOCBDYW4ndCBiZSBwb2ludGVyIHRvIGNvbnN0IGR1ZSB0byB0aGUgdHlwZWRlZi4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkICpwdlRpbWVyR2V0VGltZXJJRCggY29uc3QgVGltZXJIYW5kbGVfdCB4VGltZXIgKQoreworVGltZXJfdCAqIGNvbnN0IHB4VGltZXIgPSAoIFRpbWVyX3QgKiApIHhUaW1lcjsKK3ZvaWQgKnB2UmV0dXJuOworCisJY29uZmlnQVNTRVJUKCB4VGltZXIgKTsKKworCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCXsKKwkJcHZSZXR1cm4gPSBweFRpbWVyLT5wdlRpbWVySUQ7CisJfQorCXRhc2tFWElUX0NSSVRJQ0FMKCk7CisKKwlyZXR1cm4gcHZSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2VGltZXJTZXRUaW1lcklEKCBUaW1lckhhbmRsZV90IHhUaW1lciwgdm9pZCAqcHZOZXdJRCApCit7CitUaW1lcl90ICogY29uc3QgcHhUaW1lciA9ICggVGltZXJfdCAqICkgeFRpbWVyOworCisJY29uZmlnQVNTRVJUKCB4VGltZXIgKTsKKworCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCXsKKwkJcHhUaW1lci0+cHZUaW1lcklEID0gcHZOZXdJRDsKKwl9CisJdGFza0VYSVRfQ1JJVElDQUwoKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIElOQ0xVREVfeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbCA9PSAxICkKKworCUJhc2VUeXBlX3QgeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbEZyb21JU1IoIFBlbmRlZEZ1bmN0aW9uX3QgeEZ1bmN0aW9uVG9QZW5kLCB2b2lkICpwdlBhcmFtZXRlcjEsIHVpbnQzMl90IHVsUGFyYW1ldGVyMiwgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApCisJeworCURhZW1vblRhc2tNZXNzYWdlX3QgeE1lc3NhZ2U7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCisJCS8qIENvbXBsZXRlIHRoZSBtZXNzYWdlIHdpdGggdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgYW5kIHBvc3QgaXQgdG8gdGhlCisJCWRhZW1vbiB0YXNrLiAqLworCQl4TWVzc2FnZS54TWVzc2FnZUlEID0gdG1yQ09NTUFORF9FWEVDVVRFX0NBTExCQUNLX0ZST01fSVNSOworCQl4TWVzc2FnZS51LnhDYWxsYmFja1BhcmFtZXRlcnMucHhDYWxsYmFja0Z1bmN0aW9uID0geEZ1bmN0aW9uVG9QZW5kOworCQl4TWVzc2FnZS51LnhDYWxsYmFja1BhcmFtZXRlcnMucHZQYXJhbWV0ZXIxID0gcHZQYXJhbWV0ZXIxOworCQl4TWVzc2FnZS51LnhDYWxsYmFja1BhcmFtZXRlcnMudWxQYXJhbWV0ZXIyID0gdWxQYXJhbWV0ZXIyOworCisJCXhSZXR1cm4gPSB4UXVldWVTZW5kRnJvbUlTUiggeFRpbWVyUXVldWUsICZ4TWVzc2FnZSwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworCisJCXRyYWNlUEVORF9GVU5DX0NBTExfRlJPTV9JU1IoIHhGdW5jdGlvblRvUGVuZCwgcHZQYXJhbWV0ZXIxLCB1bFBhcmFtZXRlcjIsIHhSZXR1cm4gKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBJTkNMVURFX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIElOQ0xVREVfeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbCA9PSAxICkKKworCUJhc2VUeXBlX3QgeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbCggUGVuZGVkRnVuY3Rpb25fdCB4RnVuY3Rpb25Ub1BlbmQsIHZvaWQgKnB2UGFyYW1ldGVyMSwgdWludDMyX3QgdWxQYXJhbWV0ZXIyLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCisJeworCURhZW1vblRhc2tNZXNzYWdlX3QgeE1lc3NhZ2U7CisJQmFzZVR5cGVfdCB4UmV0dXJuOworCisJCS8qIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGEgdGltZXIgaGFzIGJlZW4gY3JlYXRlZCBvcgorCQlhZnRlciB0aGUgc2NoZWR1bGVyIGhhcyBiZWVuIHN0YXJ0ZWQgYmVjYXVzZSwgdW50aWwgdGhlbiwgdGhlIHRpbWVyCisJCXF1ZXVlIGRvZXMgbm90IGV4aXN0LiAqLworCQljb25maWdBU1NFUlQoIHhUaW1lclF1ZXVlICk7CisKKwkJLyogQ29tcGxldGUgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgcG9zdCBpdCB0byB0aGUKKwkJZGFlbW9uIHRhc2suICovCisJCXhNZXNzYWdlLnhNZXNzYWdlSUQgPSB0bXJDT01NQU5EX0VYRUNVVEVfQ0FMTEJBQ0s7CisJCXhNZXNzYWdlLnUueENhbGxiYWNrUGFyYW1ldGVycy5weENhbGxiYWNrRnVuY3Rpb24gPSB4RnVuY3Rpb25Ub1BlbmQ7CisJCXhNZXNzYWdlLnUueENhbGxiYWNrUGFyYW1ldGVycy5wdlBhcmFtZXRlcjEgPSBwdlBhcmFtZXRlcjE7CisJCXhNZXNzYWdlLnUueENhbGxiYWNrUGFyYW1ldGVycy51bFBhcmFtZXRlcjIgPSB1bFBhcmFtZXRlcjI7CisKKwkJeFJldHVybiA9IHhRdWV1ZVNlbmRUb0JhY2soIHhUaW1lclF1ZXVlLCAmeE1lc3NhZ2UsIHhUaWNrc1RvV2FpdCApOworCisJCXRyYWNlUEVORF9GVU5DX0NBTEwoIHhGdW5jdGlvblRvUGVuZCwgcHZQYXJhbWV0ZXIxLCB1bFBhcmFtZXRlcjIsIHhSZXR1cm4gKTsKKworCQlyZXR1cm4geFJldHVybjsKKwl9CisKKyNlbmRpZiAvKiBJTkNMVURFX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCisKKwlVQmFzZVR5cGVfdCB1eFRpbWVyR2V0VGltZXJOdW1iZXIoIFRpbWVySGFuZGxlX3QgeFRpbWVyICkKKwl7CisJCXJldHVybiAoICggVGltZXJfdCAqICkgeFRpbWVyICktPnV4VGltZXJOdW1iZXI7CisJfQorCisjZW5kaWYgLyogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQorCisJdm9pZCB2VGltZXJTZXRUaW1lck51bWJlciggVGltZXJIYW5kbGVfdCB4VGltZXIsIFVCYXNlVHlwZV90IHV4VGltZXJOdW1iZXIgKQorCXsKKwkJKCAoIFRpbWVyX3QgKiApIHhUaW1lciApLT51eFRpbWVyTnVtYmVyID0gdXhUaW1lck51bWJlcjsKKwl9CisKKyNlbmRpZiAvKiBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGlzIGVudGlyZSBzb3VyY2UgZmlsZSB3aWxsIGJlIHNraXBwZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBjb25maWd1cmVkCit0byBpbmNsdWRlIHNvZnR3YXJlIHRpbWVyIGZ1bmN0aW9uYWxpdHkuICBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIHNvZnR3YXJlIHRpbWVyCitmdW5jdGlvbmFsaXR5IHRoZW4gZW5zdXJlIGNvbmZpZ1VTRV9USU1FUlMgaXMgc2V0IHRvIDEgaW4gRnJlZVJUT1NDb25maWcuaC4gKi8KKyNlbmRpZiAvKiBjb25maWdVU0VfVElNRVJTID09IDEgKi8KKworCisKZGlmZiAtLWdpdCBhL2xpbmtzX3RvX2RvY19wYWdlc19mb3JfdGhlX2RlbW9fcHJvamVjdHMudXJsIGIvbGlua3NfdG9fZG9jX3BhZ2VzX2Zvcl90aGVfZGVtb19wcm9qZWN0cy51cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkNTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbmtzX3RvX2RvY19wYWdlc19mb3JfdGhlX2RlbW9fcHJvamVjdHMudXJsCkBAIC0wLDAgKzEsNSBAQAorW3swMDAyMTRBMC0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDZ9XQorUHJvcDM9MTksMgorW0ludGVybmV0U2hvcnRjdXRdCitVUkw9aHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMDkwLmh0bWwKK0lETGlzdD0KZGlmZiAtLWdpdCBhL3JlYWRtZS50eHQgYi9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbWUudHh0Cg==