ZGlmZiAtLWdpdCBhL2RvYy9LVVJTL0xQQy1LVVJTMi9Db250ZW50cyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9Db250ZW50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjU4YThhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMyL0NvbnRlbnRzCkBAIC0wLDAgKzEsMTUgQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnIAorTm92ZW1iZXIgMTk5MworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRzCisKKzE6IEludHJvZHVjdGlvbgorMjogVGhlIExQTXVkIERyaXZlcgorMzogQ29tcGxleCBEYXRhIFR5cGVzCis0OiBUaGUgTFBDIFByZS1Db21waWxlcgorNTogQWR2YW5jZWQgU3RyaW5nIEhhbmRsaW5nCis2OiBJbnRlcm1lZGlhdGUgSW5oZXJpdGFuY2UKKzc6IERlYnVnZ2luZworCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvQ29weXJpZ2h0IGIvZG9jL0tVUlMvTFBDLUtVUlMyL0NvcHlyaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWEyNjIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL0tVUlMvTFBDLUtVUlMyL0NvcHlyaWdodApAQCAtMCwwICsxLDYyIEBACisgICAgICAgICAgICAgICAgICAgICAgSW50ZXJtZWRpYXRlIExQQyBmaXJzdCBlZGl0aW9uCisKK0NvcHlyaWdodCAoYykgMTk5MyBHZW9yZ2UgUmVlc2UKK0FsbCByaWdodHMgdG8gdGhpcyB0ZXh0IGFyZSByZXRhaW5lZCBieSB0aGUgYXV0aG9yLgorCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBkaXN0cnVidXRlIGFuZCBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGlzCitkb2N1bWVudCBpbiBmdWxsIHNvIGxvbmcgYXMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisxKSBObyBwYXltZW50IG1heSBiZSByZWNlaXZlZCBmb3IgdGhlIHJlZGlzdHJpYnV0aW9uIG9yIGRpc3BsYXkgb2YgdGhpcyB0ZXh0LAorZXhjZXB0IHRvIGNvdmVyIHRoZSBjb3N0cyBmb3IgZGlzdHJpYnV0aW9uIG1lZGlhIGFuZCBhbmQgc2hpcHBpbmcgYW5kL29yCit0cmFuc21pc3Npb24gY2hhcmdlcy4KKzIpIFRoZSB0ZXh0Ym9vayBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9yIGRpc3BsYXllZCBpbiBpdHMgZW50aXJldHkgaW4gaXRzIG9yaWdpbmFsCitmb3JtLiAgQ2hhbmdlcyBtYXkgb25seSBiZSBtYWRlIHRvIHByaXZhdGUsIGluZGl2aWR1YWwgY29waWVzLCBleGNlcHQgYXMKK291dGxpbmVkIGJlbG93LgorCitBY2NlcHRhYmxlIGNoYW5nZXMgYXJlIGRlZmluZWQgYXMgdGhlIGZvbGxvd2luZzoKKzEpIEZvcm1hdCBjaGFuZ2VzLCBzdWNoIGFzIGNoYW5naW5nIGZyb20gV29yZFBlcmZlY3QgdG8gV29yZCAKKzIpIE1lZGl1bSBjaGFuZ2VzLCBzdWNoIGFzIGZyb20gZWxlY3Ryb25pYyBjb3B5IHRvIHBhcGVyCiszKSBDb250ZW50IGNoYW5nZXMgYXJlIG9ubHkgYWNjZXB0YWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIGNpcmN1bXN0YW5jZXM6CisJYSkgSW4gZWxlY3Ryb25pYyBtZWRpYTogbm9uZSBvZiB0aGUgb3JpZ2luYWwgdGV4dCBtYXkgYmUgb21taXR0ZWQuIAorICAgICAgICBZb3UgbWF5IGFkZCBjb21tZW50cworCWFzIHlvdSBmZWVsIG5lY2Vzc2FyeSwgc28gbG9uZyBhcyBjb21tZW50cyBhcmUgZW5jbG9zZWQgaW4gPCogKj4KKyAgICAgICAgYW5kIGFyZSBhY2NvbXBhbmllZCBieQorCXRoZSBnYW1lIG5hbWUgb3IgcmVhbCBuYW1lIG9mIHRoZSBhdXRob3Igb2YgdGhlIGNvbW1lbnRzCisJYikgSW4gaGFyZCBjb3B5OiBub25lIG9mIHRoZSBvcmlnaW5hbCB0ZXh0IG1heSBiZSBvbWl0dGVkLCBidXQgaXQgbWF5CisgICAgICAgIGJlIHN0cnVjayBvdXQgc28gbG9uZworCWFzIHRoZSBjb250ZW50IG9mIHRoZSBvcmlnaW5hbCB0ZXh0IGlzIHZpc2libGUuICBDb21tZW50cyBtYXkgYmUgbWFkZQorICAgICAgICBpbiBhbnkgZm9ybSBzbyBsb25nIAorCWFzIHRoZXkgYXJlIG1hZGUgaW4gaGFuZHdyaXRpbmcgYW5kIHRoZXkgYXJlIHNpZ25lZCBieSB0aGUgYXV0aG9yLiAKKyAgICAgICAgQ29tbWVudHMgd2hpY2ggYXJlIHR5cGVkIG9yIHByaW50ZWQgbXVzdCBiZSBtYWRlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKyAgICAgICAgZm9ybWF0IGZvciBlbGVjdHJvbmljIG1lZGlhLgorCitQcmFjdGljYWxseSBzcGVha2luZywgdGhpcyBpcyB3aGF0IEkgbWVhbjoKK0ZpcnN0LCBJIHdyb3RlIHRoaXMgbW9zdGx5IGZvciBtdWQgYWRtaW5zIHRvIHB1dCBvbnRvIHRoZWlyIG11ZHMgZm9yIGxlYXJuaW5nCitjb2RlcnMgdG8gcmVhZCBhcyB0aGV5IGFyZSBsZWFybmluZyB0byBidWlsZCByZWFsbXMuICBJIGRpZCBub3QgZG8gdGhpcyBmb3IKK3NvbWVvbmUgZWxzZSB0byBtYWtlIGEgYnVjay4gIFNvIGlmIHlvdSBjaGFyZ2UgbW9uZXkgZm9yIHJlZGlzdHJpYnV0aW5nIGl0CitvciBhbGxvd2luZyBzb21lb25lIGVsc2UgdG8gc2VlIGl0LCB5b3UgYXJlIGluIHZpb2xhdGlvbiBvZiB0aGlzIGNvcHlyaWdodC4gCitVbmxlc3MgeW91IGFyZSBzaW1wbHkgY2hhcmdpbmcgZm9yIHdoYXQgaXQgY29zdCB5b3UgdG8gcHJpbnQgdXAgYSBjb3B5IG9yCit3aGF0IHRoZSBkaXNrZXR0ZXMgYW5kIHBvc3RhZ2UgY29zdCB0byBtYWlsIGl0LgorU2Vjb25kLCBJIHdyb3RlIHRoaXMgdGV4dGJvb2ssIGFuZCBJIHNob3VsZCByZWNlaXZlIGNyZWRpdC9ibGFtZSBmb3Igd2hhdCBJCitzYXksIGFuZCBvdGhlcnMgc2hvdWxkIHJlY2VpdmUgY3JlZGl0L2JsYW1lIGZvciB3aGF0IHRoZXkgc2F5LiAgRm9yIGV4YW1wbGUsCitpZiBJIHNhaWQgc29tZXRoaW5nIGNvbXBsZXRlbHkgd3JvbmcsIGFuZCB5b3Ugc2ltcGx5IGNvcnJlY3RlZCBpdCwgSSB3b3VsZAorYmUgZ2V0dGluZyBjcmVkaXQgZm9yIHNvbWV0aGluZyBJIGRpZCBub3QgZG8uICBZZXQsIGlmIHlvdSBjb21tZW50IGFjY29yZGluZwordG8gdGhlIG91dGxpbmUgYWJvdmUsIHlvdSB3aWxsIGJlIHByb3Blcmx5IGNyZWRpdGVkIGZvciB5b3VyIGNvbW1lbnRzLiAKK01vcmUgaW1wb3J0YW50IHRvIG1lLCBob3dldmVyLCBpcyB0aGUgcHJhY3RpY2FsIGVmZmVjdCBvZiBoYXZpbmcgaHVuZHJlZHMgb2YKK2NvcGllcyBvZiB0aGlzIHRleHRib29rIGV2ZXJ5d2hlcmUuICBJZiB5b3UgY2hhbmdlIHNvbWV0aGluZyBJIGhhZCByaWdodAord2l0aG91dCBub3RpbmcgaXQgYXMgYSBjb21tZW50LCBJIHdpbGwgYmUgYmxhbWVkIGZvciBzcHJlYWRpbmcKK21pc2luZm9ybWF0aW9uLiAgVGhpcyBwcm9ibGVtIGlzIG9ubHkgY29tcHVuZGVkIGlmIHRoZSB0ZXh0IGlzIHJlZGlzdHJpYnV0ZWQuIAorU28gSSBwcmVmZXIgbXkgd29yZHMgdG8gcmVtYWluIG15IG93bi4gIEJ1dCwgd2hlbiBJIG1ha2UgbWlzdGFrZXMsIG9yIGlmCitzb21ldGhpbmcgSSBzYXkgZG9lcyBub3QgZml0IHlvdXIgZHJpdmVyL211ZGxpYiwgcGxlYXNlIGNvbW1lbnQgaXQgc28gcGVvcGxlCit3aWxsIGtub3cuICBJbiBhZGRpdGlvbiwgaGF2aW5nIHRoZSBjb21tZW50cyBzaWRlLWJ5LXNpZGUgYWxsb3dzIHBlb3BsZSB0bworc2VlIG90aGVyIGlkZWFzLCBsaWtlIGhvdyBhbm90aGVyIGRyaXZlciBtaWdodCBoYW5kbGUgc29tZXRoaW5nLgorCisKK0kgd2FudCB0byBwbGVhc2Ugbm90ZSBhZ2FpbiwgeW91IG1heSBkaXNwbGF5IHRoaXMgb24geW91ciBtdWQgKGxpa2UgaW4gL2RvYykuIAorWW91IGRvIG5vdCBuZWVkIHRvCittYWlsIG1lIGZvciBwZXJtaXNzaW9uLiAgSSB3b3VsZCBub3QgbWluZCBlbWFpbCwgc2luY2UgaXQgaXMgbmljZSB0byBrbm93CitwZW9wbGUgYXJlIHVzaW5nIGl0LCBidXQgdGhhdCBpcyBub3QgcmVxdWlyZWQuICBBbHNvLCBpZiB5b3UgcmVhbGx5IGZlZWwgSSBoYXZlCitkb25lIHN1Y2ggYSB3b25kZXJmdWwgam9iIHRoYXQgeW91IHNob3VsZCBwYXkgbW9uZXkgdG8gdXNlIHRoaXMsIHRoZW4gZ2l2ZQorJDUgdG8geW91ciBsb2NhbCBBU1BDQSAob3IgaW50ZXJuYXRpb25hbCBlcXVpdmFsZW50KS4KKworU2VlIHRoZSBmaWxlIHRpdGxlZCBDb250ZW50cyBmb3IgYSBmdWxsIGxpc3Qgb2YgdGV4dGJvb2sgY2hhcHRlcnMuCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjEgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0NTljZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMQpAQCAtMCwwICsxLDE0MyBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVybWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFwdGVyIDE6IEludHJvZHVjdGlvbgorCisxLjEgTFBDIEJhc2ljcworQW55b25lIHJlYWRpbmcgdGhpcyB0ZXh0Ym9vayBzaG91bGQgZWl0aGVyIGhhdmUgcmVhZCB0aGUgdGV4dGJvb2sgTFBDCitCYXNpY3Mgb3IgYmUgZmFtaWxpYXIgZW5vdWdoIHdpdGggbXVkIHJlYWxtIGNvZGluZyBzdWNoIHRoYXQgbm90IG9ubHkgYXJlCit0aGV5IGNhcGFibGUgb2YgYnVpbGRpbmcgcm9vbXMgYW5kIG90aGVyIHN1Y2ggb2JqZWN0cyBpbnZvbHZlZCBpbiBhcmVhCitjb2RpbmcsIGJ1dCB0aGV5IGFsc28gaGF2ZSBhIGdvb2QgaWRlYSBvZiB3aGF0IGlzIGdvaW5nIG9uIHdoZW4gdGhlIGNvZGUKK3RoZXkgd3JpdGUgaXMgZXhlY3V0aW5nLiAgSWYgeW91IGRvIG5vdCBmZWVsIHlvdSBhcmUgYXQgdGhpcyBwb2ludCwgdGhlbiBnbworYmFjayBhbmQgcmVhZCBMUEMgQmFzaWNzIGJlZm9yZSBjb250aW51aW5nLiAgSWYgeW91IGRvIHNvLCB5b3Ugd2lsbCBmaW5kCit0aGF0IHdoYXQgeW91IHJlYWQgaGVyZSB3aWxsIGJlIG11Y2ggbW9yZSBtZWFuaW5nZnVsIHRvIHlvdS4KKworMS4yIEdvYWxzIG9mIFRoaXMgVGV4dGJvb2sKK1RoZSBpbnRyb2R1Y3RvcnkgdGV4dGJvb2sgd2FzIG1lYW50IHRvIHRha2UgcGVvcGxlIG5ldyB0byBMUEMgZnJvbQora25vd2luZyBub3RoaW5nIHRvIGJlaW5nIGFibGUgdG8gY29kZSBhIG5pY2UgcmVhbG0gb24gYW55IExQTXVkLiAgVGhlcmUKK2lzIG5hdHVyYWxseSBtdWNoIG1vcmUgdG8gTFBDIGFuZCB0byBMUE11ZCBidWlsZGluZywgaG93ZXZlciwgdGhhbgorYnVpbGRpbmcgcm9vbXMsIGFybW91cnMsIG1vbnN0ZXJzLCBhbmQgd2VhcG9ucy4gIEFzIHlvdSBnZXQgaW50byBtb3JlCitjb21wbGljYXRlZCBjb25jZXB0cyBsaWtlIGd1aWxkcywgb3IgZGVzaXJlIHRvIGRvIG1vcmUgaW52b2x2ZWQgdGhpbmdzIHdpdGgKK3lvdXIgcmVhbG0sIHlvdSB3aWxsIGZpbmQgdGhlIGNvbmNlcHRzIGRldGFpbGVkIGluIExQQyBCYXNpY3MgdG8gYmUgbGFja2luZworaW4gc3VwcG9ydCBmb3IgdGhlc2UgcHJvamVjdHMuICBJbnRlcm1lZGlhdGUgTFBDIGlzIGRlc2lnbmVkIHRvIHRha2UgeW91CitiZXlvbmQgdGhlIHNpbXBsZSByZWFsbSBidWlsZGluZyBwcm9jZXNzIGludG8gYSBmdWxsIGtub3dsZWRnZSBvZiBMUEMgZm9yCitmdW5jdGlvbmluZyBhcyBhIHJlYWxtIGJ1aWxkZXIgb24gYW4gTFBNdWQuICBUaGUgdGFzayBvZiBtdWRsaWIgYnVpbGRpbmcKK2l0c2VsZiBpcyBsZWZ0IHRvIGEgbGF0ZXIgdGV4dC4gIEFmdGVyIHJlYWRpbmcgdGhpcyB0ZXh0Ym9vayBhbmQgd29ya2luZyB0aHJvdWdoCitpdCBieSBleHBlcmltZW50aW5nIHdpdGggYWN0dWFsIGNvZGUsIHRoZSByZWFkZXIgc2hvdWxkIGJlIGFibGUgdG8gY29kZSBnYW1lCitvYmplY3RzIHRvIGZpdCBhbnkgZGVzaWduIG9yIGlkZWEgdGhleSBoYXZlIGluIG1pbmQsIHNvIGxvbmcgYXMgSSBoYXZlIGJlZW4KK3N1Y2Nlc3NmdWwuCisKKzEuMyBBbiBPdmVydmlldworV2hhdCBtb3JlIGlzIHRoZXJlPyAgV2VsbCBtYW55IG9mIHlvdSBhcmUgcXVpdGUgYXdhcmUgdGhhdCBMUEMgc3VwcG9ydHMKK21hcHBpbmdzIGFuZCBhcnJheXMgYW5kIGhhdmUgYmVlbiBhc2tpbmcgbWUgd2h5IHRob3NlIHdlcmUgbm90IGRldGFpbGVkCitpbiBMUEMgQmFzaWNzLiAgSSBmZWx0IHRoYXQgdGhvc2UgY29uY2VwdHMgd2VyZSBiZXlvbmQgdGhlIHNjb3BlIG9mIHdoYXQgSQord2FzIHRyeWluZyB0byBkbyB3aXRoIHRoYXQgdGV4dGJvb2sgYW5kIHdlcmUgbW9yZSBmaXR0aW5nIHRvIHRoaXMgdGV4dGJvb2suIAorQnV0IG5ldyB0b29scyBhcmUgYWxsIGZpbmUgYW5kIGRhbmR5LCB3aGF0IG1hdHRlcnMsIGhvd2V2ZXIsIGlzIHdoYXQgeW91CitjYW4gZG8gd2l0aCB0aG9zZSB0b29scy4gIFRoZSBnb2FsIG9mIExQQyBCYXNpY3Mgd2FzIHRvIGdldCB5b3UgdG8gYnVpbGRpbmcKK3F1YWxpdHkgTFBNdWQgcmVhbG1zLiAgTWFwcGluZ3MgYW5kIGFycmF5cyBhcmUgbm90IG5lY2Vzc2FyeSB0byBkbyB0aGF0LiAKK1RoZSBnb2FsIG9mIHRoaXMgYm9vayBpcyB0byBhbGxvdyB5b3UgdG8gY29kZSBhbnkgaWRlYSB5b3UgbWlnaHQgd2FudCB0bworY29kZSBpbiB5b3VyIGFyZWEuICBUaGF0IGFiaWxpdHkgcmVxdWlyZXMgdGhlIGtub3dsZWRnZSBvZiBtYXBwaW5ncyBhbmQKK2FycmF5cy4KKworQW55IGlkZWEgeW91IHdhbnQgdG8gY29kZSBpbiBhbiBMUE11ZCBpcyBwb3NzaWJsZS4gIExQQyBpcyBhIGxhbmd1YWdlCit3aGljaCBpcyBhbWF6aW5nbHkgd2VsbCBzdWl0ZWQgdG8gdGhpcyB0YXNrLiAgQWxsIHRoYXQgcHJldmVudHMgeW91IGZyb20KK2NvZGluZyB5b3VyIGlkZWFzIGlzIHlvdXIga25vd2xlZGdlIG9mIExQQyBvciBhbiBpbmFkZXF1YXRlIG11ZGxpYiBvcgoreW91ciBtdWTVcyB0aGVtZSBvciBhZG1pbmlzdHJhdGl2ZSBwb2xpY2llcy4gIFRoaXMgdGV4dGJvb2sgY2Fubm90IG1ha2UKK3RoZSBtdWRsaWIgeW91IGFyZSB3b3JraW5nIHdpdGggYW55IGJldHRlciwgYW5kIGl0IGNhbm5vdCBjaGFuZ2UgdGhlIG11ZAordGhlbWUgb3IgdGhlIG11ZNVzIGFkbWluaXN0cmF0aXZlIHBvbGljaWVzLiAgTmV2ZXIgb25jZSB0aGluayB0aGF0IExQQyBpcworaW5jYXBhYmxlIG9mIGRvaW5nIHdoYXQgeW91IHdhbnQgdG8gZG8uICBJZiB5b3VyIGlkZWEgaXMgcHJldmVudGVkIGJ5CithZG1pbmlzdHJhdGl2ZSBwb2xpY2llcyBvciB0aGVtZXMsIHRoZW4gaXQgaXMgc2ltcGx5IG5vdCBhbiBpZGVhIGZvciB5b3VyCitjdXJyZW50IG11ZC4gIElmIHRoZSBtdWRsaWIgaXMgaW5hZGVxdWF0ZSwgdGFsayB0byB0aGUgcGVvcGxlIGluIGNoYXJnZSBvZgoreW91ciBtdWRsaWIgYWJvdXQgd2hhdCBjYW4gYmUgZG9uZSBhdCB0aGUgbXVkbGliIGxldmVsIHRvIGZhY2lsaXRhdGUgaXQuICBZb3UKK3dvdWxkIGJlIHN1cnByaXNlZCBieSB3aGF0IGlzIGFjdHVhbGx5IGluIHRoZSBtdWRsaWIgeW91IGRpZCBub3Qga25vdworYWJvdXQuICBNb3JlIGltcG9ydGFudCwgYWZ0ZXIgcmVhZGluZyB0aGlzIHRleHRib29rLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8KK3JlYWQgYWxsIG9mIHRoZSBtdWRsaWIgY29kZSBpbiB5b3VyIG11ZNVzIG11ZGxpYiBhbmQgdW5kZXJzdGFuZCB3aGF0IGlzCitnb2luZyBvbiBhdCBlYWNoIGxpbmUgaW4gdGhlIG11ZGxpYiBjb2RlLiAgWW91IG1heSBub3QgYXMgeWV0IGJlIGFibGUgdG8KK3JlcHJvZHVjZSB0aGF0IGNvZGUgb24geW91ciBvd24sIGJ1dCBhdCBsZWFzdCB5b3UgY2FuIHVuZGVyc3RhbmQgd2hhdCBpcworZ29pbmcgb24gYXQgdGhlIG11ZGxpYiBsZXZlbC4KKworVGhpcyB0ZXh0Ym9vayBzdGFydHMgb3V0IHdpdGggYSBkaXNjdXNzaW9uIGFib3V0IHdoYXQgdGhlIExQTXVkIGRyaXZlciBpcworZG9pbmcuICBPbmUgbmljZSB0aGluZyBhYm91dCB0aGlzIHRleHRib29rLCBpbiBnZW5lcmFsIGl0IGlzIGNvbXBsZXRlbHkgZHJpdmVyCithbmQgbXVkbGliIGluZGVwZW5kZW50IChleGNlcHRpbmcgZm9yIHRoZSBEd29ya2luIEdhbWUgRHJpdmVyKS4gIFRoZQorY2hhcHRlciBvbiB0aGUgZ2FtZSBkcml2ZXIgZG9lcyBub3QgZ2V0IGludG8gYWN0dWFsIGltcGxlbWVudGF0aW9uLCBidXQKK2luc3RlYWQgZGVhbHMgd2l0aCB3aGF0IGFsbCBnYW1lIGRyaXZlcnMgYmFzaWNhbGx5IGRvIGluIG9yZGVyIHRvIHJ1biB0aGUKK211ZC4KKworTmV4dCBJIGRpc2N1c3MgdGhvc2UgbWFnaWMgdG9waWNzIGV2ZXJ5b25lIHdhbnRzIHRvIGtub3cgbW9yZSBhYm91dCwKK2FycmF5cyBhbmQgbWFwcGluZ3MuICBNYXBwaW5ncyBtYXkgYmUgc2ltdWx0YW5lb3VzbHkgdGhlIGVhc2llc3QgYW5kCittb3N0IGRpZmZpY3VsdCBkYXRhIHR5cGUgdG8gdW5kZXJzdGFuZC4gIFNpbmNlIHRoZXkgYXJlIHNvcnQgb2YgY29tcGxleCBhcnJheXMKK2luIGEgbG9vc2Ugc2Vuc2UsIHlvdSByZWFsbHkgbmVlZCB0byB1bmRlcnN0YW5kIGFycmF5cyBiZWZvcmUgZGlzY3Vzc2luZwordGhlbS4gIEFsbCB0aGUgc2FtZSwgb25jZSB5b3UgdW5kZXJzdGFuZCB0aGVtLCB0aGV5IGFyZSBtdWNoIGVhc2llciB0aGFuCithcnJheXMgdG8gdXNlIGluIHJlYWwgc2l0dWF0aW9ucy4gIEF0IGFueSByYXRlLCBzcGVuZCBtb3N0IG9mIHlvdXIgdGltZQord29ya2luZyB3aXRoIHRoYXQgY2hhcHRlciwgYmVjYXVzZSBpdCBpcyBwcm9iYWJseSB0aGUgbW9zdCBkaWZmaWN1bHQsIHlldCBtb3N0Cit1c2VmdWwgY2hhcHRlciBpbiB0aGUgYm9vay4KKworQWZ0ZXIgdGhhdCBmb2xsb3dzIGEgYnJpZWYgY2hhcHRlciBvbiB0aGUgTFBDIHByZS1jb21waWxlciwgYSB0b29sIHlvdSBjYW4KK3VzZSBmb3Igc29ydGluZyBvdXQgaG93IHlvdXIgY29kZSB3aWxsIGxvb2sgYmVmb3JlIGl0IGdldHMgc2VudCB0byB0aGUKK2NvbXBpbGVyLiAgRGVzcGl0ZSBteSBob3JyaWQgaW50cm8gdG8gaXQgaGVyZSwgdGhpcyBjaGFwdGVyIGlzIHBlcmhhcHMgdGhlCitlYXNpZXN0IGNoYXB0ZXIgaW4gdGhlIHRleHRib29rLiAgSSBwdXQgaXQgYWZ0ZXIgdGhlIG1hcHBpbmdzIGFuZCBhcnJheXMKK2NoYXB0ZXIgZm9yIGV4YWN0bHkgdGhhdCByZWFzb24uCisKK1N0cmluZ3MgYXJlIHJlLWludHJvZHVjZWQgbmV4dCwgZ29pbmcgaW50byBtb3JlIGRldGFpbCB3aXRoIGhvdyB5b3UgY2FuIGRvCitzdWNoIHRoaW5ncyBhcyBhZHZhbmNlZCBjb21tYW5kIGhhbmRsaW5nIGJ5IGJyZWFraW5nIHVwIHN0cmluZ3MuICBPbmNlCit5b3UgdW5kZXJzdGFuZCBhcnJheXMgZmFpcmx5IHdlbGwsIHRoaXMgY2hhcHRlciBzaG91bGQgYmUgcmVhbGx5IHNpbXBsZS4KKworVGhlIG5leHQgY2hhcHRlciBpcyB0aGUgc2Vjb25kIG1vc3QgaW1wb3J0YW50IGluIHRoZSBib29rLiAgSXQgbWF5IGJlIHRoZQorbW9zdCBpbXBvcnRhbnQgaWYgeW91IGV2ZXIgaW50ZW5kIHRvIGdvIGJleW9uZCB0aGUgaW50ZXJtZWRpYXRlIHN0YWdlIGFuZAorZGl2ZSBpbnRvIG11ZGxpYiBjb2RpbmcuICBUaGF0IGNoYXB0ZXIgaW52b2x2ZXMgdGhlIGNvbXBsZXggaWRlYXMgYmVoaW5kCitMUEMgaW5oZXJpdGFuY2UuICBTaW5jZSB0aGUgZ29hbCBvZiB0aGlzIHRleHRib29rIGlzIG5vdCB0byB0ZWFjaCBtdWRsaWIKK3Byb2dyYW1taW5nLCB0aGUgY2hhcHRlciBpcyBub3QgYSBkZXRhaWxlZCBkaXNjdXNzaW9uIG9uIG9iamVjdCBvcmllbnRlZAorcHJvZ3JhbW1pbmcuICBVbmRlcnN0YW5kaW5nIHRoaXMgY2hhcHRlciwgaG93ZXZlciwgd2lsbCBnaXZlIHlvdSBzb21lCitnb29kIGluc2lnaHRzIGludG8gd2hhdCBpcyBpbnZvbHZlZCB3aXRoIG9iamVjdCBvcmllbnRlZCBwcm9ncmFtbWluZywgYXMKK3dlbGwgYXMgYWxsb3cgeW91IHRvIGJ1aWxkIG1vcmUgY29tcGxleCBvYmplY3RzIGJ5IG92ZXJyaWRpbmcgZnVuY3Rpb25zCithbmQgZGVmaW5pbmcgeW91ciBvd24gYmFzZSBjbGFzc2VzLgorCitGaW5hbGx5LCB0aGUgdGV4dGJvb2sgZW5kcyB3aXRoIGEgc2ltcGxlIGRpc2N1c3Npb24gb2YgY29kZSBkZWJ1Z2dpbmcuIAorVGhpcyBpcyBub3QgYW4gZXNzZW50aWFsIGNoYXB0ZXIsIGJ1dCBpbnN0ZWFkIGl0IGlzIG1lYW50IGFzIG1vcmUgb2YgYW4KK2F1eGlsaWFyeSBzdXBwbGVtZW50IHRvIHdoYXQgdGhlIGtub3dsZWRnZSB5b3UgaGF2ZSBhY2N1bXVsYXRlZCBzbyBmYXIuCisKKzEuNCBOb3QgQXBwZWFyaW5nIGluIFRoaXMgVGV4dGJvb2sKK1BlcmhhcHMgd2hhdCBtaWdodCBhcHBlYXIgdG8gc29tZSBhcyB0aGUgbW9zdCBnbGFyaW5nIG9taXNzaW9uIG9mIHRoaXMKK3RleHRib29rIGlzIGxhcmdlbHkgYSBwb2xpdGljYWwgb21pc3Npb24sIHNoYWRvd3MuICBOZXZlciBoYXZlIEkgZXZlcgorZW5jb3VudGVyZWQgYW4gZXhhbXBsZSBvZiB3aGVyZSBhIHNoYWRvdyB3YXMgZWl0aGVyIHRoZSBiZXN0IG9yIG1vc3QKK2VmZmVjaWVudCBtYW5uZXIgb2YgZG9pbmcgYW55dGhpbmcuICBJdCBkb2VzIG5vdCBmb2xsb3cgZnJvbSB0aGF0LCBob3dldmVyLAordGhhdCB0aGVyZSBhcmUgbm8gdXNlcyBmb3Igc2hhZG93cy4gIE15IHJlYXNvbmluZyBmb3Igb21pdHRpbmcgc2hhZG93cworZnJvbSB0aGlzIHRleHRib29rIGlzIHRoYXQgdGhlIGxlYXJuZXIgaXMgYmVzdCBzZXJ2ZWQgYnkgbGVhcm5pbmcgdGhlIGNvbmNlcHRzCitpbiB0aGlzIHRleHRib29rIGZpcnN0IGFuZCBoYXZpbmcgc3BlbnQgdGltZSB3aXRoIHRoZW0gYmVmb3JlIGRlYWxpbmcgd2l0aAordGhlIHN1YmplY3Qgb2Ygc2hhZG93cy4gIEluIHRoYXQgd2F5LCBJIGZlZWwgdGhlIHBlcnNvbiBsZWFybmluZyBMUEMgd2lsbCBiZQorYmV0dGVyIGNhcGFibGUgb2YganVkZ2luZyB0aGUgbWVyaXRzIG9mIHVzaW5nIGEgc2hhZG93IGRvd24gdGhlIHJvYWQuICBJCit3aWxsIGRpc2N1c3Mgc2hhZG93cyBpbiBhIGZ1dHVyZSB0ZXh0Ym9vay4KKworSWYgeW91IGFyZSBzb21lb25lIHdobyB1c2VzIHNoYWRvd3Mgc29tZSBvciBhIGxvdCwgcGxlYXNlIGRvIG5vdCB0YWtlIHRoZQorYWJvdmUgcGFyYWdyYXBoIGFzIGEgcGVyc29uYWwgYXR0YWNrLiAgVGhlcmUgbWF5IGJlIHNvbWUgcGVyZmVjdGx5IHZhbGlkCit1c2VzIGZvciBzaGFkb3dzIHNvbWV3aGVyZSB3aGljaCBJIGhhdmUgeWV0IHRvIGVuY291bnRlci4gIE5ldmVydGhlbGVzcywKK3RoZXkgYXJlIG5vdCB0aGUgaWRlYWwgd2F5IHRvIGFjY29tcGxpc2ggYW55IGdpdmVuIHRhc2ssIGFuZCB0aGVyZWZvcmUgdGhleQorYXJlIG5vdCBjb25zaWRlcmVkIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyB0ZXh0Ym9vayBhbiBpbnRlcm1lZGlhdGUgY29kaW5nCit0b29sLgorCitJIGhhdmUgYWxzbyBvbWl0dGVkIGRpc2N1c3Npb25zIG9mIHNlY3VyaXR5IGFuZCBvYmplY3Qgb3JpZW50ZWQKK3Byb2dyYW1taW5nLiAgQm90aCBhcmUgcXVpdGUgb2J2aW91c2x5IG11ZGxpYiBpc3N1ZXMuICBNYW55IHBlb3BsZSwKK2hvd2V2ZXIsIG1pZ2h0IHRha2UgZXhjZXB0aW9uIHdpdGggbXkgbGVhdmluZyBvdXQgYSBkaXNjdXNzaW9uIG9mIG9iamVjdAorb3JpZW50ZWQgcHJvZ3JhbW1pbmcuICBJIGNob3NlIHRvIGxlYXZlIHRoYXQgZm9yIGEgbGF0ZXIgdGV4dCwgc2luY2UgbW9zdCBhcmVhCitidWlsZGVycyBjb2RlIGZvciB0aGUgY3JlYXRpdml0eSwgbm90IGZvciB0aGUgY29tcHV0ZXIgc2NpZW5jZSB0aGVvcnkuICBJbiBib3RoCit0aGUgaW50ZXJtZWRpYXRlIGFuZCBiZWdpbm5lciB0ZXh0Ym9va3MsIEkgaGF2ZSBjaG9zZW4gb25seSB0byBkaXNjdXNzCit0aGVvcnkgd2hlcmUgaXQgaXMgZGlyZWN0bHkgYXBwbGljYWJsZSB0byBwcmFjdGljYWwgTFBDIHByb2dyYW1taW5nLiAgRm9yCitwZW9wbGUgd2hvIGFyZSBzdGFydGluZyBvdXQgZ3JlZW4gaW4gTFBDIGFuZCB3YW50IHRvIGNvZGUgdGhlIG5leHQgZ3JlYXQKK211ZGxpYiwgcGVyaGFwcyB0aGVvcnkgd291bGQgYmUgbW9yZSB1c2VmdWwuICBCdXQgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzCitib29rLCBhIGRpc2N1c3Npb24gb2Ygb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nIGlzIHNpbXBseSBhIHNub296ZXIuICBJCitkbyBwbGFuIHRvIGdldCBoZWF2eSBpbnRvIHRoZW9yeSB3aXRoIHRoZSBuZXh0IHRleHRib29rLgorCisxLjUgU3VtbWFyeQorTFBDIGlzIG5vdCBkaWZmaWN1bHQgdG8gbGVhcm4uICBJdCBpcyBhIGxhbmd1YWdlIHdoaWNoLCBhbHRob3VnaCBwYXRoZXRpYworY29tcGFyZWQgdG8gYW55IG90aGVyIGxhbmd1YWdlIGZvciBwZXJmb3JtaW5nIG1vc3QgY29tcHV0ZXIgbGFuZ3VhZ2UKK3Rhc2tzLCBpcyBpbmNyZWRpYmx5IHBvd2VyZnVsIGFuZCB1bmVxdWFsbGVkIGZvciB0aGUgdGFza3Mgb2YgYnVpbGRpbmcgYW4KK2FyZWEgaW4gTVVEIHR5cGUgZ2FtZXMuICBGb3IgdGhlIGJlZ2lubmVyLCBpdCBhbGxvd3MgeW91IHRvIGVhc2lseSBqdW1wIGluCithbmQgY29kZSB1c2VmdWwgb2JqZWN0cyB3aXRob3V0IGV2ZW4ga25vd2luZyB3aGF0IHlvdSBhcmUgZG9pbmcuICBGb3IgdGhlCitpbnRlcm1lZGlhdGUgcGVyc29uLCBpdCBhbGxvd3MgeW91IHRvIHR1cm4gYW55IGlkZWEgeW91IGhhdmUgaW50byB0ZXh0dWFsCit2aXJ0dWFsIHJlYWxpdHkuICBBbmQgZm9yIHRoZSBhZHZhbmNlZCBwZXJzb24sIGl01XMgb2JqZWN0IG9yaWVudGVkIGZlYXR1cmVzCitjYW4gYWxsb3cgeW91IHRvIGJ1aWxkIG9uZSBvZiB0aGUgbW9zdCBwb3B1bGFyIGdhbWVzIG9uIHRoZSBpbnRlcm5ldC4gIFdoYXQKK3lvdSBjYW4gZG8gaXMgc2ltcGx5IGxpbWl0ZWQgYnkgaG93IG11Y2ggeW91IGtub3cuICBBbmQgbGVhcm5pbmcgbW9yZQorZG9lcyBub3QgcmVxdWlyZSBhIGNvbXB1dGVyIHNjaWVuY2UgZGVncmVlLgorCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjIgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhNGMzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMgpAQCAtMCwwICsxLDIyMyBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVybWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBDaGFwdGVyIDI6IFRoZSBMUE11ZCBEcml2ZXIKKworMi4xIFJldmlldyBvZiBCYXNpYyBEcml2ZXIvTXVkbGliIEludGVyYWN0aW9uCitJbiB0aGUgTFBDIEJhc2ljcyB0ZXh0Ym9vaywgeW91IGxlYXJuZWQgYSBsb3QgYWJvdXQgdGhlIHdheSB0aGUgbXVkbGliCit3b3Jrcywgc3BlY2lmaWNhbGx5IGluIHJlbGF0aW9uIHRvIG9iamVjdHMgeW91IGNvZGUgaW4gb3JkZXIgdG8gYnVpbGQgeW91cgorcmVhbG0uICBOb3QgbXVjaCB3YXMgZGlzY3Vzc2VkIGFib3V0IHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZQorbXVkbGliIGFuZCB0aGUgZHJpdmVyLiAgWW91IHNob3VsZCBrbm93LCBob3dldmVyLCB0aGF0IHRoZSBkcml2ZXIKK2RvZXMgdGhlIGZvbGxvd2luZzoKKzEpIFdoZW4gYW4gb2JqZWN0IGlzIGZpcnN0IGxvYWRlZCBpbnRvIG1lbW9yeSwgdGhlIGRyaXZlciB3aWxsIGNhbGwKK2NyZWF0ZSgpIGluIG5hdGl2ZSBtdWRzIGFuZCByZXNldCgpIGluIGNvbXBhdCBtdWRzLiAgQSBjcmVhdG9yCit1c2VzIGNyZWF0ZSgpIG9yIHJlc2V0KCkgdG8gZ2l2ZSBpbml0aWFsIHZhbHVlcyB0byB0aGUgb2JqZWN0LgorMikgQXQgYW4gaW50ZXJ2YWwgc2V0dXAgYnkgdGhlIGdhbWUgYWRtaW5pc3RyYXRvciwgdGhlIGRyaXZlciBjYWxscyB0aGUKK2Z1bmN0aW9uIHJlc2V0KCkuICBUaGlzIGFsbG93cyB0aGUgb2JqZWN0IHRvIHJlZ2VuZXJhdGUgbW9uc3RlcnMgYW5kCitzdWNoLiAgTm90aWNlIHRoYXQgaW4gYSBjb21wYXQgbXVkLCB0aGUgc2FtZSBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB1cAoraW5pdGlhbCB2YWx1ZXMgYXMgaXMgdXNlZCB0byByZXNldCB0aGUgcm9vbS4KKzMpIEFueSB0aW1lIGEgbGl2aW5nIG9iamVjdCBjb21lcyBpbiBjb250YWN0IHdpdGggYW4gb2JqZWN0IG9mIGFueSBzb3J0LAordGhlIGRyaXZlciBjYWxscyBpbml0KCkgaW4gdGhlIG5ld2x5IGVuY291bnRlcmVkIG9iamVjdC4gIFRoaXMgYWxsb3dzCituZXdseSBlbmNvdW50ZXJlZCBvYmplY3RzIHRvIGdpdmUgbGl2aW5nIG9iamVjdHMgY29tbWFuZHMgdG8gZXhlY3V0ZQordGhyb3VnaCB0aGUgYWRkX2FjdGlvbigpIGVmdW4sIGFzIHdlbGwgYXMgcGVyZm9ybSBvdGhlciBhY3Rpb25zIHdoaWNoCitzaG91bGQgaGFwcGVuIHdoZW5ldmVyIGEgbGl2aW5nIHRoaW5nIGVuY291bnRlcnMgYSBnaXZlbiBvYmplY3QuCis0KSBUaGUgZHJpdmVyIGRlZmluZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGtub3duIGFzIGVmdW5zIHdoaWNoIGFyZQorYXZhaWxhYmxlIHRvIGFsbCBvYmplY3RzIGluIHRoZSBnYW1lLiAgRXhhbXBsZXMgb2YgY29tbW9ubHkgdXNlZCBlZnVucworYXJlOiB0aGlzX3BsYXllcigpLCB0aGlzX29iamVjdCgpLCB3cml0ZSgpLCBzYXkoKSwgZXRjLgorCisyLjIgVGhlIERyaXZlciBDeWNsZQorVGhlIGRyaXZlciBpcyBhIEMgcHJvZ3JhbSB3aGljaCBydW5zIHRoZSBnYW1lLiAgSXRzIGJhc2ljIGZ1bmN0aW9ucyBhcmUKK3RvIGFjY2VwdCBjb25uZWN0aW9ucyBmcm9tIHRoZSBvdXRzaWRlIHdvcmxkIHNvIHBlb3BsZSBjYW4gbG9naW4sCitpbnRlcnByZXQgdGhlIExQQyBjb2RlIHdoaWNoIGRlZmluZXMgTFBDIG9iamVjdHMgYW5kIGhvdyB0aGV5CitmdW5jdGlvbiBpbiB0aGUgZ2FtZSwgYW5kIGFjY2VwdCB1c2VyIGlucHV0IGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSBMUEMKK2Z1bmN0aW9ucyB3aGljaCBtYXRjaCB0aGUgZXZlbnQuICBJbiBpdHMgbW9zdCBzaW1wbGVzdCBlc3NlbmNlLCBpdCBpcyBhbgordW5lbmRpbmcgbG9vcC4KKworT25jZSB0aGUgZ2FtZSBoYXMgYm9vdGVkIHVwIGFuZCBpcyBwcm9wZXJseSBmdW5jdGlvbmluZyAodGhlIGJvb3QgdXAKK3Byb2Nlc3Mgd2lsbCBiZSBkaXNjdXNzZWQgaW4gYSBmdXR1cmUsIGFkdmFuY2VkIExQQyB0ZXh0Ym9vayksIHRoZQorZHJpdmVyIGVudGVycyBhIGxvb3Agd2hpY2ggZG9lcyBub3QgdGVybWluYXRlIHVudGlsIHRoZSBzaHV0ZG93bigpIGVmdW4KK2lzIGxlZ2FsbHkgY2FsbGVkIG9yIGEgYnVnIGNhdXNlcyB0aGUgZHJpdmVyIHByb2dyYW0gdG8gY3Jhc2guICBGaXJzdCBvZmYsCit0aGUgZHJpdmVyIGhhbmRsZXMgYW55IG5ldyBpbmNvbWluZyBjb25uZWN0aW9ucyBhbmQgcGFzc2VzIGNvbnRyb2wgb2YKK3RoZSBjb25uZWN0aW9uIHRvIGEgbG9naW4gb2JqZWN0LiAgQWZ0ZXIgdGhhdCwgdGhlIGRyaXZlciBwdXRzIHRvZ2V0aGVyIGEKK3RhYmxlIG9mIGNvbW1hbmRzIHdoaWNoIGhhdmUgYmVlbiBlbnRlcmVkIGJ5IHVzZXJzIHNpbmNlIHRoZSBsYXN0IGN5Y2xlCitvZiB0aGUgZHJpdmVyLiAgQWZ0ZXIgdGhlIGNvbW1hbmQgdGFibGUgaXMgYXNzZW1ibGVkLCBhbGwgbWVzc2FnZXMKK3NjaGVkdWxlZCB0byBiZSBzZW50IHRvIHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIGxhc3QgZHJpdmVyIGN5Y2xlIGFyZSBzZW50CitvdXQgdG8gdGhlIHVzZXIuICBBdCB0aGlzIHBvaW50LCB0aGUgZHJpdmVyIGdvZXMgdGhyb3VnaCB0aGUgdGFibGUgb2YKK2NvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIGFuZCBleGVjdXRlcyBlYWNoIHNldCBvZiBjb21tYW5kcyBlYWNoCitvYmplY3QgaGFzIHN0b3JlZCB0aGVyZS4gIFRoZSBkcml2ZXIgZW5kcyBpdHMgY3ljbGUgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24KK2hlYXJ0X2JlYXQoKSBpbiBldmVyeSBvYmplY3Qgd2l0aCBhIGhlYXJ0X2JlYXQoKSBzZXQgYW5kIGZpbmFsbHkKK3BlcmZvcm1pbmcgYWxsIHBlbmRpbmcgY2FsbCBvdXRzLiAgVGhpcyBjaGFwdGVyIHdpbGwgbm90IGRlYWwgd2l0aCB0aGUKK2hhbmRsaW5nIG9mIGNvbm5lY3Rpb25zLCBidXQgaW5zdGVhZCB3aWxsIGZvY3VzIG9uIGhvdyB0aGUgZHJpdmVyCitoYW5kbGVzIHVzZXIgY29tbWFuZHMgYW5kIGhlYXJ0YmVhdHMgYW5kIGNhbGwgb3V0cy4KKworMi4zIFVzZXIgQ29tbWFuZHMKK0FzIG5vdGVkIGluIHNlY3Rpb24gMS4yLCB0aGUgZHJpdmVyIHN0b3JlcyBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGVhY2gKK3VzZXIgdG8gYmUgZXhlY3V0ZWQgZWFjaCBjeWNsZS4gIFRoZSBjb21tYW5kcyBsaXN0IGhhcyB0aGUgbmFtZSBvZiB0aGUKK2xpdmluZyBvYmplY3QgcGVyZm9ybWluZyB0aGUgY29tbWFuZCwgdGhlIG9iamVjdCB3aGljaCBnYXZlIHRoZSBsaXZpbmcKK29iamVjdCB0aGF0IGNvbW1hbmQsIGFuZCB0aGUgZnVuY3Rpb24gd2hpY2ggaXMgdG8gYmUgZXhlY3V0ZWQgaW4gb3JkZXIKK3RvIHBlcmZvcm0gdGhlIGNvbW1hbmQuICBUaGUgZHJpdmVyIHJlZmVycyB0byB0aGUgb2JqZWN0IHdoaWNoIHR5cGVkIGluCit0aGUgY29tbWFuZCBhcyB0aGUgY29tbWFuZCBnaXZlci4gIEl0IGlzIHRoZSBjb21tYW5kIGdpdmVyIHdoaWNoCitnZXRzIHJldHVybmVkIGFzIHRoaXNfcGxheWVyKCkgaW4gbW9zdCBjYXNlcy4KKworVGhlIGRyaXZlciBzdGFydHMgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdCBvZiBsaXZpbmcgb2JqZWN0cyB3aXRoIHBlbmRpbmcKK2NvbW1hbmRzLCBhbmQgc3VjY2Vzc2l2ZWx5IHBlcmZvcm1zIGVhY2ggY29tbWFuZCBpdCB0eXBlZCBieSBjYWxsaW5nCit0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21tYW5kIGFuZCBwYXNzaW5nIGFueSBhcmd1bWVudHMKK3RoZSBjb21tYW5kIGdpdmVyIGdhdmUgYXMgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi4gIEFzIHRoZSBkcml2ZXIKK3N0YXJ0cyB3aXRoIHRoZSBjb21tYW5kcyBpc3N1ZWQgYnkgYSBuZXcgbGl2aW5nIG9iamVjdCwgdGhlIGNvbW1hbmQKK2dpdmVyIHZhcmlhYmxlIGlzIGNoYW5nZWQgdG8gYmUgZXF1YWwgdG8gdGhlIG5ldyBsaXZpbmcgb2JqZWN0LCBzbyB0aGF0CitkdXJpbmcgdGhlIHNlcXVlbmNlIG9mIGZ1bmN0aW9ucyBpbml0aWF0ZWQgYnkgdGhhdCBjb21tYW5kLCB0aGUgZWZ1bgordGhpc19wbGF5ZXIoKSByZXR1cm5zIHRoZSBvYmplY3Qgd2hpY2ggaXNzdWVkIHRoZSBjb21tYW5kLgorCitMZXQncyBsb29rIGF0IHRoZSBjb21tYW5kIGJ1ZmZlciBmb3IgYW4gZXhhbXBsZSBwbGF5ZXIuICBTaW5jZSB0aGUKK2V4ZWN1dGlvbiBvZiBoaXMgbGFzdCBjb21tYW5kLCBCb3pvIGhhcyB0eXBlZCAibm9ydGgiIGFuZCAidGVsbAorZGVzY2FydGVzIHdoZW4gaXMgdGhlIG5leHQgcmVib290Ii4gIFRoZSBjb21tYW5kICJub3J0aCIgaXMgYXNzb2NpYXRlZAord2l0aCB0aGUgZnVuY3Rpb24gIkRvX01vdmUoKSIgaW4gdGhlIHJvb20gQm96byBpcyBpbiAodGhlIGNvbW1hbmQKKyJub3J0aCIgaXMgYXV0b21hdGljYWxseSBzZXR1cCBieSB0aGUgc2V0X2V4aXRzKCkgZWZ1biBpbiB0aGF0IHJvb20pLiAgVGhlCitjb21tYW5kICJ0ZWxsIiBpcyBub3Qgc3BlY2lmaWNhbGx5IGxpc3RlZCBhcyBhIGNvbW1hbmQgZm9yIHRoZSBwbGF5ZXIsCitob3dldmVyLCBpbiB0aGUgcGxheWVyIG9iamVjdCB0aGVyZSBpcyBhIGZ1bmN0aW9uIGNhbGxlZCAiY21kX2hvb2soKSIKK3doaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWFuZCAiIiwgd2hpY2ggbWF0Y2hlcyBhbnkgcG9zc2libGUKK3VzZXIgaW5wdXQuCisKK09uY2UgdGhlIGRyaXZlciBnZXRzIGRvd24gdG8gQm96bywgdGhlIGNvbW1hbmQgZ2l2ZXIgdmFyaWFibGUgaXMgc2V0IHRvCit0aGUgb2JqZWN0IHdoaWNoIGlzIEJvem8uICBUaGVuLCBzZWVpbmcgQm96byB0eXBlZCAibm9ydGgiIGFuZCB0aGUKK2Z1bmN0aW9uICJub3J0aCIgaXMgYXNzb2NpYXRlZCB3aXRoLCB0aGUgZHJpdmVyIGNhbGxzIEJvem8nc19Sb29tLQorPkRvX01vdmUoMCkuICBBbiBhcmd1bWVudCBvZiAwIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gc2luY2UgQm96bworb25seSB0eXBlZCB0aGUgY29tbWFuZCAibm9ydGgiIHdpdGggbm8gYXJndW1lbnRzLiAgVGhlIHJvb20KK25hdHVyYWxseSBjYWxscyBzb21lIGZ1bmN0aW9ucyBpdCBuZWVkcywgYWxsIHRoZSB3aGlsZSBzdWNoIHRoYXQgdGhlIGVmdW4KK3RoaXNfcGxheWVyKCkgcmV0dXJucyB0aGUgb2JqZWN0IHdoaWNoIGlzIEJvem8uICBFdmVudHVhbGx5LCB0aGUgcm9vbQorb2JqZWN0IHdpbGwgY2FsbCBtb3ZlX3BsYXllcigpIGluIEJvem8sIHdoaWNoIGluIHR1cm4gY2FsbHMgdGhlCittb3ZlX29iamVjdCgpIGVmdW4uICBUaGlzIGVmdW4gaXMgcmVzcG9uc2libGUgZm9yIGNoYW5naW5nIGFuIG9iamVjdCdzCitlbnZpcm9ubWVudC4KKworV2hlbiB0aGUgZW52aXJvbm1lbnQgb2YgYW4gb2JqZWN0IGNoYW5nZXMsIHRoZSBjb21tYW5kcyBhdmFpbGFibGUgdG8KK2l0IGZyb20gb2JqZWN0cyBpbiBpdHMgcHJldmlvdXMgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyBmcm9tIGl0cyBwcmV2aW91cworZW52aXJvbm1lbnQgYXJlIHJlbW92ZWQgZnJvbSB0aGUgb2JqZWN0LiAgT25jZSB0aGF0IGlzIGRvbmUsIHRoZSBkcml2ZXIKK2NhbGxzIHRoZSBlZnVuIGluaXQoKSBpbiB0aGUgbmV3IGVudmlyb25tZW50IGFzIHdlbGwgYXMgaW4gZWFjaCBvYmplY3QgaW4KK3RoZSBuZXcgZW52aXJvbm1lbnQuICBEdXJpbmcgZWFjaCBvZiB0aGVzZSBjYWxscyB0byBpbml0KCksIHRoZSBvYmplY3QKK0Jvem8gaXMgc3RpbGwgdGhlIGNvbW1hbmQgZ2l2ZXIuICBUaHVzIGFsbCBhZGRfYWN0aW9uKCkgZWZ1bnMgZnJvbSB0aGlzCittb3ZlIHdpbGwgYXBwbHkgdG8gQm96by4gIE9uY2UgYWxsIHRob3NlIGNhbGxzIGFyZSBkb25lLCBjb250cm9sIHBhc3NlcworYmFjayBmcm9tIHRoZSBtb3ZlX29iamVjdCgpIGVmdW4gdG8gdGhlIG1vdmVfcGxheWVyKCkgbGZ1biBpbiBCb3pvLiAKK21vdmVfcGxheWVyKCkgcmV0dXJucyBjb250cm9sIGJhY2sgdG8gRG9fTW92ZSgpIGluIHRoZSBvbGQgcm9vbSwKK3doaWNoIHJldHVybnMgMSB0byBzaWduaWZ5IHRvIHRoZSBkcml2ZXIgdGhhdCB0aGUgY29tbWFuZCBhY3Rpb24gd2FzCitzdWNjZXNzZnVsLiAgSWYgdGhlIERvX01vdmUoKSBmdW5jdGlvbiBoYWQgcmV0dXJuZWQgMCBmb3Igc29tZSByZWFzb24sCit0aGUgZHJpdmVyIHdvdWxkIGhhdmUgd3JpdHRlbiAiV2hhdD8iIChvciB3aGF0ZXZlciB5b3VyIGRyaXZlcidzCitkZWZhdWx0IGJhZCBjb21tYW5kIG1lc3NhZ2UgaXMpIHRvIEJvem8uCisKK09uY2UgdGhlIGZpcnN0IGNvbW1hbmQgcmV0dXJucyAxLCB0aGUgZHJpdmVyIHByb2NlZWRzIG9uIHRvIEJvem8ncworc2Vjb25kIGNvbW1hbmQsIGZvbGxvd2luZyBtdWNoIHRoZSBzYW1lIHN0cnVjdHVyZS4gIE5vdGUgdGhhdCB3aXRoCisidGVsbCBkZXNjYXJ0ZXMgd2hlbiBpcyB0aGUgbmV4dCByZWJvb3QiLCB0aGUgZHJpdmVyIHBhc3NlcyAiZGVzY2FydGVzCit3aGVuIGlzIHRoZSBuZXh0IHJlYm9vdCIgdG8gdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0ZWxsLiAgVGhhdAorZnVuY3Rpb24gaW4gdHVybiBoYXMgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGF0IGFyZ3VtZW50LiAgQWZ0ZXIgdGhhdAorY29tbWFuZCByZXR1cm5zIGVpdGhlciAxIG9yIDAsIHRoZSBkcml2ZXIgdGhlbiBwcm9jZWVkcyBvbiB0byB0aGUgbmV4dAorbGl2aW5nIG9iamVjdCB3aXRoIGNvbW1hbmRzIHBlbmRpbmcsIGFuZCBzbyBvbiB1bnRpbCBhbGwgbGl2aW5nIG9iamVjdHMKK3dpdGggcGVuZGluZyBjb21tYW5kcyBoYXZlIGhhZCB0aGVpciBjb21tYW5kcyBwZXJmb3JtZWQuCisKKzIuNCBUaGUgRWZ1bnMgc2V0X2hlYXJ0X2JlYXQoKSBhbmQgY2FsbF9vdXQoKQorT25jZSBhbGwgY29tbWFuZHMgYXJlIHBlcmZvcm1lZCBmb3Igb2JqZWN0cyB3aXRoIGNvbW1hbmRzIHBlbmRpbmcsCit0aGUgZHJpdmVyIHRoZW4gcHJvY2VlZHMgdG8gY2FsbCB0aGUgaGVhcnRfYmVhdCgpIGZ1bmN0aW9uIGluIGFsbCBvYmplY3RzCitsaXN0ZWQgd2l0aCB0aGUgZHJpdmVyIGFzIGhhdmluZyBoZWFydGJlYXRzLiAgV2hlbmV2ZXIgYW4gb2JqZWN0IGNhbGxzIHRoZQorZWZ1biBzZXRfaGVhcnRfYmVhdCgpIHdpdGggYSBub24temVybyBhcmd1bWVudCAoZGVwZW5kaW5nIG9uIHlvdXIKK2RyaXZlciwgd2hhdCBub24temVybyBudW1iZXIgbWF5IGJlIGltcG9ydGFudCwgYnV0IGluIG1vc3QgY2FzZXMgeW91CitjYWxsIGl0IHdpdGggdGhlIGludCAxKS4gIFRoZSBlZnVuIHNldF9oZWFydF9iZWF0KCkgYWRkcyB0aGUgb2JqZWN0IHdoaWNoCitjYWxscyBzZXRfaGVhcnRfYmVhdCgpIHRvIHRoZSBsaXN0IG9mIG9iamVjdHMgd2l0aCBoZWFydGJlYXRzLiAgSWYgeW91IGNhbGwgaXQKK3dpdGggYW4gYXJndW1lbnQgb2YgMCwgdGhlbiBpdCByZW1vdmVzIHRoZSBvYmplY3QgZnJvbSB0aGUgbGlzdCBvZiBvYmplY3RzCit3aXRoIGhlYXJ0YmVhdHMuCisKK1RoZSBtb3N0IGNvbW1vbiB1c2UgZm9yIGhlYXJ0YmVhdHMgaW4gdGhlIG11ZGxpYiBpcyB0byBoZWFsIHBsYXllcnMgYW5kCittb25zdGVycyBhbmQgcGVyZm9ybSBjb21iYXQuICBPbmNlIHRoZSBkcml2ZXIgaGFzIGZpbmlzaGVkIGRlYWxpbmcgd2l0aAordGhlIGNvbW1hbmQgbGlzdCwgaXQgZ29lcyB0aHJvdWdoIHRoZSBoZWFydGJlYXQgbGlzdCBjYWxsaW5nIGhlYXJ0X2JlYXQoKSBpbgorZWFjaCBvYmplY3QgaW4gdGhlIGxpc3QuICBTbyBmb3IgYSBwbGF5ZXIsIGZvciBleGFtcGxlLCB0aGUgZHJpdmVyIHdpbGwgY2FsbAoraGVhcnRfYmVhdCgpIGluIHRoZSBwbGF5ZXIgd2hpY2ggd2lsbDoKKzEpIGFnZSB0aGUgcGxheWVyCisyKSBoZWFsIHRoZSBwbGF5ZXIgYWNjb3JkaW5nIHRvIGEgaGVhbCByYXRlCiszKSBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBodW50ZWQsIGh1bnRpbmcsIG9yIGF0dGFja2luZyBvYmplY3RzCithcm91bmQKKzQpIHBlcmZvcm0gYW4gYXR0YWNrIGlmIHN0ZXAgMyByZXR1cm5zIHRydWUuCis1KSBhbnkgb3RoZXIgdGhpbmdzIHdoaWNoIG5lZWQgdG8gaGFwcGVuIGF1dG9tYXRpY2FsbHkgcm91Z2hseSBldmVyeQorc2Vjb25kCisKK05vdGUgdGhhdCB0aGUgbW9yZSBvYmplY3RzIHdoaWNoIGhhdmUgaGVhcnRiZWF0cywgdGhlIG1vcmUgcHJvY2Vzc2luZword2hpY2ggaGFzIHRvIGhhcHBlbiBldmVyeSBjeWNsZSB0aGUgbXVkIGlzIHVwLiAgT2JqZWN0cyB3aXRoIGhlYXJ0YmVhdHMKK2FyZSB0aHVzIGtub3duIGFzIHRoZSBtYWpvciBob2cgb2YgQ1BVIHRpbWUgb24gbXVkcy4gIAorCitUaGUgY2FsbF9vdXQoKSBlZnVuIGlzIHVzZWQgdG8gcGVyZm9ybSB0aW1lZCBmdW5jdGlvbiBjYWxscyB3aGljaCBkbyBub3QKK25lZWQgdG8gaGFwcGVuIGFzIG9mdGVuIGFzIGhlYXJ0YmVhdHMsIG9yIHdoaWNoIGp1c3QgaGFwcGVuIG9uY2UuICBDYWxsCitvdXRzIGxldCB5b3Ugc3BlY2lmeSB0aGUgZnVuY3Rpb24gaW4gYW4gb2JqZWN0IHlvdSB3YW50IGNhbGxlZC4gIFRoZQorZ2VuZXJhbCBmb3JtdWxhIGZvciBjYWxsIG91dHMgaXM6CitjYWxsX291dChmdW5jLCB0aW1lLCBhcmdzKTsKK1RoZSB0aGlyZCBhcmd1bWVudCBzcGVjaWZ5aW5nIGFyZ3VtZW50cyBpcyBvcHRpb25hbC4gIFRoZSBmaXJzdCBhcmd1bWVudAoraXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuICBUaGUgc2Vjb25kCithcmd1bWVudCBpcyBob3cgbWFueSBzZWNvbmRzIHNob3VsZCBwYXNzIGJlZm9yZSB0aGUgZnVuY3Rpb24gZ2V0cworY2FsbGVkLgorCitQcmFjdGljYWxseSBzcGVha2luZywgd2hlbiBhbiBvYmplY3QgY2FsbHMgY2FsbF9vdXQoKSwgaXQgaXMgYWRkZWQgdG8gYSBsaXN0CitvZiBvYmplY3RzIHdpdGggcGVuZGluZyBjYWxsIG91dHMgd2l0aCB0aGUgYW1vdW50IG9mIHRpbWUgb2YgdGhlIGNhbGwgb3V0CithbmQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gIEVhY2ggY3ljbGUgb2YgdGhlIGRyaXZlciwgdGhlCit0aW1lIGlzIGNvdW50ZWQgZG93biB1bnRpbCBpdCBiZWNvbWVzIHRpbWUgZm9yIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIAorV2hlbiB0aGUgdGltZSBjb21lcywgdGhlIGRyaXZlciByZW1vdmVzIHRoZSBvYmplY3QgZnJvbSB0aGUgbGlzdCBvZgorb2JqZWN0cyB3aXRoIHBlbmRpbmcgY2FsbCBvdXRzIGFuZCBwZXJmb3JtcyB0aGUgY2FsbCB0byB0aGUgY2FsbCBvdXQKK2Z1bmN0aW9uLCBwYXNzaW5nIGFueSBzcGVjaWFsIGFyZ3Mgb3JpZ2luYWxseSBzcGVjaWZpZWQgYnkgdGhlIGNhbGwgb3V0CitmdW5jdGlvbi4KKworSWYgeW91IHdhbnQgYSB0byByZW1vdmUgYSBwZW5kaW5nIGNhbGwgYmVmb3JlIGl0IG9jY3VycywgeW91IG5lZWQgdG8gdXNlCit0aGUgcmVtb3ZlX2NhbGxfb3V0KCkgZWZ1biwgcGFzc2luZyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcKK2NhbGxlZCBvdXQuICBUaGUgZHJpdmVyIHdpbGwgcmVtb3ZlIHRoZSBuZXh0IHBlbmRpbmcgY2FsbCBvdXQgdG8gdGhhdAorZnVuY3Rpb24uICBUaGlzIG1lYW5zIHlvdSBtYXkgaGF2ZSBzb21lIGFtYmlndWl0eSBpZiBtb3JlIHRoYW4gb25lCitjYWxsIG91dCBpcyBwZW5kaW5nIGZvciB0aGUgc2FtZSBmdW5jdGlvbi4KKworSW4gb3JkZXIgdG8gbWFrZSBhIGNhbGwgb3V0IGN5Y2xpY2FsLCB5b3UgbXVzdCByZWlzc3VlIHRoZSBjYWxsX291dCgpIGVmdW4KK2luIHRoZSBmdW5jdGlvbiB5b3UgY2FsbGVkIG91dCwgc2luY2UgdGhlIGRyaXZlciBhdXRvbWF0aWNhbGx5IHJlbW92ZXMgdGhlCitmdW5jdGlvbiBmcm9tIHRoZSBjYWxsIG91dCB0YWJsZSB3aGVuIGEgY2FsbCBvdXQgaXMgcGVyZm9ybWVkLiAgRXhhbXBsZToKKwordm9pZCBmb28oKSB7IGNhbGxfb3V0KCJoZWxsbyIsIDEwKTsgfQorCit2b2lkIGhlbGxvKCkgeyBjYWxsX291dCgiaGVsbG8iLCAxMCk7IH0KKword2lsbCBzZXQgdXAgaGVsbG8oKSB0byBiZSBjYWxsZWQgZXZlcnkgMTAgc2Vjb25kcyBhZnRlciBmb28oKSBpcyBmaXJzdCBjYWxsZWQuIAorVGhlcmUgYXJlIHNldmVyYWwgdGhpbmdzIHRvIGJlIGNhcmVmdWwgYWJvdXQgaGVyZS4gIEZpcnN0LCB5b3UgbXVzdCB3YXRjaAordG8gbWFrZSBzdXJlIHlvdSBkbyBub3Qgc3RydWN0dXJlIHlvdXIgY2FsbCBvdXRzIHRvIGJlIHJlY3Vyc2l2ZSBpbiBhbnkKK3VuaW50ZW5kZWQgZmFzaGlvbi4gIFNlY29uZCwgY29tcGFyZSB3aGF0IGEgc2V0X2hlYXJ0X2JlYXQoKSBkb2VzCit3aGVuIGNvbXBhcmVkIGRpcmVjdGx5IHRvIHdoYXQgY2FsbF9vdXQoKSBkb2VzLgorCitzZXRfaGVhcnRfYmVhdCgpOgorYSkgQWRkcyB0aGlzX29iamVjdCgpIHRvIGEgdGFibGUgbGlzdGluZyBvYmplY3RzIHdpdGggaGVhcnRiZWF0cy4KK2IpIFRoZSBmdW5jdGlvbiBoZWFydF9iZWF0KCkgaW4gdGhpc19vYmplY3QoKSBnZXRzIGNhbGxlZCBldmVyeSBzaW5nbGUKK2RyaXZlciBjeWNsZS4KKworY2FsbF9vdXQoKToKK2EpIEFkZHMgdGhpc19vYmplY3QoKSwgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBpbiB0aGlzX29iamVjdCgpLCBhIHRpbWUKK2RlbGF5LCBhbmQgYSBzZXQgb2YgYXJndW1lbnRzIHRvIGEgdGFibGUgbGlzdGluZyBmdW5jdGlvbnMgd2l0aCBwZW5kaW5nCitjYWxsIG91dHMuICAKK2IpIFRoZSBmdW5jdGlvbiBuYW1lZCBpcyBjYWxsZWQgb25seSBvbmNlLCBhbmQgdGhhdCBjYWxsIGNvbWVzIGFmdGVyIHRoZQorc3BlY2lmaWVkIGRlbGF5LgorCitBcyB5b3UgY2FuIHNlZSwgdGhlcmUgaXMgYSBtdWNoIGdyZWF0ZXIgbWVtb3J5IG92ZXJoZWFkIGFzc29jaWF0ZWQKK3dpdGggY2FsbCBvdXRzIGZvciBwYXJ0IChhKSwgeWV0IHRoYXQgdGhlcmUgaXMgYSBtdWNoIGdyZWF0ZXIgQ1BVIG92ZXJoZWFkCithc3NvY2lhdGVkIHdpdGggaGVhcnRiZWF0cyBhcyBzaG93biBpbiBwYXJ0IChiKSwgYXNzdW1pbmcgdGhhdCB0aGUgZGVsYXkKK2ZvciB0aGUgY2FsbCBvdXQgaXMgZ3JlYXRlciB0aGFuIGEgc2luZ2xlIGRyaXZlciBjeWNsZS4gCisKK0NsZWFybHksIHlvdSBkbyBub3Qgd2FudCB0byBiZSBpc3N1aW5nIDEgc2Vjb25kIGNhbGwgb3V0cywgZm9yIHRoZW4geW91CitnZXQgdGhlIHdvcnN0IG9mIGJvdGggd29ybGRzLiAgU2ltaWxhcmx5LCB5b3UgZG8gbm90IHdhbnQgdG8gYmUgaGF2aW5nCitoZWFydCBiZWF0cyBpbiBvYmplY3RzIHRoYXQgY2FuIHBlcmZvcm0gdGhlIHNhbWUgZnVuY3Rpb25zIHdpdGggY2FsbCBvdXRzCitvZiBhIGdyZWF0ZXIgZHVyYXRpb24gdGhhbiAxIHNlY29uZC4gIEkgcGVyc29uYWxseSBoYXZlIGhlYXJkIG11Y2ggdGFsaworYWJvdXQgYXQgd2hhdCBwb2ludCB5b3Ugc2hvdWxkIHVzZSBhIGNhbGwgb3V0IG92ZXIgYSBoZWFydGJlYXQuICBXaGF0IEkKK2hhdmUgbW9zdGx5IGhlYXJkIGlzIHRoYXQgZm9yIHNpbmdsZSBjYWxscyBvciBmb3IgY3ljbGVzIG9mIGEgZHVyYXRpb24KK2dyZWF0ZXIgdGhhbiAxMCBzZWNvbmRzLCBpdCBpcyBiZXN0IHRvIHVzZSBhIGNhbGwgb3V0LiAgRm9yIHJlcGV0aXRpdmUgY2FsbHMgb2YKK2R1cmF0aW9ucyBsZXNzIHRoYW4gMTAgc2Vjb25kcywgeW91IGFyZSBiZXR0ZXIgb2ZmIHVzaW5nIGhlYXJ0YmVhdHMuICBJIGRvCitub3Qga25vdyBpZiB0aGlzIGlzIHRydWUsIGJ1dCBJIGRvIG5vdCB0aGluayBmb2xsb3dpbmcgdGhpcyBjYW4gZG8gYW55CitoYXJtLgorCisyLjUgU3VtbWFyeQorQmFzaWMgdG8gYSBtb3JlIGluIGRlcHRoIHVuZGVyc3RhbmRpbmcgb2YgTFBDIGlzIGFuZCB1bmRlcnN0YW5kaW5nIG9mCit0aGUgd2F5IGluIHdoaWNoIHRoZSBkcml2ZXIgaW50ZXJhY3RzIHdpdGggdGhlIG11ZGxpYi4gIFlvdSBzaG91bGQgbm93Cit1bmRlcnN0YW5kIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZHJpdmVyIHBlcmZvcm1zIGZ1bmN0aW9ucywgYXMgd2VsbCBhcyBhCittb3JlIGRldGFpbGVkIGtub3dsZWRnZSBvZiB0aGUgZWZ1bnMgdGhpc19wbGF5ZXIoKSwgYWRkX2FjdGlvbigpLCBhbmQKK21vdmVfb2JqZWN0KCkgYW5kIHRoZSBsZnVuIGluaXQoKS4gIEluIGFkZGl0aW9uIHRvIHRoaXMgYnVpbGRpbmcgdXBvbgora25vd2xlZGdlIHlvdSBnb3QgZnJvbSB0aGUgTFBDIEJhc2ljcyB0ZXh0Ym9vaywgdGhpcyBjaGFwdGVyIGhhcworaW50cm9kdWNlZCBjYWxsIG91dHMgYW5kIGhlYXJ0YmVhdHMgYW5kIHRoZSBtYW5uZXIgaW4gd2hpY2ggdGhlIGRyaXZlcgoraGFuZGxlcyB0aGVtLiAgWW91IHNob3VsZCBub3cgaGF2ZSBhIGJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgY2FsbCBvdXRzCithbmQgaGVhcnRiZWF0cyBzdWNoIHRoYXQgeW91IGNhbiBleHBlcmltZW50IHdpdGggdGhlbSBpbiB5b3VyIHJlYWxtCitjb2RlLgorCitDb3B5cmlnaHQgKGMpIEdlb3JnZSBSZWVzZSAxOTkzCmRpZmYgLS1naXQgYS9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjMgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4NjczNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9LVVJTL0xQQy1LVVJTMi9jaGFwdGVyMwpAQCAtMCwwICsxLDQ4MSBAQAorSW50ZXJtZWRpYXRlIExQQworRGVzY2FydGVzIG9mIEJvcmcKK05vdmVtYmVyIDE5OTMKKworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcHRlciAzOiBDb21wbGV4IERhdGEgVHlwZXMKKworMy4xIFNpbXBsZSBEYXRhIFR5cGVzCitJbiB0aGUgdGV4dGJvb2sgTFBDIEJhc2ljcywgeW91IGxlYXJuZWQgYWJvdXQgdGhlIGNvbW1vbiwgYmFzaWMgTFBDCitkYXRhIHR5cGVzOiBpbnQsIHN0cmluZywgb2JqZWN0LCB2b2lkLiAgTW9zdCBpbXBvcnRhbnQgeW91IGxlYXJuZWQgdGhhdAorbWFueSBvcGVyYXRpb25zIGFuZCBmdW5jdGlvbnMgYmVoYXZlIGRpZmZlcmVudGx5IGJhc2VkIG9uIHRoZSBkYXRhIHR5cGUKK29mIHRoZSB2YXJpYWJsZXMgdXBvbiB3aGljaCB0aGV5IGFyZSBvcGVyYXRpbmcuICBTb21lIG9wZXJhdG9ycyBhbmQKK2Z1bmN0aW9ucyB3aWxsIGV2ZW4gZ2l2ZSBlcnJvcnMgaWYgeW91IHVzZSB0aGVtIHdpdGggdGhlIHdyb25nIGRhdGEKK3R5cGVzLiAgRm9yIGV4YW1wbGUsICJhIisiYiIgaXMgaGFuZGxlZCBtdWNoIGRpZmZlcmVudGx5IHRoYW4gMSsxLiAKK1doZW4geW91IGFzcyAiYSIrImIiLCB5b3UgYXJlIGFkZGluZyAiYiIgb250byB0aGUgZW5kIG9mICJhIiB0byBnZXQKKyJhYiIuICBPbiB0aGUgb3RoZXIgaGFuZCwgd2hlbiB5b3UgYWRkIDErMSwgeW91IGRvIG5vdCBnZXQgMTEsIHlvdSBnZXQKKzIgYXMgeW91IHdvdWxkIGV4cGVjdC4KKworSSByZWZlciB0byB0aGVzZSBkYXRhIHR5cGVzIGFzIHNpbXBsZSBkYXRhIHR5cGVzLCBiZWNhdXNlIHRoZXkgYXRvbWljIGluCit0aGF0IHRoZXkgY2Fubm90IGJlIGJyb2tlbiBkb3duIGludG8gc21hbGxlciBjb21wb25lbnQgZGF0YSB0eXBlcy4gCitUaGUgb2JqZWN0IGRhdGEgdHlwZSBpcyBhIHNvcnQgb2YgZXhjZXB0aW9uLCBidXQgeW91IHJlYWxseSBjYW5ub3QgcmVmZXIKK2luZGl2aWR1YWxseSB0byB0aGUgY29tcG9uZW50cyB3aGljaCBtYWtlIGl0IHVwLCBzbyBJIHJlZmVyIHRvIGl0IGFzIGEKK3NpbXBsZSBkYXRhIHR5cGUuCisKK1RoaXMgY2hhcHRlciBpbnRyb2R1Y2VzIHRoZSBjb25jZXB0IG9mIHRoZSBjb21wbGV4IGRhdGEgdHlwZSwgYSBkYXRhIHR5cGUKK3doaWNoIGlzIG1hZGUgdXAgb2YgdW5pdHMgb2Ygc2ltcGxlIGRhdGEgdHlwZXMuICBMUEMgaGFzIHR3byBjb21tb24KK2NvbXBsZXggZGF0YSB0eXBlcywgYm90aCBraW5kcyBvZiBhcnJheXMuICBGaXJzdCwgdGhlcmUgaXMgdGhlIHRyYWRpdGlvbmFsCithcnJheSB3aGljaCBzdG9yZXMgdmFsdWVzIGluIGNvbnNlY3V0aXZlIGVsZW1lbnRzIGFjY2Vzc2VkIGJ5IGEgbnVtYmVyCityZXByZXNlbnRpbmcgd2hpY2ggZWxlbWVudCB0aGV5IGFyZSBzdG9yZWQgaW4uICBTZWNvbmQgaXMgYW4gYXNzb2NpYXRpdmUKK2FycmF5IGNhbGxlZCBhIG1hcHBpbmcuICBBIG1hcHBpbmcgYXNzb2NpYXRlcyB0byB2YWx1ZXMgdG9nZXRoZXIgdG8KK2FsbG93IGEgbW9yZSBuYXR1cmFsIGFjY2VzcyB0byBkYXRhLgorCiszLjIgVGhlIFZhbHVlcyBOVUxMIGFuZCAwCitCZWZvcmUgZ2V0dGluZyBmdWxseSBpbnRvIGFycmF5cywgdGhlcmUgZmlyc3Qgc2hvdWxkIGJlIGEgZnVsbCB1bmRlcnN0YW5kaW5nCitvZiB0aGUgY29uY2VwdCBvZiBOVUxMIHZlcnN1cyB0aGUgY29uY2VwdCBvZiAwLiAgSW4gTFBDLCBhIG51bGwgdmFsdWUgaXMKK3JlcHJlc2VudGVkIGJ5IHRoZSBpbnRlZ2VyIDAuICBBbHRob3VnaCB0aGUgaW50ZWdlciAwIGFuZCBOVUxMIGFyZSBvZnRlbgorZnJlZWx5IGludGVyY2hhbmdlYWJsZSwgdGhpcyBpbnRlcmNoYW5nZWFiaWxpdHkgb2Z0ZW4gbGVhZHMgdG8gc29tZSBncmVhdAorY29uZnVzaW9uIHdoZW4geW91IGdldCBpbnRvIHRoZSByZWFsbSBvZiBjb21wbGV4IGRhdGEgdHlwZXMuICBZb3UgbWF5CitoYXZlIGV2ZW4gZW5jb3VudGVyZWQgc3VjaCBjb25mdXNpb24gd2hpbGUgdXNpbmcgc3RyaW5ncy4KKworMCByZXByZXNlbnRzIGEgdmFsdWUgd2hpY2ggZm9yIGludGVnZXJzIG1lYW5zIHRoZSB2YWx1ZSB5b3UgYWRkIHRvCithbm90aGVyIHZhbHVlIHlldCBzdGlsbCByZXRhaW4gdGhlIHZhbHVlIGFkZGVkLiAgVGhpcyBmb3IgYW55IGFkZGl0aW9uCitvcGVyYXRpb24gb24gYW55IGRhdGEgdHlwZSwgdGhlIFpFUk8gdmFsdWUgZm9yIHRoYXQgZGF0YSB0eXBlIGlzIHRoZSB2YWx1ZQordGhhdCB5b3UgY2FuIGFkZCB0byBhbnkgb3RoZXIgdmFsdWUgYW5kIGdldCB0aGUgb3JpZ2luYWwgdmFsdWUuICBUaHVzOiAgIEEKK3BsdXMgWkVSTyBlcXVhbHMgQSB3aGVyZSBBIGlzIHNvbWUgdmFsdWUgb2YgYSBnaXZlbiBkYXRhIHR5cGUgYW5kCitaRVJPIGlzIHRoZSBaRVJPIHZhbHVlIGZvciB0aGF0IGRhdGEgdHlwZS4gIFRoaXMgaXMgbm90IGFueSBzb3J0IG9mCitvZmZpY2lhbCBtYXRoZW1hdGljYWwgZGVmaW5pdGlvbi4gIFRoZXJlIGV4aXN0cyBvbmUsIGJ1dCBJIGFtIG5vdCBhCittYXRoZW1hdGljaWFuLCBzbyBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSB0ZXJtIGlzLiAgVGh1cyBmb3IgaW50ZWdlcnMsIDAKK2lzIHRoZSBaRVJPIHZhbHVlIHNpbmNlIDEgKyAwIGVxdWFscyAxLgorCitOVUxMLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgdGhlIGFic2VuY2Ugb2YgYW55IHZhbHVlIG9yIG1lYW5pbmcuICBUaGUKK0xQQyBkcml2ZXIgd2lsbCBpbnRlcnByZXQgTlVMTCBhcyBhbiBpbnRlZ2VyIDAgaWYgaXQgY2FuIG1ha2Ugc2Vuc2Ugb2YgaXQKK2luIHRoYXQgY29udGV4dC4gIEluIGFueSBjb250ZXh0IGJlc2lkZXMgaW50ZWdlciBhZGRpdGlvbiwgQSBwbHVzIE5VTEwKK2NhdXNlcyBhbiBlcnJvci4gIE5VTEwgY2F1c2VzIGFuIGVycm9yIGJlY2F1c2UgYWRkaW5nIHZhbHVlbGVzcyBmaWVsZHMKK2luIG90aGVyIGRhdGEgdHlwZXMgdG8gdGhvc2UgZGF0YSB0eXBlcyBtYWtlcyBubyBzZW5zZS4KKworTG9va2luZyBhdCB0aGlzIGZyb20gYW5vdGhlciBwb2ludCBvZiB2aWV3LCB3ZSBjYW4gZ2V0IHRoZSBaRVJPIHZhbHVlCitmb3Igc3RyaW5ncyBieSBrbm93aW5nIHdoYXQgYWRkZWQgdG8gImEiIHdpbGwgZ2l2ZSB1cyAiYSIgYXMgYSByZXN1bHQuIAorVGhlIGFuc3dlciBpcyBub3QgMCwgYnV0IGluc3RlYWQgIiIuICBXaXRoIGludGVnZXJzLCBpbnRlcmNoYW5naW5nIE5VTEwKK2FuZCAwIHdhcyBhY2NlcHRhYmxlIHNpbmNlIDAgcmVwcmVzZW50cyBubyB2YWx1ZSB3aXRoIHJlc3BlY3QgdG8gdGhlCitpbnRlZ2VyIGRhdGEgdHlwZS4gIFRoaXMgaW50ZXJjaGFuZ2VhYmlsaXR5IGlzIG5vdCB0cnVlIGZvciBvdGhlciBkYXRhIHR5cGVzLAorc2luY2UgdGhlaXIgWkVSTyB2YWx1ZXMgZG8gbm90IHJlcHJlc2VudCBubyB2YWx1ZS4gIE5hbWVseSwgIiIKK3JlcHJlc2VudHMgYSBzdHJpbmcgb2Ygbm8gbGVuZ3RoIGFuZCBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIDAuICAKKworV2hlbiB5b3UgZmlyc3QgZGVjbGFyZSBhbnkgdmFyaWFibGUgb2YgYW55IHR5cGUsIGl0IGhhcyBubyB2YWx1ZS4gIEFueQorZGF0YSB0eXBlIGV4Y2VwdCBpbnRlZ2VycyB0aGVyZWZvcmUgbXVzdCBiZSBpbml0aWFsaXplZCBzb21laG93IGJlZm9yZQoreW91IHBlcmZvcm0gYW55IG9wZXJhdGlvbiBvbiBpdC4gIEdlbmVyYWxseSwgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGUKK2NyZWF0ZSgpIGZ1bmN0aW9uIGZvciBnbG9iYWwgdmFyaWFibGVzLCBvciBhdCB0aGUgdG9wIG9mIHRoZSBsb2NhbCBmdW5jdGlvbgorZm9yIGxvY2FsIHZhcmlhYmxlcyBieSBhc3NpZ25pbmcgdGhlbSBzb21lIHZhbHVlLCBvZnRlbiB0aGUgWkVSTyB2YWx1ZQorZm9yIHRoYXQgZGF0YSB0eXBlLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcgY29kZSBJIHdhbnQgdG8gYnVpbGQgYQorc3RyaW5nIHdpdGggcmFuZG9tIHdvcmRzOgorCitzdHJpbmcgYnVpbGRfbm9uc2Vuc2UoKSB7CisgICAgc3RyaW5nIHN0cjsKKyAgICBpbnQgaTsKKworICAgIHN0ciA9ICIiOyAvKiBIZXJlIHN0ciBpcyBpbml0aWFsaXplZCB0byB0aGUgc3RyaW5nCitaRVJPIHZhbHVlICovCisgICAgZm9yKGk9MDsgaTw2OyBpKyspIHsKKyAgICAgICAgc3dpdGNoKHJhbmRvbSgzKSsxKSB7CisgICAgICAgICAgICBjYXNlIDE6IHN0ciArPSAiYmluZyI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBzdHIgKz0gImJvcmciOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogc3RyICs9ICJmb28iOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZihpPT01KSBzdHIgKz0gIi5cbiI7CisgICAgICAgIGVsc2Ugc3RyICs9ICIgIjsKKyAgICB9CisgICAgcmV0dXJuIGNhcGl0YWxpemUoc3RyKTsKK30KKworSWYgd2UgaGFkIG5vdCBpbml0aWFsaXplZCB0aGUgdmFyaWFibGUgc3RyLCBhbiBlcnJvciB3b3VsZCBoYXZlIHJlc3VsdGVkCitmcm9tIHRyeWluZyB0byBhZGQgYSBzdHJpbmcgdG8gYSBOVUxMIHZhbHVlLiAgSW5zdGVhZCwgdGhpcyBjb2RlIGZpcnN0Citpbml0aWFsaXplcyBzdHIgdG8gdGhlIFpFUk8gdmFsdWUgZm9yIHN0cmluZ3MsICIiLiAgQWZ0ZXIgdGhhdCwgaXQgZW50ZXJzIGEKK2xvb3Agd2hpY2ggbWFrZXMgNiBjeWNsZXMsIGVhY2ggdGltZSByYW5kb21seSBhZGRpbmcgb25lIG9mIHRocmVlCitwb3NzaWJsZSB3b3JkcyB0byB0aGUgc3RyaW5nLiAgRm9yIGFsbCB3b3JkcyBleGNlcHQgdGhlIGxhc3QsIGFuIGFkZGl0aW9uYWwKK2JsYW5rIGNoYXJhY3RlciBpcyBhZGRlZC4gIEZvciB0aGUgbGFzdCB3b3JkLCBhIHBlcmlvZCBhbmQgYSByZXR1cm4KK2NoYXJhY3RlciBhcmUgYWRkZWQuICBUaGUgZnVuY3Rpb24gdGhlbiBleGl0cyB0aGUgbG9vcCwgY2FwaXRhbGl6ZXMgdGhlCitub25zZW5zZSBzdHJpbmcsIHRoZW4gZXhpdHMuCisKKzMuMyBBcnJheXMgaW4gTFBDCitBbiBhcnJheSBpcyBhIHBvd2VyZnVsIGNvbXBsZXggZGF0YSB0eXBlIG9mIExQQyB3aGljaCBhbGxvd3MgeW91IHRvCithY2Nlc3MgbXVsdGlwbGUgdmFsdWVzIHRocm91Z2ggYSBzaW5nbGUgdmFyaWFibGUuICBGb3IgaW5zdGFuY2UsCitOaWdodG1hcmUgaGFzIGFuIGluZGVmaW5pdGUgbnVtYmVyIG9mIGN1cnJlbmNpZXMgaW4gd2hpY2ggcGxheWVycyBtYXkKK2RvIGJ1c2luZXNzLiAgT25seSBmaXZlIG9mIHRob3NlIGN1cnJlbmNpZXMsIGhvd2V2ZXIsIGNhbiBiZSBjb25zaWRlcmVkCitoYXJkIGN1cnJlbmNpZXMuICBBIGhhcmQgY3VycmVuY3kgZm9yIHRoZSBzYWtlIG9mIHRoaXMgZXhhbXBsZSBpcyBhCitjdXJyZW5jeSB3aGljaCBpcyByZWFkaWx5IGV4Y2hhbmdlYWJsZSBmb3IgYW55IG90aGVyIGhhcmQgY3VycmVuY3ksCit3aGVyZWFzIGEgc29mdCBjdXJyZW5jeSBtYXkgb25seSBiZSBib3VnaHQsIGJ1dCBub3Qgc29sZC4gIEluIHRoZSBiYW5rLAordGhlcmUgaXMgYSBsaXN0IG9mIGhhcmQgY3VycmVuY2llcyB0byBhbGxvdyBiYW5rIGtlZXBlcnMgdG8ga25vdyB3aGljaAorY3VycmVuY2llcyBhcmUgaW4gZmFjdCBoYXJkIGN1cnJlbmNpZXMuICBXaXRoIHNpbXBsZSBkYXRhIHR5cGVzLCB3ZSB3b3VsZAoraGF2ZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgbmFzdHkgb3BlcmF0aW9uIGZvciBldmVyeSBleGNoYW5nZQordHJhbnNhY3Rpb246CisKK2ludCBleGNoYW5nZShzdHJpbmcgc3RyKSB7CisgICAgc3RyaW5nIGZyb20sIHRvOworICAgIGludCBhbXQ7CisKKyAgICBpZighc3RyKSByZXR1cm4gMDsKKyAgICBpZihzc2NhbmYoc3RyLCAiJWQgJXMgZm9yICVzIiwgYW10LCBmcm9tLCB0bykgIT0gMykKKyAgICAgIHJldHVybiAwOworICAgIGlmKGZyb20gIT0gInBsYXRpbnVtIiAmJiBmcm9tICE9ICJnb2xkIiAmJiBmcm9tICE9CisgICAgICAic2lsdmVyIiAmJgorICAgICAgZnJvbSAhPSAiZWxlY3RydW0iICYmIGZyb20gIT0gImNvcHBlciIpIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoIldlIGRvIG5vdCBidXkgc29mdCBjdXJyZW5jaWVzIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAuLi4KK30KKworV2l0aCBmaXZlIGhhcmQgY3VycmVuY2llcywgd2UgaGF2ZSBhIHJhdGhlciBzaW1wbGUgZXhhbXBsZS4gIEFmdGVyIGFsbCBpdAordG9vayBvbmx5IHR3byBsaW5lcyBvZiBjb2RlIHRvIHJlcHJlc2VudCB0aGUgaWYgc3RhdGVtZW50IHdoaWNoIGZpbHRlcmVkCitvdXQgYmFkIGN1cnJlbmNpZXMuICBCdXQgd2hhdCBpZiB5b3UgaGFkIHRvIGNoZWNrIGFnYWluc3QgYWxsIHRoZSBuYW1lcword2hpY2ggY2Fubm90IGJlIHVzZWQgdG8gbWFrZSBjaGFyYWN0ZXJzIGluIHRoZSBnYW1lPyAgVGhlcmUgbWlnaHQgYmUKKzEwMCBvZiB0aG9zZTsgd291bGQgeW91IHdhbnQgdG8gd3JpdGUgYSAxMDAgcGFydCBpZiBzdGF0ZW1lbnQ/CitXaGF0IGlmIHlvdSB3YW50ZWQgdG8gYWRkIGEgY3VycmVuY3kgdG8gdGhlIGxpc3Qgb2YgaGFyZCBjdXJyZW5jaWVzPyAgVGhhdAorbWVhbnMgeW91IHdvdWxkIGhhdmUgdG8gY2hhbmdlIGV2ZXJ5IGNoZWNrIGluIHRoZSBnYW1lIGZvciBoYXJkCitjdXJyZW5jaWVzIHRvIGFkZCBvbmUgbW9yZSBwYXJ0IHRvIHRoZSBpZiBjbGF1c2VzLiAgQXJyYXlzIGFsbG93IHlvdQorc2ltcGxlIGFjY2VzcyB0byBncm91cHMgb2YgcmVsYXRlZCBkYXRhIHNvIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIGRlYWwKK3dpdGggZWFjaCBpbmRpdmlkdWFsIHZhbHVlIGV2ZXJ5IHRpbWUgeW91IHdhbnQgdG8gcGVyZm9ybSBhIGdyb3VwCitvcGVyYXRpb24uCisKK0FzIGEgY29uc3RhbnQsIGFuIGFycmF5IG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgorICAgICh7ICJwbGF0aW51bSIsICJnb2xkIiwgInNpbHZlciIsICJlbGVjdHJ1bSIsICJjb3BwZXIiIH0pCit3aGljaCBpcyBhbiBhcnJheSBvZiB0eXBlIHN0cmluZy4gIEluZGl2aWR1YWwgZGF0YSB2YWx1ZXMgaW4gYXJyYXlzIGFyZQorY2FsbGVkIGVsZW1lbnRzLCBvciBzb21ldGltZXMgbWVtYmVycy4gIEluIGNvZGUsIGp1c3QgYXMgY29uc3RhbnQKK3N0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGJ5IHN1cnJvdW5kaW5nIHRoZW0gd2l0aCAiIiwgY29uc3RhbnQgYXJyYXlzIGFyZQorcmVwcmVzZW50ZWQgYnkgYmVpbmcgc3Vycm91bmRlZCBieSAoeyB9KSwgd2l0aCBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mCit0aGUgYXJyYXkgYmVpbmcgc2VwYXJhdGVkIGJ5IGEgLC4KKworWW91IG1heSBoYXZlIGFycmF5cyBvZiBhbnkgTFBDIGRhdGEgdHlwZSwgc2ltcGxlIG9yIGNvbXBsZXguICBBcnJheXMKK21hZGUgdXAgb2YgbWl4ZXMgb2YgdmFsdWVzIGFyZSBjYWxsZWQgYXJyYXlzIG9mIG1peGVkIHR5cGUuICBJbiBtb3N0CitMUEMgZHJpdmVycywgeW91IGRlY2xhcmUgYW4gYXJyYXkgdXNpbmcgYSB0aHJvdy1iYWNrIHRvIEMgbGFuZ3VhZ2UKK3N5bnRheCBmb3IgYXJyYXlzLiAgVGhpcyBzeW50YXggaXMgb2Z0ZW4gY29uZnVzaW5nIGZvciBMUEMgY29kZXJzCitiZWNhdXNlIHRoZSBzeW50YXggaGFzIGEgbWVhbmluZyBpbiBDIHRoYXQgc2ltcGx5IGRvZXMgbm90IHRyYW5zbGF0ZSBpbnRvCitMUEMuICBOZXZlcnRoZWxlc3MsIGlmIHdlIHdhbnRlZCBhbiBhcnJheSBvZiB0eXBlIHN0cmluZywgd2Ugd291bGQKK2RlY2xhcmUgaXQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6CisKK3N0cmluZyAqYXJyOworCitJbiBvdGhlciB3b3JkcywgdGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMgaXQgd2lsbCBjb250YWluIGZvbGxvd2VkIGJ5CithIHNwYWNlIGFuZCBhbiBhc3Rlcmlzay4gIFJlbWVtYmVyLCBob3dldmVyLCB0aGF0IHRoaXMgbmV3bHkgZGVjbGFyZWQKK3N0cmluZyBhcnJheSBoYXMgYSBOVUxMIHZhbHVlIGluIGl0IGF0IHRoZSB0aW1lIG9mIGRlY2xhcmF0aW9uLgorCiszLjQgVXNpbmcgQXJyYXlzCitZb3Ugbm93IHNob3VsZCB1bmRlcnN0YW5kIGhvdyB0byBkZWNsYXJlIGFuZCByZWNvZ25pemUgYW4gYXJyYXkgaW4KK2NvZGUuICBJbiBvcmRlciB0byB1bmRlcnN0YW5kIGhvdyB0aGV5IHdvcmsgaW4gY29kZSwgbGV0J3MgcmV2aWV3IHRoZQorYmFuayBjb2RlLCB0aGlzIHRpbWUgdXNpbmcgYXJyYXlzOgorCitzdHJpbmcgKmhhcmRfY3VycmVuY2llczsKKworaW50IGV4Y2hhbmdlKHN0cmluZyBzdHIpIHsKKyAgICBzdHJpbmcgZnJvbSwgdG87CisgICAgaW50IGFtdDsKKworICAgIGlmKCFzdHIpIHJldHVybiAwOworICAgIGlmKHNzY2FuZihzdHIsICIlZCAlcyBmb3IgJXMiLCBhbXQsIGZyb20sIHRvKSAhPSAzKQorcmV0dXJuIDA7CisgICAgaWYobWVtYmVyX2FycmF5KGZyb20sIGhhcmRfY3VycmVuY2llcykgPT0gLTEpIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoIldlIGRvIG5vdCBidXkgc29mdCBjdXJyZW5jaWVzIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAuLi4KK30KKworVGhpcyBjb2RlIGFzc3VtZXMgaGFyZF9jdXJyZW5jaWVzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIGFuZCBpcyBpbml0aWFsaXplZAoraW4gY3JlYXRlKCkgYXM6CisgICAgaGFyZF9jdXJyZW5jaWVzID0gKHsgInBsYXRpbnVtIiwgImdvbGQiLCAiZWxlY3RydW0iLCAic2lsdmVyIiwKKyAgICJjb3BwZXIiIH0pOworSWRlYWxseSwgeW91IHdvdWxkIGhhdmUgaGFyZCBjdXJyZW5jaWVzIGFzIGEgI2RlZmluZSBpbiBhIGhlYWRlciBmaWxlIGZvcgorYWxsIG9iamVjdHMgdG8gdXNlLCBidXQgI2RlZmluZSBpcyBhIHRvcGljIGZvciBhIGxhdGVyIGNoYXB0ZXIuCisKK09uY2UgeW91IGtub3cgd2hhdCB0aGUgbWVtYmVyX2FycmF5KCkgZWZ1biBkb2VzLCB0aGlzIG1ldGhvZAorY2VydGFpbmx5IGlzIG11Y2ggZWFzaWVyIHRvIHJlYWQgYXMgd2VsbCBhcyBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IGFuZAorZWFzaWVyIHRvIGNvZGUuICBJbiBmYWN0LCB5b3UgY2FuIHByb2JhYmx5IGd1ZXNzIHdoYXQgdGhlCittZW1iZXJfYXJyYXkoKSBlZnVuIGRvZXM6ICBJdCB0ZWxscyB5b3UgaWYgYSBnaXZlbiB2YWx1ZSBpcyBhIG1lbWJlciBvZgordGhlIGFycmF5IGluIHF1ZXN0aW9uLiAgU3BlY2lmaWNhbGx5IGhlcmUsIHdlIHdhbnQgdG8ga25vdyBpZiB0aGUgY3VycmVuY3kKK3RoZSBwbGF5ZXIgaXMgdHJ5aW5nIHRvIHNlbGwgaXMgYW4gZWxlbWVudCBpbiB0aGUgaGFyZF9jdXJlbmNpZXMgYXJyYXkuIAorV2hhdCBtaWdodCBiZSBjb25mdXNpbmcgdG8geW91IGlzLCBub3Qgb25seSBkb2VzIG1lbWJlcl9hcnJheSgpIHRlbGwgdXMKK2lmIHRoZSB2YWx1ZSBpcyBhbiBlbGVtZW50IGluIHRoZSBhcnJheSwgYnV0IGl0IGluIGZhY3QgdGVsbHMgdXMgd2hpY2ggZWxlbWVudAorb2YgdGhlIGFycmF5IHRoZSB2YWx1ZSBpcy4KKworSG93IGRvZXMgaXQgdGVsbCB5b3Ugd2hpY2ggZWxlbWVudD8gIEl0IGlzIGVhc2llciB0byB1bmRlcnN0YW5kIGFycmF5cyBpZgoreW91IHRoaW5rIG9mIHRoZSBhcnJheSB2YXJpYWJsZSBhcyBob2xkaW5nIGEgbnVtYmVyLiAgSW4gdGhlIHZhbHVlIGFib3ZlLAorZm9yIHRoZSBzYWtlIG9mIGFyZ3VtZW50LCB3ZSB3aWxsIHNheSB0aGF0IGhhcmRfY3VycmVuY2llcyBob2xkcyB0aGUKK3ZhbHVlIDE3OTAwMC4gIFRoaXMgdmFsdWUgdGVsbHMgdGhlIGRyaXZlciB3aGVyZSB0byBsb29rIGZvciB0aGUgYXJyYXkKK2hhcmRfY3VycmVuY2llcyByZXByZXNlbnRzLiAgVGh1cywgaGFyZF9jdXJyZW5jaWVzIHBvaW50cyB0byBhIHBsYWNlCit3aGVyZSB0aGUgYXJyYXkgdmFsdWVzIG1heSBiZSBmb3VuZC4gIFdoZW4gc29tZW9uZSBpcyB0YWxraW5nIGFib3V0Cit0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXksIHRoZXkgd2FudCB0aGUgZWxlbWVudCBsb2NhdGVkIGF0IDE3OTAwMC4gCitXaGVuIHRoZSBvYmplY3QgbmVlZHMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUgYXJyYXksIGl0Citsb29rcyBhdCAxNzkwMDAgKyBvbmUgdmFsdWUsIHRoZW4gMTc5MDAwIHBsdXMgdHdvIHZhbHVlcyBmb3IgdGhlIHRoaXJkLAorYW5kIHNvIG9uLiAgV2UgY2FuIHRoZXJlZm9yZSBhY2Nlc3MgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheSBieQordGhlaXIgaW5kZXgsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdmFsdWVzIGJleW9uZCB0aGUgc3RhcnRpbmcgcG9pbnQgb2YKK3RoZSBhcnJheSB3ZSBuZWVkIHRvIGxvb2sgdG8gZmluZCB0aGUgdmFsdWUuICBGb3IgdGhlIGFycmF5CitoYXJkX2N1cnJlbmNpZXMgYXJyYXk6CisicGxhdGludW0iIGhhcyBhbiBpbmRleCBvZiAwLgorImdvbGQiIGhhcyBhbiBpbmRleCBvZiAxLgorImVsZWN0cnVtIiBoYXMgYW4gaW5kZXggb2YgMi4KKyJzaWx2ZXIiIGhhcyBhbiBpbmRleCBvZiAzLgorImNvcHBlciIgaGFzIGFuIGluZGV4IG9mIDQuCisKK1RoZSBlZnVuIG1lbWJlcl9hcnJheSgpIHRodXMgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgYmVpbmcKK3Rlc3RlZCBpZiBpdCBpcyBpbiB0aGUgYXJyYXksIG9yIC0xIGlmIGl0IGlzIG5vdCBpbiB0aGUgYXJyYXkuICBJbiBvcmRlciB0bworcmVmZXJlbmNlIGFuIGluZGl2aWR1YWwgZWxlbWVudCBpbiBhbiBhcnJheSwgeW91IHVzZSBpdHMgaW5kZXggbnVtYmVyIGluCit0aGUgZm9sbG93aW5nIG1hbm5lcjoKK2FycmF5X25hbWVbaW5kZXhfbm9dCitFeGFtcGxlOgoraGFyZF9jdXJyZW5jaWVzWzNdCit3aGVyZSBoYXJkX2N1cnJlbmNpZXNbM10gd291bGQgcmVmZXIgdG8gInNpbHZlciIuCisKK1NvLCB5b3Ugbm93IHNob3VsZCBub3cgc2V2ZXJhbCB3YXlzIGluIHdoaWNoIGFycmF5cyBhcHBlYXIgZWl0aGVyIGFzCithIHdob2xlIG9yIGFzIGluZGl2aWR1YWwgZWxlbWVudHMuICBBcyBhIHdob2xlLCB5b3UgcmVmZXIgdG8gYW4gYXJyYXkKK3ZhcmlhYmxlIGJ5IGl0cyBuYW1lIGFuZCBhbiBhcnJheSBjb25zdGFudCBieSBlbmNsb3NpbmcgdGhlIGFycmF5IGluICh7IH0pCithbmQgc2VwYXJhdGluZyBlbGVtZW50cyBieSAsLiAgSW5kaXZpZHVhbGx5LCB5b3UgcmVmZXIgdG8gYXJyYXkgdmFyaWFibGVzCitieSB0aGUgYXJyYXkgbmFtZSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudCdzIGluZGV4IG51bWJlciBlbmNsb3NlZCBpbgorW10sIGFuZCB0byBhcnJheSBjb25zdGFudHMgaW4gdGhlIHNhbWUgd2F5IHlvdSB3b3VsZCByZWZlciB0byBzaW1wbGUgZGF0YQordHlwZXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgY29uc3RhbnQuICBFeGFtcGxlczoKKworV2hvbGUgYXJyYXlzOgordmFyaWFibGU6ICBhcnIKK2NvbnN0YW50OiAoeyAicGxhdGludW0iLCAiZ29sZCIsICJlbGVjdHJ1bSIsICJzaWx2ZXIiLCAiY29wcGVyIiB9KQorCitJbmRpdmlkdWFsIG1lbWJlcnMgb2YgYXJyYXlzOgordmFyaWFibGU6IGFyclsyXQorY29uc3RhbnQ6ICJlbGVjdHJ1bSIKKworWW91IGNhbiB1c2UgdGhlc2UgbWVhbnMgb2YgcmVmZXJlbmNlIHRvIGRvIGFsbCB0aGUgdGhpbmdzIHlvdSBhcmUgdXNlZCB0bworZG9pbmcgd2l0aCBvdGhlciBkYXRhIHR5cGVzLiAgWW91IGNhbiBhc3NpZ24gdmFsdWVzLCB1c2UgdGhlIHZhbHVlcyBpbgorb3BlcmF0aW9ucywgcGFzcyB0aGUgdmFsdWVzIGFzIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLCBhbmQgdXNlIHRoZQordmFsdWVzIGFzIHJldHVybiB0eXBlcy4gIEl0IGlzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHdoZW4geW91IGFyZQordHJlYXRpbmcgYW4gZWxlbWVudCBhbG9uZSBhcyBhbiBpbmRpdmlkdWFsLCB0aGUgaW5kaXZpZHVhbCBlbGVtZW50IGlzIG5vdAoraXRzZWxmIGFuIGFycmF5ICh1bmxlc3MgeW91IGFyZSBkZWFsaW5nIHdpdGggYW4gYXJyYXkgb2YgYXJyYXlzKS4gIEluIHRoZQorZXhhbXBsZSBhYm92ZSwgdGhlIGluZGl2aWR1YWwgZWxlbWVudHMgYXJlIHN0cmluZ3MuICBTbyB0aGF0OgorICAgIHN0ciA9IGFyclszXSArICIgYW5kICIgKyBhcnJbMV07Cit3aWxsIGNyZWF0ZSBzdHIgdG8gZXF1YWwgInNpbHZlciBhbmQgZ29sZCIuICBBbHRob3VnaCB0aGlzIHNlZW1zIHNpbXBsZQorZW5vdWdoLCBtYW55IHBlb3BsZSBuZXcgdG8gYXJyYXlzIHN0YXJ0IHRvIHJ1biBpbnRvIHRyb3VibGUgd2hlbiB0cnlpbmcKK3RvIGFkZCBlbGVtZW50cyB0byBhbiBhcnJheS4gIFdoZW4geW91IGFyZSB0cmVhdGluZyBhbiBhcnJheSBhcyBhIHdob2xlCithbmQgeW91IHdpc2ggdG8gYWRkIGEgbmV3IGVsZW1lbnQgdG8gaXQsIHlvdSBtdXN0IGRvIGl0IGJ5IGFkZGluZworYW5vdGhlciBhcnJheS4KKworTm90ZSB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CitzdHJpbmcgc3RyMSwgc3RyMjsKK3N0cmluZyAqYXJyOworCitzdHIxID0gImhpIjsKK3N0cjIgPSAiYnllIjsKKy8qIHN0cjEgKyBzdHIyIGVxdWFscyAiaGlieWUiICovCithcnIgPSAoeyBzdHIxIH0pICsgKHsgc3RyMiB9KTsKKy8qIGFyciBpcyBlcXVhbCB0byAoeyBzdHIxLCBzdHIyIH0pICovCitCZWZvcmUgZ29pbmcgYW55IGZ1cnRoZXIsIEkgaGF2ZSB0byBub3RlIHRoYXQgdGhpcyBleGFtcGxlIGdpdmVzIGFuCitleHRyZW1lbHkgaG9ycmlibGUgd2F5IG9mIGJ1aWxkaW5nIGFuIGFycmF5LiAgWW91IHNob3VsZCBzZXQgaXQ6IGFyciA9ICh7CitzdHIxLCBzdHIyIH0pLiAgVGhlIHBvaW50IG9mIHRoZSBleGFtcGxlLCBob3dldmVyLCBpcyB0aGF0IHlvdSBtdXN0IGFkZAorbGlrZSB0eXBlcyB0b2dldGhlci4gIElmIHlvdSB0cnkgYWRkaW5nIGFuIGVsZW1lbnQgdG8gYW4gYXJyYXkgYXMgdGhlIGRhdGEKK3R5cGUgaXQgaXMsIHlvdSB3aWxsIGdldCBhbiBlcnJvci4gIEluc3RlYWQgeW91IGhhdmUgdG8gdHJlYXQgaXQgYXMgYW4gYXJyYXkgb2YKK2Egc2luZ2xlIGVsZW1lbnQuCisKKzMuNSBNYXBwaW5ncworT25lIG9mIHRoZSBtYWpvciBhZHZhbmNlcyBtYWRlIGluIExQTXVkcyBzaW5jZSB0aGV5IHdlcmUgY3JlYXRlZCBpcwordGhlIG1hcHBpbmcgZGF0YSB0eXBlLiAgUGVvcGxlIGFsdGVybmF0ZWx5IHJlZmVyIHRvIHRoZW0gYXMgYXNzb2NpYXRpdmUKK2FycmF5cy4gIFByYWN0aWNhbGx5IHNwZWFraW5nLCBhIG1hcHBpbmcgYWxsb3dzIHlvdSBmcmVlZG9tIGZyb20gdGhlCithc3NvY2lhdGlvbiBvZiBhIG51bWVyaWNhbCBpbmRleCB0byBhIHZhbHVlIHdoaWNoIGFycmF5cyByZXF1aXJlLiAKK0luc3RlYWQsIG1hcHBpbmdzIGFsbG93IHlvdSB0byBhc3NvY2lhdGUgdmFsdWVzIHdpdGggaW5kaWNlcyB3aGljaAorYWN0dWFsbHkgaGF2ZSBtZWFuaW5nIHRvIHlvdSwgbXVjaCBsaWtlIGEgcmVsYXRpb25hbCBkYXRhYmFzZS4KKworSW4gYW4gYXJyYXkgb2YgNSBlbGVtZW50cywgeW91IGFjY2VzcyB0aG9zZSB2YWx1ZXMgc29sZWx5IGJ5IHRoZWlyIGludGVnZXIKK2luZGljZXMgd2hpY2ggY292ZXIgdGhlIHJhbmdlIDAgdG8gNC4gIEltYWdpbmUgZ29pbmcgYmFjayB0byB0aGUgZXhhbXBsZQorb2YgbW9uZXkgYWdhaW4uICBQbGF5ZXJzIGhhdmUgbW9uZXkgb2YgZGlmZmVyZW50IGFtb3VudHMgYW5kIGRpZmZlcmVudAordHlwZXMuICBJbiB0aGUgcGxheWVyIG9iamVjdCwgeW91IG5lZWQgYSB3YXkgdG8gc3RvcmUgdGhlIHR5cGVzIG9mIG1vbmV5Cit0aGF0IGV4aXN0IGFzIHdlbGwgYXMgcmVsYXRlIHRoZW0gdG8gdGhlIGFtb3VudCBvZiB0aGF0IGN1cnJlbmN5IHR5cGUgdGhlCitwbGF5ZXIgaGFzLiAgVGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMgd2l0aCBhcnJheXMgd291bGQgaGF2ZSBiZWVuIHRvCitzdG9yZSBhbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBtb25leSB0eXBlcyBhbmQgYW4gYXJyYXkgb2YKK2ludGVnZXJzIHJlcHJlc2VudGluZyB2YWx1ZXMgaW4gdGhlIHBsYXllciBvYmplY3QuICBUaGlzIHdvdWxkIHJlc3VsdCBpbgorQ1BVLWVhdGluZyB1Z2x5IGNvZGUgbGlrZSB0aGlzOgorCitpbnQgcXVlcnlfbW9uZXkoc3RyaW5nIHR5cGUpIHsKKyAgICBpbnQgaTsKKworICAgIGkgPSBtZW1iZXJfYXJyYXkodHlwZSwgY3VycmVuY2llcyk7CisgICAgaWYoaT4tMSAmJiBpIDwgc2l6ZW9mKGFtb3VudHMpKSAgLyogc2l6ZW9mIGVmdW4KK3JldHVybnMgIyBvZiBlbGVtZW50cyAqLworICAgICAgICByZXR1cm4gYW1vdW50c1tpXTsKKyAgICBlbHNlIHJldHVybiAwOworfQorCitBbmQgdGhhdCBpcyBhIHNpbXBsZSBxdWVyeSBmdW5jdGlvbi4gIExvb2sgYXQgYW4gYWRkIGZ1bmN0aW9uOgorCit2b2lkIGFkZF9tb25leShzdHJpbmcgdHlwZSwgaW50IGFtdCkgeworICAgIHN0cmluZyAqdG1wMTsKKyAgICBpbnQgKiB0bXAyOworICAgIGludCBpLCB4LCBqLCBtYXhqOworICAgIAorICAgIGkgPSBtZW1iZXJfYXJyYXkodHlwZSwgY3VycmVuY2llcyk7CisgICAgaWYoaSA+PSBzaXplb2YoYW1vdW50cykpIC8qICBjb3JydXB0IGRhdGEsIHdlIGFyZSBpbgorICAgICAgYSBiYWQgd2F5ICovCisgICAgICAgIHJldHVybjsKKyAgICBlbHNlIGlmKGk9PSAtMSkgeworICAgICAgICBjdXJyZW5jaWVzICs9ICh7IHR5cGUgfSk7CisgICAgICAgIGFtb3VudHMgKz0gKHsgYW10IH0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbW91bnRzW2ldICs9IGFtdDsKKyAgICAgICAgaWYoYW1vdW50c1tpXSA8IDEpIHsKKyAgICAgICAgICAgIHRtcDEgPSBhbGxvY2F0ZShzaXplb2YoY3VycmVuY2llcyktMSk7CisgICAgICAgICAgICB0bXAyID0gYWxsb2NhdGUoc2l6ZW9mKGFtb3VudHMpLTEpOworICAgICAgICAgICAgZm9yKGo9MCwgeCA9MCwgbWF4aj1zaXplb2YodG1wMSk7IGogPCBtYXhqOworICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgICAgICBpZihqPT1pKSB4ID0gMTsKKyAgICAgICAgICAgICAgICB0bXAxW2pdID0gY3VycmVuY2llc1tqK3hdOworICAgICAgICAgICAgICAgIHRtcDJbal0gPSBhbW91bnRzW2oreF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW5jaWVzID0gdG1wMTsKKyAgICAgICAgICAgIGFtb3VudHMgPSB0bXAyOworICAgICAgICB9CisgICAgfQorfQorCitUaGF0IGlzIHJlYWxseSBzb21lIG5hc3R5IGNvZGUgdG8gcGVyZm9ybSB0aGUgcmF0aGVyIHNpbXBsZSBjb25jZXB0IG9mCithZGRpbmcgc29tZSBtb25leS4gIEZpcnN0LCB3ZSBmaWd1cmUgb3V0IGlmIHRoZSBwbGF5ZXIgaGFzIGFueSBvZiB0aGF0CitraW5kIG9mIG1vbmV5LCBhbmQgaWYgc28sIHdoaWNoIGVsZW1lbnQgb2YgdGhlIGN1cnJlbmNpZXMgYXJyYXkgaXQgaXMuIAorQWZ0ZXIgdGhhdCwgd2UgaGF2ZSB0byBjaGVjayB0byBzZWUgdGhhdCB0aGUgaW50ZWdyaXR5IG9mIHRoZSBjdXJyZW5jeSBkYXRhCitoYXMgYmVlbiBtYWludGFpbmVkLiAgSWYgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSBjdXJyZW5jaWVzIGFycmF5IGlzCitncmVhdGVyIHRoYW4gdGhlIGhpZ2hlc3QgaW5kZXggb2YgdGhlIGFtb3VudHMgYXJyYXksIHRoZW4gd2UgaGF2ZSBhCitwcm9ibGVtIHNpbmNlIHRoZSBpbmRpY2VzIGFyZSBvdXIgb25seSB3YXkgb2YgcmVsYXRpbmcgdGhlIHR3byBhcnJheXMuIAorT25jZSB3ZSBrbm93IG91ciBkYXRhIGlzIGluIHRhY3QsIGlmIHRoZSBjdXJyZW5jeSB0eXBlIGlzIG5vdCBjdXJyZW50bHkKK2hlbGQgYnkgdGhlIHBsYXllciwgd2Ugc2ltcGx5IHRhY2sgb24gdGhlIHR5cGUgYXMgYSBuZXcgZWxlbWVudCB0byB0aGUKK2N1cnJlbmNpZXMgYXJyYXkgYW5kIHRoZSBhbW91bnQgYXMgYSBuZXcgZWxlbWVudCB0byB0aGUgYW1vdW50cyBhcnJheS4gCitGaW5hbGx5LCBpZiBpdCBpcyBhIGN1cnJlbmN5IHRoZSBwbGF5ZXIgY3VycmVudGx5IGhhcywgd2UganVzdCBhZGQgdGhlCithbW91bnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4gdGhlIGFtb3VudHMgYXJyYXkuICBJZiB0aGUgbW9uZXkKK2dldHMgYmVsb3cgMSwgbWVhbmluZyBoYXZpbmcgbm8gbW9uZXkgb2YgdGhhdCB0eXBlLCB3ZSB3YW50IHRvIGNsZWFyCit0aGUgY3VycmVuY3kgb3V0IG9mIG1lbW9yeS4KKworU3VidHJhY3RpbmcgYW4gZWxlbWVudCBmcm9tIGFuIGFycmF5IGlzIG5vIHNpbXBsZSBtYXR0ZXIuICBUYWtlLCBmb3IKK2V4YW1wbGUsIHRoZSByZXN1bHQgb2YgdGhlIGZvbGxvd2luZzoKKworc3RyaW5nICphcnI7CisKK2FyciA9ICh7ICJhIiwgImIiLCAiYSIgfSk7CithcnIgLT0gKHsgYXJyWzJdIH0pOworCitXaGF0IGRvIHlvdSB0aGluayB0aGUgZmluYWwgdmFsdWUgb2YgYXJyIGlzPyBXZWxsLCBpdCBpczoKKyAgICAoeyAiYiIsICJhIiB9KQorU3VidHJhY3RpbmcgYXJyWzJdIGZyb20gdGhlIG9yaWdpbmFsIGFycmF5IGRvZXMgbm90IHJlbW92ZSB0aGUgdGhpcmQKK2VsZW1lbnQgZnJvbSB0aGUgYXJyYXkuICBJbnN0ZWFkLCBpdCBzdWJ0cmFjdHMgdGhlIHZhbHVlIG9mIHRoZSB0aGlyZAorZWxlbWVudCBvZiB0aGUgYXJyYXkgZnJvbSB0aGUgYXJyYXkuICBBbmQgYXJyYXkgc3VidHJhY3Rpb24gcmVtb3ZlcyB0aGUKK2ZpcnN0IGluc3RhbmNlIG9mIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheS4gIFNpbmNlIHdlIGRvIG5vdCB3YW50IHRvIGJlCis8KiBOT1RFIEhpZ2hsYW5kZXJATW9yZ2VuR3JhdWVuIDExLjIuOTQ6CisJV1JPTkcgaW4gTW9yZ2VuR3JhdWVuIChhdCBsZWFzdCkuIFRoZSByZXN1bHQgaXMgYWN0dWFsbHkgKHsgImIiIH0pLiBBcnJheQorCXN1YnRyYWN0aW9uIHJlbW92ZXMgQUxMIGluc3RhbmNlcyBvZiB0aGUgc3VidHJhY3RlZCB2YWx1ZSBmcm9tIHRoZSBhcnJheS4KKwlUaGlzIGhvbGRzIHRydWUgZm9yIGFsbCBBbXlsYWFyLWRyaXZlciBMUE11ZHMuCisqPgorZm9yY2VkIG9uIGNvdW50aW5nIG9uIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgYXMgYmVpbmcgdW5pcXVlLCB3ZSBhcmUKK2ZvcmNlZCB0byBnbyB0aHJvdWdoIHNvbWUgc29tZXJzYXVsdHMgdG8gcmVtb3ZlIHRoZSBjb3JyZWN0IGVsZW1lbnQKK2Zyb20gYm90aCBhcnJheXMgaW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIGNvcnJlc3BvbmRlbmNlIG9mIHRoZSBpbmRpY2VzCitpbiB0aGUgdHdvIGFycmF5cy4KKworTWFwcGluZ3MgcHJvdmlkZSBhIGJldHRlciB3YXkuICBUaGV5IGFsbG93IHlvdSB0byBkaXJlY3RseSBhc3NvY2lhdGUgdGhlCittb25leSB0eXBlIHdpdGggaXRzIHZhbHVlLiAgU29tZSBwZW9wbGUgdGhpbmsgb2YgbWFwcGluZ3MgYXMgYXJyYXlzCit3aGVyZSB5b3UgYXJlIG5vdCByZXN0cmljdGVkIHRvIGludGVnZXJzIGFzIGluZGljZXMuICBUcnV0aCBpcywgbWFwcGluZ3MKK2FyZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQgY29uY2VwdCBpbiBzdG9yaW5nIGFnZ3JlZ2F0ZSBpbmZvcm1hdGlvbi4gIEFycmF5cworZm9yY2UgeW91IHRvIGNob29zZSBhbiBpbmRleCB3aGljaCBpcyBtZWFuaW5nZnVsIHRvIHRoZSBtYWNoaW5lIGZvcgorbG9jYXRpbmcgdGhlIGFwcHJvcHJpYXRlIGRhdGEuICBUaGUgaW5kaWNlcyB0ZWxsIHRoZSBtYWNoaW5lIGhvdyBtYW55CitlbGVtZW50cyBiZXlvbmQgdGhlIGZpcnN0IHZhbHVlIHRoZSB2YWx1ZSB5b3UgZGVzaXJlIGNhbiBiZSBmb3VuZC4gIFdpdGgKK21hcHBpbmdzLCB5b3UgY2hvb3NlIGluZGljZXMgd2hpY2ggYXJlIG1lYW5pbmdmdWwgdG8geW91IHdpdGhvdXQKK3dvcnJ5aW5nIGFib3V0IGhvdyB0aGF0IG1hY2hpbmUgbG9jYXRlcyBhbmQgc3RvcmVzIGl0LgorCitZb3UgbWF5IHJlY29nbml6ZSBtYXBwaW5ncyBpbiB0aGUgZm9sbG93aW5nIGZvcm1zOgorCitjb25zdGFudCB2YWx1ZXM6Cit3aG9sZTogKFsgaW5kZXg6dmFsdWUsIGluZGV4OnZhbHVlIF0pIEV4OiAoWyAiZ29sZCI6MTAsICJzaWx2ZXIiOjIwIF0pCitlbGVtZW50OiAgMTAKKwordmFyaWFibGUgdmFsdWVzOgord2hvbGU6ICAgIG1hcCAgICh3aGVyZSBtYXAgaXMgdGhlIG5hbWUgb2YgYSBtYXBwaW5nIHZhcmlhYmxlKQorZWxlbWVudDogbWFwWyJnb2xkIl0KKworU28gbm93IG15IG1vbmV0YXJ5IGZ1bmN0aW9ucyB3b3VsZCBsb29rIGxpa2U6CisKK2ludCBxdWVyeV9tb25leShzdHJpbmcgdHlwZSkgeyByZXR1cm4gbW9uZXlbdHlwZV07IH0KKwordm9pZCBhZGRfbW9uZXkoc3RyaW5nIHR5cGUsIGludCBhbXQpIHsKKyAgICBpZighbW9uZXlbdHlwZV0pIG1vbmV5W3R5cGVdID0gYW10OworICAgIGVsc2UgbW9uZXlbdHlwZV0gKz0gYW10OworICAgIGlmKG1vbmV5W3R5cGVdIDwgMSkKKyAgICAgIG1hcF9kZWxldGUobW9uZXksIHR5cGUpOyAgICAgICAgICAvKiB0aGlzIGlzIGZvcgorICAgICAgICAgIE11ZE9TICovCisgICAgICAgICAgICAuLi5PUi4uLiAKKyAgICAgICAgICAgIG1vbmV5ID0gbV9kZWxldGUobW9uZXksIHR5cGUpICAvKiBmb3Igc29tZQorICAgICAgICAgIExQTXVkIDMuKiB2YXJpZXRpZXMgKi8KKyAgICAgICAgICAgIC4uLiBPUi4uLiAKKyAgICAgICAgIG1fZGVsZXRlKG1vbmV5LCB0eXBlKTsgICAgLyogZm9yIG90aGVyIExQTXVkIDMuKgorICAgICAgICAgIHZhcmlldGllcyAqLworfQorCitQbGVhc2Ugbm90aWNlIGZpcnN0IHRoYXQgdGhlIGVmdW5zIGZvciBjbGVhcmluZyBhIG1hcHBpbmcgZWxlbWVudCBmcm9tIHRoZQorbWFwcGluZyB2YXJ5IGZyb20gZHJpdmVyIHRvIGRyaXZlci4gIENoZWNrIHdpdGggeW91ciBkcml2ZXIncworZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGV4YWN0IG5hbWUgYW4gc3ludGF4IG9mIHRoZSByZWxldmFudCBlZnVuLgorCitBcyB5b3UgY2FuIHNlZSBpbW1lZGlhdGVseSwgeW91IGRvIG5vdCBuZWVkIHRvIGNoZWNrIHRoZSBpbnRlZ3JpdHkgb2YKK3lvdXIgZGF0YSBzaW5jZSB0aGUgdmFsdWVzIHdoaWNoIGludGVyZXN0IHlvdSBhcmUgaW5leHRyaWNhYmx5IGJvdW5kIHRvCitvbmUgYW5vdGhlciBpbiB0aGUgbWFwcGluZy4gIFNlY29uZGx5LCBnZXR0aW5nIHJpZCBvZiB1c2VsZXNzIHZhbHVlcyBpcyBhCitzaW1wbGUgZWZ1biBjYWxsIHJhdGhlciB0aGFuIGEgdHJpY2t5LCBDUFUtZWF0aW5nIGxvb3AuICBGaW5hbGx5LCB0aGUKK3F1ZXJ5IGZ1bmN0aW9uIGlzIG1hZGUgdXAgc29sZWx5IG9mIGEgcmV0dXJuIGluc3RydWN0aW9uLiAKKworWW91IG11c3QgZGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBhbnkgbWFwcGluZyBiZWZvcmUgdXNpbmcgaXQuIAorRGVjbGFyYXRpb25zIGxvb2sgbGlrZToKK21hcHBpbmcgbWFwOworV2hlcmVhcyBjb21tb24gaW5pdGlhbGl6YXRpb25zIGxvb2sgbGlrZToKK21hcCA9IChbXSk7CittYXAgPSBtX2FsbG9jYXRlKDEwKSAgIC4uLk9SLi4uICAgbWFwID0gbV9hbGxvY2F0ZSgxMCk7CittYXAgPSAoWyAiZ29sZCI6IDIwLCAic2lsdmVyIjogMTUgXSk7CisKK0FzIHdpdGggb3RoZXIgZGF0YSB0eXBlcywgdGhlcmUgYXJlIHJ1bGVzIGRlZmluaW5nIGhvdyB0aGV5IHdvcmsgaW4KK2NvbW1vbiBvcGVyYXRpb25zIGxpa2UgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uOgorICAgIChbICJnb2xkIjoyMCwgInNpbHZlciI6MzAgXSkgKyAoWyAiZWxlY3RydW0iOjUgXSkgCitnaXZlczoKKyAgICAoWyJnb2xkIjoyMCwgInNpbHZlciI6MzAsICJlbGVjdHJ1bSI6NV0pICAgCitBbHRob3VnaCBteSBkZW1vbnN0cmF0aW9uIHNob3dzIGEgY29udGludWl0eSBvZiBvcmRlciwgdGhlcmUgaXMgaW4gZmFjdAorbm8gZ3VhcmFudGVlIG9mIHRoZSBvcmRlciBpbiB3aGljaCBlbGVtZW50cyBvZiBtYXBwaW5ncyB3aWxsIHN0b3JlZC4gCitFcXVpdmFsZW5jZSB0ZXN0cyBhbW9uZyBtYXBwaW5ncyBhcmUgdGhlcmVmb3JlIG5vdCBhIGdvb2QgdGhpbmcuCisKKzMuNiBTdW1tYXJ5CitNYXBwaW5ncyBhbmQgYXJyYXlzIGNhbiBiZSBidWlsdCBhcyBjb21wbGV4IGFzIHlvdSBuZWVkIHRoZW0gdG8gYmUuIAorWW91IGNhbiBoYXZlIGFuIGFycmF5IG9mIG1hcHBpbmdzIG9mIGFycmF5cy4gIFN1Y2ggYSB0aGluZyB3b3VsZCBiZQorZGVjbGFyZWQgbGlrZSB0aGlzOgorCittYXBwaW5nICptYXBfb2ZfYXJyczsKK3doaWNoIG1pZ2h0IGxvb2sgbGlrZToKKyh7IChbIGluZDE6ICh7IHZhbEExLCB2YWxBMn0pLCBpbmQyOiAoe3ZhbEIxLCB2YWxCMn0pIF0pLCAoWyBpbmRYOgorKHt2YWxYMSx2YWxYMn0pIF0pIH0pCisKK01hcHBpbmdzIG1heSB1c2UgYW55IGRhdGEgdHlwZSBhcyBhbiBpbmRleCwgaW5jbHVkaW5nIG9iamVjdHMuIAorTWFwcGluZyBpbmRpY2VzIGFyZSBvZnRlbiByZWZlcnJlZCB0byBhcyBrZXlzIGFzIHdlbGwsIGEgdGVybSBmcm9tCitkYXRhYmFzZXMuICBBbHdheXMga2VlcCBpbiBtaW5kIHRoYXQgd2l0aCBhbnkgbm9uLWludGVnZXIgZGF0YSB0eXBlLAoreW91IG11c3QgZmlyc3QgaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIGJlZm9yZSBtYWtpbmcgdXNlIG9mIGl0IGluIGNvbW1vbgorb3BlcmF0aW9ucyBzdWNoIGFzIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbi4gIEluIHNwaXRlIG9mIHRoZSBlYXNlIGFuZAorZHluYW1pY3MgYWRkZWQgdG8gTFBDIGNvZGluZyBieSBtYXBwaW5ncyBhbmQgYXJyYXlzLCBlcnJvcnMgY2F1c2VkCitieSBmYWlsaW5nIHRvIGluaXRpYWxpemUgdGhlaXIgdmFsdWVzIGNhbiBiZSB0aGUgbW9zdCBtYWRkZW5pbmcgZXhwZXJpZW5jZQorZm9yIHBlb3BsZSBuZXcgdG8gdGhlc2UgZGF0YSB0eXBlcy4gIEkgd291bGQgdmVudHVyZSB0aGF0IGEgdmVyeSBoaWdoCitwZXJjZW50YWdlIG9mIGFsbCBlcnJvcnMgcGVvcGxlIGV4cGVyaW1lbnRpbmcgd2l0aCBtYXBwaW5ncyBhbmQgYXJyYXlzCitmb3IgdGhlIGZpcnN0IHRpbWUgZW5jb3VudGVyIGFyZSBvbmUgb2YgdGhyZWUgZXJyb3IgbWVzc2FnZXM6CisJSW5kZXhpbmcgb24gaWxsZWdhbCB0eXBlLgorCUlsbGVnYWwgaW5kZXguCisJQmFkIGFyZ3VtZW50IDEgdG8gKCsgKz0gLSAtPSkgLyogaW5zZXJ0IHlvdXIgZmF2b3VyaXRlIG9wZXJhdG9yICovCitFcnJvciBtZXNzYWdlcyAxIGFuZCAzIGFyZSBkYXJuIG5lYXIgYWxtb3N0IGFsd2F5cyBjYXVzZWQgYnkgYSBmYWlsdXJlCit0byBpbml0aWFsaXplIHRoZSBhcnJheSBvciBtYXBwaW5nIGluIHF1ZXN0aW9uLiAgRXJyb3IgbWVzc2FnZSAyIGlzIGNhdXNlZAorZ2VuZXJhbGx5IHdoZW4geW91IGFyZSB0cnlpbmcgdG8gdXNlIGFuIGluZGV4IGluIGFuIGluaXRpYWxpemVkIGFycmF5Cit3aGljaCBkb2VzIG5vdCBleGlzdC4gIEFsc28sIGZvciBhcnJheXMsIG9mdGVuIHBlb3BsZSBuZXcgdG8gYXJyYXlzIHdpbGwKK2dldCBlcnJvciBtZXNzYWdlIDMgYmVjYXVzZSB0aGV5IHRyeSB0byBhZGQgYSBzaW5nbGUgZWxlbWVudCB0byBhbiBhcnJheQorYnkgYWRkaW5nIHRoZSBpbml0aWFsIGFycmF5IHRvIHRoZSBzaW5nbGUgZWxlbWVudCB2YWx1ZSBpbnN0ZWFkIG9mIGFkZGluZworYW4gYXJyYXkgb2YgdGhlIHNpbmdsZSBlbGVtZW50IHRvIHRoZSBpbml0aWFsIGFycmF5LiAgUmVtZW1iZXIsIGFkZCBvbmx5CithcnJheXMgdG8gYXJyYXlzLgorCitBdCB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIGZlZWwgY29tZm9ydGFibGUgZW5vdWdoIHdpdGggbWFwcGluZ3MgYW5kCithcnJheXMgdG8gcGxheSB3aXRoIHRoZW0uICBFeHBlY3QgdG8gZW5jb3VudGVyIHRoZSBhYm92ZSBlcnJvciBtZXNzYWdlcworYSBsb3Qgd2hlbiBmaXJzdCBwbGF5aW5nIHdpdGggdGhlc2UuICBUaGUga2V5IHRvIHN1Y2Nlc3Mgd2l0aCBtYXBwaW5ncyBpcworaW4gZGVidWdnaW5nIGFsbCBvZiB0aGVzZSBlcnJvcnMgYW5kIHNlZWluZyBleGFjdGx5IHdoYXQgY2F1c2VzIHdob2xlcworaW4geW91ciBwcm9ncmFtbWluZyB3aGljaCBhbGxvdyB5b3UgdG8gdHJ5IHRvIHdvcmsgd2l0aCB1bmluaXRpYWxpemVkCittYXBwaW5ncyBhbmQgYXJyYXlzLiAgRmluYWxseSwgZ28gYmFjayB0aHJvdWdoIHRoZSBiYXNpYyByb29tIGNvZGUgYW5kCitsb29rIGF0IHRoaW5ncyBsaWtlIHRoZSBzZXRfZXhpdHMoKSAob3IgdGhlIGVxdWl2YWxlbnQgb24geW91ciBtdWRsaWIpCitmdW5jdGlvbi4gIENoYW5jZXMgYXJlIGl0IG1ha2VzIHVzZSBvZiBtYXBwaW5ncy4gIEluIHNvbWUgaW5zdGFuY2VzLCBpdAord2lsbCB1c2UgYXJyYXlzIGFzIHdlbGwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBtdWRsaWIubi4KKworQ29weXJpZ2h0IChjKSBHZW9yZ2UgUmVlc2UgMTk5MwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI0IGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTk5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjQKQEAgLTAsMCArMSwxOTUgQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnCitOb3ZlbWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hhcHRlciA0OiBUaGUgTFBDIFByZS1Db21waWxlcgorCis0LjEgUmV2aWV3CitUaGUgcHJldmlvdXMgY2hhcHRlciB3YXMgcXVpdGUgaGVhdnksIHNvIG5vdyBJIHdpbGwgc2xvdyBkb3duIGEgYml0IHNvCit5b3UgY2FuIGRpZ2VzdCBhbmQgcGxheSB3aXRoIG1hcHBpbmdzIGFuZCBhcnJheXMgYnkgdGFraW5nIG9uIHRoZQorcmF0aGVyIHNpbXBsZSB0b3BpYyBvZiB0aGUgTFBDIHByZS1jb21waWxlci4gIEJ5IHRoaXMgcG9pbnQsIGhvd2V2ZXIsCit5b3Ugc2hvdWxkIHdlbGwgdW5kZXJzdGFuZCBob3cgdGhlIGRyaXZlciBpbnRlcmFjdHMgd2l0aCB0aGUgbXVkbGliIGFuZAorYmUgYWJsZSB0byBjb2RlIG9iamVjdHMgd2hpY2ggdXNlIGNhbGwgb3V0cyBhbmQgaGVhcnQgYmVhdHMuICBJbiBhZGRpdGlvbiwKK3lvdSBzaG91bGQgYmUgY29kaW5nIHNpbXBsZSBvYmplY3RzIHdoaWNoIHVzZSBtYXBwaW5ncyBhbmQgYXJyYXlzLAorbm90aW5nIGhvdyB0aGVzZSBkYXRhIHR5cGVzIHBlcmZvcm0gaW4gb2JqZWN0cy4gIEl0IGlzIGFsc28gYSBnb29kIGlkZWEgdG8KK3N0YXJ0IGxvb2tpbmcgaW4gZGV0YWlsIGF0IHRoZSBhY3R1YWwgbXVkbGliIGNvZGUgdGhhdCBtYWtlcyB1cCB5b3VyIG11ZC4gCitTZWUgaWYgeW91IHVuZGVyc3RhbmQgZXZlcnl0aGluZyB3aGljaCBpcyBnb2luZyBvbiBpbiB5b3VyIG11ZGxpYnMKK3Jvb20gYW5kIG1vbnN0ZXIgY29kZXMuICBGb3IgdGhpbmdzIHlvdSBkbyBub3QgdW5kZXJzdGFuZCwgYXNrIHRoZQorcGVvcGxlIG9uIHlvdXIgbXVkIGRlc2lnbmF0ZWQgdG8gYW5zd2VyIGNyZWF0b3IgY29kaW5nIHF1ZXN0aW9ucy4KKworUHJlLWNvbXBpbGVyIGlzIGFjdHVhbGx5IGEgYml0IG9mIGEgbWlzbm9tZXIgc2luY2UgTFBDIGNvZGUgaXMgbmV2ZXIKK3RydWx5IGNvbXBpbGVkLiAgQWx0aG91Z2ggdGhpcyBpcyBjaGFuZ2luZyB3aXRoIHByb3RvdHlwZXMgb2YgbmV3ZXIKK0xQQyBkcml2ZXJzLCBMUEMgZHJpdmVycyBpbnRlcnByZXQgdGhlIExQQyBjb2RlIHdyaXR0ZW4gYnkgY3JlYXRvcnMKK3JhdGhlciB0aGFuIGNvbXBpbGUgaXQgaW50byBiaW5hcnkgZm9ybWF0LiAgTmV2ZXJ0aGVsZXNzLCB0aGUgTFBDIHByZS0KK2NvbXBpbGVyIGZ1bmN0aW9ucyBzdGlsbCBwZXJmb3JtIG11Y2ggbGlrZSBwcmUtY29tcGlsZXJzIGZvciBjb21waWxlZAorbGFuZ3VhZ2VzIGluIHRoYXQgcHJlLWNvbXBpbGVyIGRpcmVjdGl2ZXMgYXJlIGludGVycHJldGVkIGJlZm9yZSB0aGUgZHJpdmVyCitldmVuIHN0YXJ0cyB0byBsb29rIGF0IG9iamVjdCBjb2RlLiAKKworNC4yIFByZS1jb21waWxlciBEaXJlY3RpdmVzCitJZiB5b3UgZG8gbm90IGtub3cgd2hhdCBhIHByZS1jb21waWxlciBpcywgeW91IHJlYWxseSBkbyBub3QgbmVlZCB0bword29ycnkuICBXaXRoIHJlc3BlY3QgdG8gTFBDLCBpdCBpcyBiYXNpY2FsbHkgYSBwcm9jZXNzIHdoaWNoIGhhcHBlbnMKK2JlZm9yZSB0aGUgZHJpdmVyIGJlZ2lucyB0byBpbnRlcnByZXQgTFBDIGNvZGUgd2hpY2ggYWxsb3dzIHlvdSB0bworcGVyZm9ybSBhY3Rpb25zIHVwb24gdGhlIGVudGlyZSBjb2RlIGZvdW5kIGluIHlvdXIgZmlsZS4gIFNpbmNlIHRoZSBjb2RlCitpcyBub3QgeWV0IGludGVycHJldGVkLCB0aGUgcHJlLWNvbXBpbGVyIHByb2Nlc3MgaXMgaW52b2x2ZWQgYmVmb3JlIHRoZSBmaWxlCitleGlzdHMgYXMgYW4gb2JqZWN0IGFuZCBiZWZvcmUgYW55IExQQyBmdW5jdGlvbnMgb3IgaW5zdHJ1Y3Rpb25zIGFyZSBldmVyCitleGFtaW5lZC4gIFRoZSBwcmUtY29tcGlsZXIgaXMgdGh1cyB3b3JraW5nIGF0IHRoZSBmaWxlIGxldmVsLCBtZWFuaW5nCit0aGF0IGl0IGRvZXMgbm90IGRlYWwgd2l0aCBhbnkgY29kZSBpbiBpbmhlcml0ZWQgZmlsZXMuCisKK1RoZSBwcmUtY29tcGlsZXIgc2VhcmNoZXMgYSBmaWxlIHNlbnQgdG8gaXQgZm9yIHByZS1jb21waWxlciBkaXJlY3RpdmVzLiAKK1RoZXNlIGFyZSBsaXR0bGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmaWxlIG1lYW50IG9ubHkgZm9yIHRoZSBwcmUtY29tcGlsZXIKK2FuZCBhcmUgbm90IHJlYWxseSBwYXJ0IG9mIHRoZSBMUEMgbGFuZ3VhZ2UuICBBIHByZS1jb21waWxlciBkaXJlY3RpdmUgaXMKK2FueSBsaW5lIGluIGEgZmlsZSBiZWdpbm5pbmcgd2l0aCBhIHBvdW5kICgjKSBzaWduLiAgUHJlLWNvbXBpbGVyCitkaXJlY3RpdmVzIGFyZSBnZW5lcmFsbHkgdXNlZCB0byBjb25zdHJ1Y3Qgd2hhdCB0aGUgZmluYWwgY29kZSBvZiBhIGZpbGUgd2lsbAorbG9vayBhdC4gIFRoZSBtb3N0IGNvbW1vbiBwcmUtY29tcGlsZXIgZGlyZWN0aXZlcyBhcmU6CisKKyNkZWZpbmUKKyN1bmRlZmluZQorI2luY2x1ZGUKKyNpZmRlZgorI2lmbmRlZgorI2lmCisjZWxzZWlmCisjZWxzZQorI2VuZGlmCisjcHJhZ21hCisKK01vc3QgcmVhbG0gY29kZXJzIG9uIG11ZHMgdXNlIGV4Y2x1c2l2ZWx5IHRoZSBkaXJlY3RpdmVzICNkZWZpbmUgYW5kCisjaW5jbHVkZS4gIFRoZSBvdGhlciBkaXJlY3RpdmVzIHlvdSBtYXkgc2VlIG9mdGVuIGFuZCBzaG91bGQgdW5kZXJzdGFuZAord2hhdCB0aGV5IG1lYW4gZXZlbiBpZiB5b3UgbmV2ZXIgdXNlIHRoZW0uCisKK1RoZSBmaXJzdCBwYWlyIG9mIGRpcmVjdGl2ZXMgYXJlOgorI2RlZmluZQorI3VuZGVmaW5lCisKK1RoZSAjZGVmaW5lIGRpcmVjdGl2ZSBzZXRzIHVwIGEgc2V0IG9mIGNoYXJhY3RlcnMgd2hpY2ggd2lsbCBiZSByZXBsYWNlZAorYW55IHdoZXJlIHRoZXkgZXhpc3QgaW4gdGhlIGNvZGUgYXQgcHJlY29tcGlsZXIgdGltZSB3aXRoIHRoZWlyIGRlZmluaXRpb24uIAorRm9yIGV4YW1wbGUsIHRha2U6CisKKyNkZWZpbmUgT0JfVVNFUiAiL3N0ZC91c2VyIgorCitUaGlzIGRpcmVjdGl2ZSBoYXMgdGhlIHByZS1jb21waWxlciBzZWFyY2ggdGhlIGVudGlyZSBmaWxlIGZvciBpbnN0YW5jZXMgb2YKK09CX1VTRVIuICBFdmVyeXdoZXJlIGl0IHNlZXMgT0JfVVNFUiwgaXQgcmVwbGFjZXMgd2l0aCAiL3N0ZC91c2VyIi4gCis8KiBOT1RFIEhpZ2hsYW5kZXJATW9yZ2VuR3JhdWVuIDExLjIuOTQ6CisJV1JPTkcuIE9CX1VTRVIgd2lsbCBfbm90XyBiZSByZXBsYWNlZCBpZiB3aXRoaW4gIiIgaW4gd2hpY2ggY2FzZSBpdCBpcworCXRyZWF0ZWQgYXMgYSBub3JtYWwgc3RyaW5nLiBTbyBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSB0aGUgdGV4dCBPQl9VU0VSLgorKj4KK05vdGUgdGhhdCBpdCBkb2VzIG5vdCBtYWtlIE9CX1VTRVIgYSB2YXJpYWJsZSBpbiB0aGUgY29kZS4gIFRoZSBMUEMKK2ludGVycHJldGVyIG5ldmVyIHNlZXMgdGhlIE9CX1VTRVIgbGFiZWwuICBBcyBzdGF0ZWQgYWJvdmUsIHRoZSBwcmUtCitjb21waWxlciBpcyBhIHByb2Nlc3Mgd2hpY2ggdGFrZXMgcGxhY2UgYmVmb3JlIGNvZGUgaW50ZXJwcmV0YXRpb24uICBTbword2hhdCB5b3Ugd3JvdGUgYXM6CisKKyNkZWZpbmUgT0JfVVNFUiAiL3N0ZC91c2VyIgorCit2b2lkIGNyZWF0ZSgpIHsKKyAgICBpZighZmlsZV9leGlzdHMoT0JfVVNFUisiLmMiKSkgd3JpdGUoIk1lcmRlISBObyB1c2VyIGZpbGUhIik7CisgICAgZWxzZSB3cml0ZSgiR29vZCEgVXNlciBmaWxlIHN0aWxsIGV4aXN0cyEiKTsKK30KKword291bGQgYXJyaXZlIGF0IHRoZSBMUEMgaW50ZXJwcmV0ZXIgYXM6CisKK3ZvaWQgY3JlYXRlKCkgeworICAgIGlmKCFmaWxlX2V4aXN0cygiL3N0ZC91c2VyIisiLmMiKSkgd3JpdGUoIk1lcmRlISBObyB1c2VyIGZpbGUhIik7CisgICAgZWxzZSB3cml0ZSgiR29vZCEgVXNlciBmaWxlIHN0aWxsIGV4aXN0cyEiKTsKK30KKworPCogTk9URSBIaWdobGFuZGVyQE1vcmdlbkdyYXVlbiAxMS4yLjk0CisJQnV0OiB3cml0ZSgiVGV4dCBpcyBPQl9VU0VSIGZvbyBiYXJcbiIpOworCXNpbXBseSB3cml0ZXMgIlRleHQgaXMgT0JfVVNFUiBmb28gYmFyIi4gQ29uZmVyIHByZXZpb3VzIG5vdGUuCisqPgorCitTaW1wbHkgcHV0LCAjZGVmaW5lIGp1c3QgbGl0ZXJhbGx5IHJlcGxhY2VzIHRoZSBkZWZpbmVkIGxhYmVsIHdpdGggd2hhdGV2ZXIKK2ZvbGxvd3MgaXQuICBZb3UgbWF5IGFsc28gdXNlICNkZWZpbmUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHdoZXJlIG5vCit2YWx1ZSBmb2xsb3dzLiAgVGhpcyBpcyBjYWxsZWQgYSBiaW5hcnkgZGVmaW5pdGlvbi4gIEZvciBleGFtcGxlOgorCisjZGVmaW5lIF9fTklHSFRNQVJFCisKK2V4aXN0cyBpbiB0aGUgY29uZmlnIGZpbGUgZm9yIHRoZSBOaWdodG1hcmUgTXVkbGliLiAgVGhpcyBhbGxvd3MgZm9yIHByZS0KK2NvbXBpbGVyIHRlc3RzIHdoaWNoIHdpbGwgYmUgZGVzY3JpYmVkIGxhdGVyIGluIHRoZSBjaGFwdGVyLgorCitUaGUgb3RoZXIgcHJlLWNvbXBpbGVyIGRpcmVjdGl2ZSB5b3UgYXJlIGxpa2VseSB0byB1c2Ugb2Z0ZW4gaXMgI2luY2x1ZGUuIAorQXMgdGhlIG5hbWUgaW1wbGllcywgI2luY2x1ZGUgaW5jbHVkZXMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgZmlsZSByaWdodAoraW50byB0aGUgZmlsZSBiZWluZyBwcmUtY29tcGlsZWQgYXQgdGhlIHBvaW50IGluIHRoZSBmaWxlIHdoZXJlIHRoZSBkaXJlY3RpdmUKK2lzIHBsYWNlZC4gIEZpbGVzIG1hZGUgZm9yIGluY2x1c2lvbiBpbnRvIG90aGVyIGZpbGVzIGFyZSBvZnRlbiBjYWxsZWQgaGVhZGVyCitmaWxlcy4gIFRoZXkgc29tZXRpbWVzIGNvbnRhaW4gdGhpbmdzIGxpa2UgI2RlZmluZSBkaXJlY3RpdmVzIHVzZWQgYnkKK211bHRpcGxlIGZpbGVzIGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmaWxlLiAgVGhlIHRyYWRpdGlvbmFsIGZpbGUKK2V4dGVuc2lvbiB0byBoZWFkZXIgZmlsZXMgaXMgLmguCisKK0luY2x1ZGUgZGlyZWN0aXZlcyBmb2xsb3cgb25lIG9mIDIgc3ludGF4J3M6CisKKyNpbmNsdWRlIDxmaWxlbmFtZT4KKyNpbmNsdWRlICJmaWxlbmFtZSIKKworSWYgeW91IGdpdmUgdGhlIGFic29sdXRlIG5hbWUgb2YgdGhlIGZpbGUsIHRoZW4gd2hpY2ggc3ludGF4IHlvdSB1c2UgaXMKK2lycmVsZXZhbnQuICBIb3cgeW91IGVuY2xvc2UgdGhlIGZpbGUgbmFtZSBkZXRlcm1pbmVzIGhvdyB0aGUgcHJlLQorY29tcGlsZXIgc2VhcmNoZXMgZm9yIHRoZSBoZWFkZXIgZmlsZXMuICBUaGUgcHJlLWNvbXBpbGVyIGZpcnN0IHNlYXJjaGVzIGluCitzeXN0ZW0gaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgZmlsZXMgZW5jbG9zZWQgaW4gPD4uICBGb3IgZmlsZXMgZW5jbG9zZWQgaW4KKyIiLCB0aGUgcHJlLWNvbXBpbGVyIGJlZ2lucyBpdHMgc2VhcmNoIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZQorZ29pbmcgdGhyb3VnaCB0aGUgcHJlLWNvbXBpbGVyLiAgRWl0aGVyIHdheSwgdGhlIHByZS1jb21waWxlciB3aWxsCitzZWFyY2ggdGhlIHN5c3RlbSBpbmNsdWRlIGRpcmVjdG9yaWVzIGFuZCB0aGUgZGlyZWN0b3J5IG9mIHRoZSBmaWxlIGZvciB0aGUKK2hlYWRlciBmaWxlIGJlZm9yZSBnaXZpbmcgdXAuICBUaGUgc3ludGF4IHNpbXBseSBkZXRlcm1pbmVzIHRoZSBvcmRlci4KKzwqIE5PVEUgSGlnaGxhbmRlckBNb3JnZW5HcmF1ZW4gMTEuMi45NAorCVdoZW4gdXNpbmcgc3RhbmRhcmQtaGVhZGVyZmlsZXMgb25lIHNob3VsZCBjaG9vc2UgPD4uICIiIGlzIGFwcHJvcHJpYXRlCisJd2hlbiBkZWFsaW5nIHdpdGggc2VsZmRlZmluZWQgaGVhZGVyZmlsZXMuCisqPgorCitUaGUgc2ltcGxlc3QgcHJlLWNvbXBpbGVyIGRpcmVjdGl2ZSBpcyB0aGUgI3ByYWdtYSBkaXJlY3RpdmUuICBJdCBpcworZG91YnRmdWwgeW91IHdpbGwgZXZlciB1c2UgdGhpcyBvbmUuICBCYXNpY2FsbHksIHlvdSBmb2xsb3cgdGhlIGRpcmVjdGl2ZQord2l0aCBzb21lIGtleXdvcmQgd2hpY2ggaXMgbWVhbmluZ2Z1bCB0byB5b3VyIGRyaXZlci4gIFRoZSBvbmx5CitrZXl3b3JkIEkgaGF2ZSBldmVyIHNlZW4gaXMgc3RyaWN0X3R5cGVzLCB3aGljaCBzaW1wbHkgbGV0cyB0aGUgZHJpdmVyCitrbm93IHlvdSB3YW50IHRoaXMgZmlsZSBpbnRlcnByZXRlZCB3aXRoIHN0cmljdCBkYXRhIHR5cGluZy4gIEkgZG91YnQgeW91Cit3aWxsIGV2ZXIgbmVlZCB0byB1c2UgdGhpcywgYW5kIHlvdSBtYXkgbmV2ZXIgZXZlbiBzZWUgaXQuICBJIGp1c3QgaW5jbHVkZWQKK2l0IGluIHRoZSBsaXN0IGluIHRoZSBldmVudCB5b3UgZG8gc2VlIGl0IHNvIHlvdSBkbyBub3QgdGhpbmsgaXQgaXMgZG9pbmcKK2FueXRoaW5nIHRydWx5IG1lYW5pbmdmdWwuCisKK1RoZSBmaW5hbCBncm91cCBvZiBwcmUtY29tcGlsZXIgZGlyZWN0aXZlcyBhcmUgdGhlIGNvbmRpdGlvbmFsIHByZS0KK2NvbXBpbGVyIGRpcmVjdGl2ZXMuICBUaGV5IGFsbG93IHlvdSB0byBwcmUtY29tcGlsZSB0aGUgZmlsZSBvbmUgd2F5CitnaXZlbiB0aGUgdHJ1dGggdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiwgb3RoZXJ3aXNlIHByZS1jb21waWxlIHRoZSBmaWxlCithbm90aGVyIHdheS4gIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgbWFraW5nIGNvZGUgcG9ydGFibGUgYW1vbmcKK211ZGxpYnMsIHNpbmNlIHB1dHRpbmcgdGhlIG1fZGVsZXRlKCkgZWZ1biBpbiBjb2RlIG9uIGEgTXVkT1MgbXVkCit3b3VsZCBub3JtYWxseSBjYXVzZSBhbiBlcnJvciwgZm9yIGV4YW1wbGUuICBTbyB5b3UgbWlnaHQgd3JpdGUgdGhlCitmb2xsb3dpbmc6CisKKyNpZmRlZiAgTVVET1MKKyAgICBtYXBfZGVsZXRlKG1hcCwga2V5KTsKKyNlbHNlCisgICAgbWFwID0gbV9kZWxldGUobWFwLCBrZXkpOworI2VuZGlmCisKK3doaWNoIGFmdGVyIGJlaW5nIHBhc3NlZCB0aHJvdWdoIHRoZSBwcmUtY29tcGlsZXIgd2lsbCBhcHBlYXIgdG8gdGhlCitpbnRlcnByZXRlciBhczoKKworICAgIG1hcF9kZWxldGUobWFwLCBrZXkpOyAgIAorCitvbiBhIE11ZE9TIG11ZCwgYW5kOgorICAKKyAgICBtYXAgPSBtX2RlbGV0ZShtYXAsIGtleSk7CisKK29uIG90aGVyIG11ZHMuICBUaGUgaW50ZXJwcmV0ZXIgbmV2ZXIgc2VlcyB0aGUgZnVuY3Rpb24gY2FsbCB0aGF0IHdvdWxkCitjYXVzZSBpdCB0byBzcGFtIG91dCBpbiBlcnJvci4gCisKK05vdGljZSB0aGF0IG15IGV4YW1wbGUgbWFkZSB1c2Ugb2YgYSBiaW5hcnkgZGVmaW5pdGlvbiBhcyBkZXNjcmliZWQKK2Fib3ZlLiAgQmluYXJ5IGRlZmluaXRpb25zIGFsbG93IHlvdSB0byBwYXNzIGNlcnRhaW4gY29kZSB0byB0aGUKK2ludGVycHJldGVyIGJhc2VkIG9uIHdoYXQgZHJpdmVyIG9yIG11ZGxpYiB5b3UgYXJlIHVzaW5nLCBhbW9uZyBvdGhlcgorY29uZGl0aW9ucy4KKworNC4zIFN1bW1hcnkKK1RoZSBwcmUtY29tcGlsZXIgaXMgYSB1c2VmdWwgTFBDIHRvb2wgZm9yIG1haW50YWluaW5nIG1vZHVsYXJpdHkgYW1vbmcKK3lvdXIgcHJvZ3JhbXMuICBXaGVuIHlvdSBoYXZlIHZhbHVlcyB0aGF0IG1pZ2h0IGJlIHN1YmplY3QgdG8gY2hhbmdlLAorYnV0IGFyZSB1c2VkIHdpZGVseSB0aHJvdWdob3V0IHlvdXIgZmlsZXMsIHlvdSBtaWdodCBzdGljayBhbGwgb2YgdGhvc2UKK3ZhbHVlcyBpbiBhIGhlYWRlciBmaWxlIGFzICNkZWZpbmUgc3RhdGVtZW50cyBzbyB0aGF0IGFueSBuZWVkIHRvIG1ha2UgYQorZnV0dXJlIGNoYW5nZSB3aWxsIGNhdXNlIHlvdSB0byBuZWVkIHRvIGNoYW5nZSBqdXN0IHRoZSAjZGVmaW5lIGRpcmVjdGl2ZS4gCitBIHZlcnkgZ29vZCBleGFtcGxlIG9mIHdoZXJlIHRoaXMgd291bGQgYmUgdXNlZnVsIHdvdWxkIGJlIGEgaGVhZGVyCitmaWxlIGNhbGxlZCBtb25leS5oICB3aGljaCBpbmNsdWRlcyB0aGUgZGlyZWN0aXZlOgorI2RlZmluZSBIQVJEX0NVUlJFTkNJRVMgKHsgImdvbGQiLCAicGxhdGludW0iLCAic2lsdmVyIiwKKyJlbGVjdHJ1bSIsICJjb3BwZXIiIH0pCitzbyB0aGF0IGlmIGV2ZXIgeW91IHdhbnRlZCB0byBhZGQgYSBuZXcgaGFyZCBjdXJyZW5jeSwgeW91IG9ubHkgbmVlZAorY2hhbmdlIHRoaXMgZGlyZWN0aXZlIGluIG9yZGVyIHRvIHVwZGF0ZSBhbGwgZmlsZXMgbmVlZGluZyB0byBrbm93IHdoYXQgdGhlCitoYXJkIGN1cnJlbmNpZXMgYXJlLgorCitUaGUgTFBDIHByZS1jb21waWxlciBhbHNvIGFsbG93cyB5b3UgdG8gd3JpdGUgY29kZSB3aGljaCBjYW4gYmUKK3BvcnRlZCB3aXRob3V0IGNoYW5nZSBhbW9uZyBkaWZmZXJlbnQgbXVkbGlicyBhbmQgZHJpdmVycy4gIEZpbmFsbHksCit5b3Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhlIHByZS1jb21waWxlciBvbmx5IGFjY2VwdHMgbGluZXMgZW5kaW5nIGluCitjYXJyaWFnZSByZXR1cm5zLiAgSWYgeW91IHdhbnQgYSBtdWx0aXBsZSBsaW5lIHByZS1jb21waWxlciBkaXJlY3RpdmUsIHlvdQorbmVlZCB0byBlbmQgZWFjaCBpbmNvbXBsZXRlIGxpbmUgd2l0aCBhIGJhY2tzbGFzaChcKS4KKworQ29weXJpZ2h0IChjKSBHZW9yZ2UgUmVlc2UgMTk5MwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI1IGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NWI2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjUKQEAgLTAsMCArMSwxODYgQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnCitOb3ZlbWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgIENoYXB0ZXIgNTogQWR2YW5jZWQgU3RyaW5nIEhhbmRsaW5nCisKKzUuMSBXaGF0IGEgU3RyaW5nIElzCitUaGUgTFBDIEJhc2ljcyB0ZXh0Ym9vayB0YXVnaHQgc3RyaW5ncyBhcyBzaW1wbGUgZGF0YSB0eXBlcy4gIExQQworZ2VuZXJhbGx5IGRlYWxzIHdpdGggc3RyaW5ncyBpbiBzdWNoIGEgbWF0dGVyLiAgVGhlIHVuZGVybHlpbmcgZHJpdmVyCitwcm9ncmFtLCBob3dldmVyLCBpcyB3cml0dGVuIGluIEMsIHdoaWNoIGhhcyBubyBzdHJpbmcgZGF0YSB0eXBlLiAgVGhlCitkcml2ZXIgaW4gZmFjdCBzZWVzIHN0cmluZ3MgYXMgYSBjb21wbGV4IGRhdGEgdHlwZSBtYWRlIHVwIG9mIGFuIGFycmF5IG9mCitjaGFyYWN0ZXJzLCBhIHNpbXBsZSBDIGRhdGEgdHlwZS4gIExQQywgb24gdGhlIG90aGVyIGhhbmQgZG9lcyBub3QKK3JlY29nbml6ZSBhIGNoYXJhY3RlciBkYXRhIHR5cGUgKHRoZXJlIG1heSBhY3R1YWxseSBiZSBhIGRyaXZlciBvciB0d28gb3V0Cit0aGVyZSB3aGljaCBkbyByZWNvZ25pemUgdGhlIGNoYXJhY3RlciBhcyBhIGRhdGEgdHlwZSwgYnV0IGluIGdlbmVyYWwgbm90KS4gCitUaGUgbmV0IGVmZmVjdCBpcyB0aGF0IHRoZXJlIGFyZSBzb21lIGFycmF5LWxpa2UgdGhpbmdzIHlvdSBjYW4gZG8gd2l0aAorc3RyaW5ncyB0aGF0IHlvdSBjYW5ub3QgZG8gd2l0aCBvdGhlciBMUEMgZGF0YSB0eXBlcy4KKworVGhlIGZpcnN0IGVmdW4gcmVnYXJkaW5nIHN0cmluZ3MgeW91IHNob3VsZCBsZWFybiBpcyB0aGUgc3RybGVuKCkgZWZ1bi4gCitUaGlzIGVmdW4gcmV0dXJucyB0aGUgbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgYW4gTFBDIHN0cmluZywgYW5kIGlzIHRodXMKK3RoZSBzdHJpbmcgZXF1aXZhbGVudCB0byBzaXplb2YoKSBmb3IgYXJyYXlzLiAgSnVzdCBmcm9tIHRoZSBiZWhhdmlvdXIgb2YKK3RoaXMgZWZ1biwgeW91IGNhbiBzZWUgdGhhdCB0aGUgZHJpdmVyIHRyZWF0cyBhIHN0cmluZyBhcyBpZiBpdCB3ZXJlIG1hZGUgdXAKK29mIHNtYWxsZXIgZWxlbWVudHMuICBJbiB0aGlzIGNoYXB0ZXIsIHlvdSB3aWxsIGxlYXJuIGhvdyB0byBkZWFsIHdpdGgKK3N0cmluZ3Mgb24gYSBtb3JlIGJhc2ljIGxldmVsLCBhcyBjaGFyYWN0ZXJzIGFuZCBzdWIgc3RyaW5ncy4KKworNS4yIFN0cmluZ3MgYXMgQ2hhcmFjdGVyIEFycmF5cworWW91IGNhbiBkbyBuZWFybHkgYW55dGhpbmcgd2l0aCBzdHJpbmdzIHRoYXQgeW91IGNhbiBkbyB3aXRoIGFycmF5cywKK2V4Y2VwdCBhc3NpZ24gdmFsdWVzIG9uIGEgY2hhcmFjdGVyIGJhc2lzLiAgQXQgdGhlIG1vc3QgYmFzaWMsIHlvdSBjYW4KK2FjdHVhbGx5IHJlZmVyIHRvIGNoYXJhY3RlciBjb25zdGFudHMgYnkgZW5jbG9zaW5nIHRoZW0gaW4gJycgKHNpbmdsZQorcXVvdGVzKS4gICdhJyBhbmQgImEiIGFyZSB0aGVyZWZvcmUgdmVyeSBkaWZmZXJlbnQgdGhpbmdzIGluIExQQy4gICdhJworcmVwcmVzZW50cyBhIGNoYXJhY3RlciB3aGljaCBjYW5ub3QgYmUgdXNlZCBpbiBhc3NpZ25tZW50IHN0YXRlbWVudHMgb3IKK2FueSBvdGhlciBvcGVyYXRpb25zIGV4Y2VwdCBjb21wYXJpc29uIGV2YWx1YXRpb25zLiAgImEiIG9uIHRoZSBvdGhlcgoraGFuZCBpcyBhIHN0cmluZyBtYWRlIHVwIG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4gIFlvdSBjYW4gYWRkIGFuZCBzdWJ0cmFjdAorb3RoZXIgc3RyaW5ncyB0byBpdCBhbmQgYXNzaWduIGl0IGFzIGEgdmFsdWUgdG8gYSB2YXJpYWJsZS4KKworV2l0aCBzdHJpbmcgdmFyaWFibGVzLCB5b3UgY2FuIGFjY2VzcyB0aGUgaW5kaXZpZHVhbCBjaGFyYWN0ZXJzIHRvIHJ1bgorY29tcGFyaXNvbnMgYWdhaW5zdCBjaGFyYWN0ZXIgY29uc3RhbnRzIHVzaW5nIGV4YWN0bHkgdGhlIHNhbWUgc3ludGF4Cit0aGF0IGlzIHVzZWQgd2l0aCBhcnJheXMuICBJbiBvdGhlciB3b3JkcywgdGhlIHN0YXRlbWVudDoKKyAgICBpZihzdHJbMl0gPT0gJ2EnKQoraXMgYSB2YWxpZCBMUEMgc3RhdGVtZW50IGNvbXBhcmluZyB0aGUgc2Vjb25kIGNoYXJhY3RlciBpbiB0aGUgc3RyIHN0cmluZwordG8gdGhlIGNoYXJhY3RlciAnYScuICBZb3UgaGF2ZSB0byBiZSB2ZXJ5IGNhcmVmdWwgdGhhdCB5b3UgYXJlIG5vdAorY29tcGFyaW5nIGVsZW1lbnRzIG9mIGFycmF5cyB0byBjaGFyYWN0ZXJzLCBub3IgYXJlIHlvdSBjb21wYXJpbmcKK2NoYXJhY3RlcnMgb2Ygc3RyaW5ncyB0byBzdHJpbmdzLgorCitMUEMgYWxzbyBhbGxvd3MgeW91IHRvIGFjY2VzcyBzZXZlcmFsIGNoYXJhY3RlcnMgdG9nZXRoZXIgdXNpbmcgTFBDJ3MKK3JhbmdlIG9wZXJhdG9yIC4uOgorICAgIGlmKHN0clswLi4xXSA9PSAiYWIiKQorSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gbG9vayBmb3IgdGhlIHN0cmluZyB3aGljaCBpcyBmb3JtZWQgYnkgdGhlCitjaGFyYWN0ZXJzIDAgdGhyb3VnaCAxIGluIHRoZSBzdHJpbmcgc3RyLiAgQXMgd2l0aCBhcnJheXMsIHlvdSBtdXN0IGJlCitjYXJlZnVsIHdoZW4gdXNpbmcgaW5kZXhpbmcgb3IgcmFuZ2Ugb3BlcmF0b3JzIHNvIHRoYXQgeW91IGRvIG5vdCB0cnkgdG8KK3JlZmVyZW5jZSBhbiBpbmRleCBudW1iZXIgbGFyZ2VyIHRoYW4gdGhlIGxhc3QgaW5kZXguICBEb2luZyBzbyB3aWxsCityZXN1bHQgaW4gYW4gZXJyb3IuCisKK05vdyB5b3UgY2FuIHNlZSBhIGNvdXBsZSBvZiBzaW1pbGFyaXRpZXMgYmV0d2VlbiBzdHJpbmdzIGFuZCBhcnJheXM6CisxKSBZb3UgbWF5IGluZGV4IG9uIGJvdGggdG8gYWNjZXNzIHRoZSB2YWx1ZXMgb2YgaW5kaXZpZHVhbCBlbGVtZW50cy4KKwlhKSBUaGUgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiBzdHJpbmdzIGFyZSBjaGFyYWN0ZXJzCisJYikgVGhlIGluZGl2aWR1YWwgZWxlbWVudHMgb2YgYXJyYXlzIG1hdGNoIHRoZSBkYXRhIHR5cGUgb2YgdGhlCithcnJheS4KKzIpIFlvdSBtYXkgb3BlcmF0ZSBvbiBhIHJhbmdlIG9mIHZhbHVlcworCWEpIEV4OiAiYWJjZGVmIlsxLi4zXSBpcyB0aGUgc3RyaW5nICJiY2QiCisJYikgRXg6ICh7IDEsIDIsIDMsIDQsIDUgfSlbMS4uM10gaXMgdGhlIGludCBhcnJheSAoeyAyLCAzLCA0IH0pCis8KiBOT1RFIEhpZ2hsYW5kZXJATW9yZ2VuR3JhdWVuCisJQWxzbyBwb3NzaWJsZSBpbiBNb3JnZW5HcmF1ZW4gKGluIGNvbW1vbjogQW15bGFhci1kcml2ZXIgTFBNdWRzKToKKwkiYWJjZGVmIlsyLi5dICAgIC0+ICJjZGVmIiBhbmQKKwkiYWJjZGVmIlsxLi48Ml0gIC0+ICJiY2RlIiAgKDwgbWVhbnMgc3RhcnQgY291bnRpbmcgZnJvbSB0aGUgZW5kIGFuZCB3aXRoIDEpCisqPgorCitBbmQgb2YgY291cnNlLCB5b3Ugc2hvdWxkIGFsd2F5cyBrZWVwIGluIG1pbmQgdGhlIGZ1bmRhbWVudGFsCitkaWZmZXJlbmNlOiBhIHN0cmluZyBpcyBub3QgbWFkZSB1cCBvZiBhIG1vcmUgZnVuZGFtZW50YWwgTFBDIGRhdGEgdHlwZS4gCitJbiBvdGhlciB3b3JkcywgeW91IG1heSBub3QgYWN0IG9uIHRoZSBpbmRpdmlkdWFsIGNoYXJhY3RlcnMgYnkKK2Fzc2lnbmluZyB0aGVtIHZhbHVlcy4KKworNS4zIFRoZSBFZnVuIHNzY2FuZigpCitZb3UgY2Fubm90IGRvIGFueSBkZWNlbnQgc3RyaW5nIGhhbmRsaW5nIGluIExQQyB3aXRob3V0IHVzaW5nCitzc2NhbmYoKS4gIFdpdGhvdXQgaXQsIHlvdSBhcmUgbGVmdCB0cnlpbmcgdG8gcGxheSB3aXRoIHRoZSBmdWxsIHN0cmluZ3MKK3Bhc3NlZCBieSBjb21tYW5kIHN0YXRlbWVudHMgdG8gdGhlIGNvbW1hbmQgZnVuY3Rpb25zLiAgSW4gb3RoZXIKK3dvcmRzLCB5b3UgY291bGQgbm90IGhhbmRsZSBhIGNvbW1hbmQgbGlrZTogImdpdmUgc3dvcmQgdG8gbGVvIiwgc2luY2UKK3lvdSB3b3VsZCBoYXZlIG5vIHdheSBvZiBzZXBhcmF0aW5nICJzd29yZCB0byBsZW8iIGludG8gaXRzIGNvbnN0aXR1ZW50CitwYXJ0cy4gIENvbW1hbmRzIHN1Y2ggYXMgdGhlc2UgdGhlcmVmb3JlIHVzZSB0aGlzIGVmdW4gaW4gb3JkZXIgdG8gdXNlCitjb21tYW5kcyB3aXRoIG11bHRpcGxlIGFyZ3VtZW50cyBvciB0byBtYWtlIGNvbW1hbmRzIG1vcmUKKyJFbmdsaXNoLWxpa2UiLgorCitNb3N0IHBlb3BsZSBmaW5kIHRoZSBtYW51YWwgZW50cmllcyBmb3Igc3NjYW5mKCkgdG8gYmUgcmF0aGVyIGRpZmZpY3VsdAorcmVhZGluZy4gIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBsZW5kIGl0c2VsZiB3ZWxsIHRvIHRoZSBmb3JtYXQgdXNlZCBieQorbWFudWFsIGVudHJpZXMuICBBcyBJIHNhaWQgYWJvdmUsIHRoZSBmdW5jdGlvbiBpcyB1c2VkIHRvIHRha2UgYSBzdHJpbmcgYW5kCiticmVhayBpdCBpbnRvIHVzYWJsZSBwYXJ0cy4gIFRlY2huaWNhbGx5IGl0IGlzIHN1cHBvc2VkIHRvIHRha2UgYSBzdHJpbmcgYW5kCitzY2FuIGl0IGludG8gb25lIG9yIG1vcmUgdmFyaWFibGVzIG9mIHZhcnlpbmcgdHlwZXMuICBUYWtlIHRoZSBleGFtcGxlCithYm92ZToKKworaW50IGdpdmUoc3RyaW5nIHN0cikgeworICAgIHN0cmluZyB3aGF0LCB3aG9tOworCisgICAgaWYoIXN0cikgcmV0dXJuIG5vdGlmeV9mYWlsKCJHaXZlIHdoYXQgdG8gd2hvbT9cbiIpOworICAgIGlmKHNzY2FuZihzdHIsICIlcyB0byAlcyIsIHdoYXQsIHdob20pICE9IDIpIAorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJHaXZlIHdoYXQgdG8gd2hvbT9cbiIpOworICAgIC4uLiByZXN0IG9mIGdpdmUgY29kZSAuLi4KK30KKworVGhlIGVmdW4gc3NjYW5mKCkgdGFrZXMgdGhyZWUgb3IgbW9yZSBhcmd1bWVudHMuICBUaGUgZmlyc3QgYXJndW1lbnQgaXMKK3RoZSBzdHJpbmcgeW91IHdhbnQgc2Nhbm5lZC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgY2FsbGVkIGEgY29udHJvbAorc3RyaW5nLiAgVGhlIGNvbnRyb2wgc3RyaW5nIGlzIGEgbW9kZWwgd2hpY2ggZGVtb25zdHJhdGVzIGluIHdoYXQgZm9ybQordGhlIG9yaWdpbmFsIHN0cmluZyBpcyB3cml0dGVuLCBhbmQgaG93IGl0IHNob3VsZCBiZSBkaXZpZGVkIHVwLiAgVGhlIHJlc3QKK29mIHRoZSBhcmd1bWVudHMgYXJlIHZhcmlhYmxlcyB0byB3aGljaCB5b3Ugd2lsbCBhc3NpZ24gdmFsdWVzIGJhc2VkCit1cG9uIHRoZSBjb250cm9sIHN0cmluZy4KKworVGhlIGNvbnRyb2wgc3RyaW5nIGlzIG1hZGUgdXAgb2YgdGhyZWUgZGlmZmVyZW50IHR5cGVzIG9mIGVsZW1lbnRzOiAxKQorY29uc3RhbnRzLCAyKSB2YXJpYWJsZSBhcmd1bWVudHMgdG8gYmUgc2Nhbm5lZCwgYW5kIDMpIHZhcmlhYmxlCithcmd1bWVudHMgdG8gYmUgZGlzY2FyZGVkLiAgWW91IG11c3QgaGF2ZSBhcyBtYW55IG9mIHRoZSB2YXJpYWJsZQorYXJndW1lbnRzIGluIHNzY2FuZigpIGFzIHlvdSBoYXZlIGVsZW1lbnRzIG9mIHR5cGUgMiBpbiB5b3VyIGNvbnRyb2wKK3N0cmluZy4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgY29udHJvbCBzdHJpbmcgd2FzICIlcyB0byAlcyIsIHdoaWNoCitpcyBhIHRocmVlIGVsZW1lbnQgY29udHJvbCBzdHJpbmcgbWFkZSB1cCBvZiBvbmUgY29uc3RhbnQgcGFydCAoIiB0byAiKSwKK2FuZCB0d28gdmFyaWFibGUgYXJndW1lbnRzIHRvIGJlIHNjYW5uZWQgKCIlcyIpLiAgVGhlcmUgd2VyZSBubwordmFyaWFibGVzIHRvIGJlIGRpc2NhcmRlZC4KKworVGhlIGNvbnRyb2wgc3RyaW5nIGJhc2ljYWxseSBpbmRpY2F0ZXMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlCitzdHJpbmcgIiB0byAiIGluIHRoZSBzdHJpbmcgc3RyLiAgV2hhdGV2ZXIgY29tZXMgYmVmb3JlIHRoYXQgY29uc3RhbnQgd2lsbAorYmUgcGxhY2VkIGludG8gdGhlIGZpcnN0IHZhcmlhYmxlIGFyZ3VtZW50IGFzIGEgc3RyaW5nLiAgVGhlIHNhbWUgdGhpbmcKK3dpbGwgaGFwcGVuIHRvIHdoYXRldmVyIGNvbWVzIGFmdGVyIHRoZSBjb25zdGFudC4KKworVmFyaWFibGUgZWxlbWVudHMgYXJlIG5vdGVkIGJ5IGEgIiUiIHNpZ24gZm9sbG93ZWQgYnkgYSBjb2RlIGZvcgorZGVjb2RpbmcgdGhlbS4gIElmIHRoZSB2YXJpYWJsZSBlbGVtZW50IGlzIHRvIGJlIGRpc2NhcmRlZCwgdGhlICIlIiBzaWduCitpcyBmb2xsb3dlZCBieSB0aGUgIioiIGFzIHdlbGwgYXMgdGhlIGNvZGUgZm9yIGRlY29kaW5nIHRoZSB2YXJpYWJsZS4gCitDb21tb24gY29kZXMgZm9yIHZhcmlhYmxlIGVsZW1lbnQgZGVjb2RpbmcgYXJlICJzIiBmb3Igc3RyaW5ncyBhbmQgImQiCitmb3IgaW50ZWdlcnMuICBJbiBhZGRpdGlvbiwgeW91ciBtdWRsaWIgbWF5IHN1cHBvcnQgb3RoZXIgY29udmVyc2lvbgorY29kZXMsIHN1Y2ggYXMgImYiIGZvciBmbG9hdC4gIFNvIGluIHRoZSB0d28gZXhhbXBsZXMgYWJvdmUsIHRoZSAiJXMiIGluCit0aGUgY29udHJvbCBzdHJpbmcgaW5kaWNhdGVzIHRoYXQgd2hhdGV2ZXIgbGllcyBpbiB0aGUgb3JpZ2luYWwgc3RyaW5nIGluIHRoZQorY29ycmVzcG9uZGluZyBwbGFjZSB3aWxsIGJlIHNjYW5uZWQgaW50byBhIG5ldyB2YXJpYWJsZSBhcyBhIHN0cmluZy4KKworQSBzaW1wbGUgZXhlcmNpc2UuICBIb3cgd291bGQgeW91IHR1cm4gdGhlIHN0cmluZyAiMTQ1IiBpbnRvIGFuCitpbnRlZ2VyPworCitBbnN3ZXI6CitpbnQgeDsKK3NzY2FuZigiMTQ1IiwgIiVkIiwgeCk7CisKK0FmdGVyIHRoZSBzc2NhbmYoKSBmdW5jdGlvbiwgeCB3aWxsIGVxdWFsIHRoZSBpbnRlZ2VyIDE0NS4KKworV2hlbmV2ZXIgeW91IHNjYW4gYSBzdHJpbmcgYWdhaW5zdCBhIGNvbnRyb2wgc3RyaW5nLCB0aGUgZnVuY3Rpb24KK3NlYXJjaGVzIHRoZSBvcmlnaW5hbCBzdHJpbmcgZm9yIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgZmlyc3QgY29uc3RhbnQgaW4KK3RoZSBvcmlnaW5hbCBzdHJpbmcuICBGb3IgZXhhbXBsZSwgaWYgeW91ciBzdHJpbmcgaXMgIm1hZ2ljIGF0dGFjayAxMDAiIGFuZAoreW91IGhhdmUgdGhlIGZvbGxvd2luZzoKK2ludCBpbXByb3ZlKHN0cmluZyBzdHIpIHsKKyAgICBzdHJpbmcgc2tpbGw7CisgICAgaW50IHg7CisKKyAgICBpZihzc2NhbmYoc3RyLCAiJXMgJWQiLCBza2lsbCwgeCkgIT0gMikgcmV0dXJuIDA7CisgICAgLi4uCit9Cit5b3Ugd291bGQgZmluZCB0aGF0IHlvdSBoYXZlIGNvbWUgdXAgd2l0aCB0aGUgd3JvbmcgcmV0dXJuIHZhbHVlIGZvcgorc3NjYW5mKCkgKG1vcmUgb24gdGhlIHJldHVybiB2YWx1ZXMgbGF0ZXIpLiAgVGhlIGNvbnRyb2wgc3RyaW5nLCAiJXMgJWQiLAoraXMgbWFkZSB1cCBvZiB0byB2YXJpYWJsZXMgdG8gYmUgc2Nhbm5lZCBhbmQgb25lIGNvbnN0YW50LiAgVGhlIGNvbnN0YW50CitpcyAiICIuICBTbyB0aGUgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIG9yaWdpbmFsIHN0cmluZyBmb3IgdGhlIGZpcnN0IGluc3RhbmNlCitvZiAiICIsIHBsYWNpbmcgd2hhdGV2ZXIgY29tZXMgYmVmb3JlIHRoZSAiICIgaW50byBza2lsbCwgYW5kIHRyeWluZyB0bworcGxhY2Ugd2hhdGV2ZXIgY29tZXMgYWZ0ZXIgdGhlICIgIiBpbnRvIHguICBUaGlzIHNlcGFyYXRlcyAibWFnaWMgYXR0YWNrCisxMDAiIGludG8gdGhlIGNvbXBvbmVudHMgIm1hZ2ljIiBhbmQgImF0dGFjayAxMDAiLiAgVGhlIGZ1bmN0aW9uLAoraG93ZXZlciwgY2Fubm90IG1ha2UgaGVhZHMgb3IgdGFsZXMgb2YgImF0dGFjayAxMDAiIGFzIGFuIGludGVnZXIsIHNvIGl0CityZXR1cm5zIDEsIG1lYW5pbmcgdGhhdCAxIHZhcmlhYmxlIHZhbHVlIHdhcyBzdWNjZXNzZnVsbHkgc2Nhbm5lZAorKCJtYWdpYyIgaW50byBza2lsbCkuCisKK1BlcmhhcHMgeW91IGd1ZXNzZWQgZnJvbSB0aGUgYWJvdmUgZXhhbXBsZXMsIGJ1dCB0aGUgZWZ1biBzc2NhbmYoKQorcmV0dXJucyBhbiBpbnQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdmFyaWFibGVzIGludG8gd2hpY2ggdmFsdWVzIGZyb20KK3RoZSBvcmlnaW5hbCBzdHJpbmcgd2VyZSBzdWNjZXNzZnVsbHkgc2Nhbm5lZC4gIFNvbWUgZXhhbXBsZXMgd2l0aAorcmV0dXJuIHZhbHVlcyBmb3IgeW91IHRvIGV4YW1pbmU6CisKK3NzY2FuZigic3dvICByZCBkZXNjYXJ0ZXMiLCAiJXMgdG8gJXMiLCBzdHIxLCBzdHIyKSAgICAgICAgICAgcmV0dXJuOiAwCitzc2NhbmYoInN3byAgcmQgZGVzY2FydGVzIiwgIiVzICVzIiwgc3RyMSwgc3RyMikgICAgICAgICAgICAgIHJldHVybjogMgorc3NjYW5mKCIyMDAgZ29sZCB0byBkZXNjYXJ0ZXMiLCAiJWQgJXMgdG8gJXMiLCB4LCBzdHIxLCBzdHIyKSByZXR1cm46IDMKK3NzY2FuZigiMjAwIGdvbGQgdG8gZGVzY2FydGVzIiwgIiVkICUqcyB0byAlcyIsIHgsIHN0cjEpICAgICAgcmV0dXJuOiAyCit3aGVyZSB4IGlzIGFuIGludCBhbmQgc3RyMSBhbmQgc3RyMiBhcmUgc3RyaW5nCisKKzUuNCBTdW1tYXJ5CitMUEMgc3RyaW5ncyBjYW4gYmUgdGhvdWdodCBvZiBhcyBhcnJheXMgb2YgY2hhcmFjdGVycywgeWV0IGFsd2F5cwora2VlcGluZyBpbiBtaW5kIHRoYXQgTFBDIGRvZXMgbm90IGhhdmUgdGhlIGNoYXJhY3RlciBkYXRhIHR5cGUgKHdpdGgKK21vc3QsIGJ1dCBub3QgYWxsIGRyaXZlcnMpLiAgU2luY2UgdGhlIGNoYXJhY3RlciBpcyBub3QgYSB0cnVlIExQQyBkYXRhCit0eXBlLCB5b3UgY2Fubm90IGFjdCB1cG9uIGluZGl2aWR1YWwgY2hhcmFjdGVycyBpbiBhbiBMUEMgc3RyaW5nIGluIHRoZQorc2FtZSBtYW5uZXIgeW91IHdvdWxkIGFjdCB1cG9uIGRpZmZlcmVudCBkYXRhIHR5cGVzLiAgTm90aWNpbmcgdGhlCitpbnRpbWF0ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzdHJpbmdzIGFuZCBhcnJheXMgbmV2ZXJ0aGVsZXNzIG1ha2VzIGl0CitlYXNpZXIgdG8gdW5kZXJzdGFuZCBzdWNoIGNvbmNlcHRzIGFzIHRoZSByYW5nZSBvcGVyYXRvciBhbmQgaW5kZXhpbmcgb24KK3N0cmluZ3MuCisKK1RoZXJlIGFyZSBlZnVucyBvdGhlciB0aGFuIHNzY2FuZigpIHdoaWNoIGludm9sdmUgYWR2YW5jZWQgc3RyaW5nCitoYW5kbGluZywgaG93ZXZlciwgdGhleSBhcmUgbm90IG5lZWRlZCBuZWFybHkgYXMgb2Z0ZW4uICBZb3Ugc2hvdWxkCitjaGVjayBvbiB5b3VyIG11ZCBmb3IgbWFuIG9yIGhlbHAgZmlsZXMgb24gdGhlIGVmdW5zOiBleHBsb2RlKCksCitpbXBsb2RlKCksIHJlcGxhY2Vfc3RyaW5nKCksIHNwcmludGYoKS4gIEFsbCBvZiB0aGVzZSBhcmUgdmVyeSB2YWx1YWJsZQordG9vbHMsIGVzcGVjaWFsbHkgaWYgeW91IGludGVuZCB0byBkbyBjb2RpbmcgYXQgdGhlIG11ZGxpYiBsZXZlbC4KKworQ29weXJpZ2h0IChjKSBHZW9yZ2UgUmVlc2UgMTk5MwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI2IGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjM1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjYKQEAgLTAsMCArMSwyNzYgQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnCitOb3ZlbWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hhcHRlciA2OiBJbnRlcm1lZGlhdGUgSW5oZXJpdGFuY2UKKworNi4xIEJhc2ljcyBvZiBJbmhlcml0YW5jZQorSW4gdGhlIHRleHRib29rIExQQyBCYXNpY3MsIHlvdSBsZWFybmVkIGhvdyBpdCBpcyB0aGUgbXVkbGliIG1haW50YWlucworY29uc2lzdGVuY3kgYW1vdW5nIG11ZCBvYmplY3RzIHRocm91Z2ggaW5oZXJpdGFuY2UuICBJbmhlcml0YW5jZQorYWxsb3dzIHRoZSBtdWQgYWRtaW5pc3RyYXRvcnMgdG8gY29kZSB0aGUgYmFzaWMgZnVuY3Rpb25zIGFuZCBzdWNoIHRoYXQKK2FsbCBtdWRsaWIgb2JqZWN0cywgb3IgYWxsIG11ZGxpYiBvYmplY3RzIG9mIGEgY2VydGFpbiB0eXBlIG11c3QgaGF2ZSBzbwordGhhdCB5b3UgY2FuIGNvbmNlbnRyYXRlIG9uIGNyZWF0aW5nIHRoZSBmdW5jdGlvbnMgd2hpY2ggbWFrZSB0aGVzZQorb2JqZWN0cyBkaWZmZXJlbnQuICBXaGVuIHlvdSBidWlsZCBhIHJvb20sIG9yIGEgd2VhcG9uLCBvciBhIG1vbnN0ZXIsCit5b3UgYXJlIHRha2luZyBhIHNldCBvZiBmdW5jdGlvbnMgYWxyZWFkeSB3cml0dGVuIGZvciB5b3UgYW5kIGluaGVyaXRpbmcKK3RoZW0gaW50byB5b3VyIG9iamVjdC4gIEluIHRoaXMgd2F5LCBhbGwgb2JqZWN0cyBvbiB0aGUgbXVkIGNhbiBjb3VudCBvbgorb3RoZXIgb2JqZWN0cyB0byBiZWhhdmUgaW4gYSBjZXJ0YWluIG1hbm5lci4gIEZvciBpbnN0YW5jZSwgcGxheWVyIG9iamVjdHMKK2NhbiByZWx5IG9uIHRoZSBmYWN0IHRoYXQgYWxsIHJvb20gb2JqZWN0cyB3aWxsIGhhdmUgYSBmdW5jdGlvbiBpbiB0aGVtCitjYWxsZWQgcXVlcnlfbG9uZygpIHdoaWNoIGRlc2NyaWJlcyB0aGUgcm9vbS4gIEluaGVyaXRhbmNlIHRodXMga2VlcHMKK3lvdSBmcm9tIGhhdmluZyB0byB3b3JyeSBhYm91dCB3aGF0IHRoZSBmdW5jdGlvbiBxdWVyeV9sb25nKCkgc2hvdWxkCitsb29rIGxpa2UuCisKK05hdHVyYWxseSwgdGhpcyB0ZXh0Ym9vayB0cmllcyB0byBnbyBiZXlvbmQgdGhpcyBmdW5kYW1lbnRhbCBrbm93bGVkZ2UKK29mIGluaGVyaXRhbmNlIHRvIGdpdmUgdGhlIGNvZGVyIGEgYmV0dGVyIHVuZGVydHN0YW5kaW5nIG9mIGhvdworaW5oZXJpdGFuY2Ugd29ya3MgaW4gTFBDIHByb2dyYW1taW5nLiAgV2l0aG91dCBnZXR0aW5nIGludG8gZGV0YWlsIHRoYXQKK3RoZSBhZHZhbmNlZCBkb21haW4gY29kZXIvYmVnaW5uZXIgbXVkbGliIGNvZGVyIHNpbXBseSBkb2VzIG5vdCB5ZXQKK25lZWQsIHRoaXMgY2hhcHRlciB3aWxsIHRyeSB0byBleHBsYWluIGV4YWN0bHkgd2hhdCBoYXBwZW5zIHdoZW4geW91Citpbmhlcml0IGFuIG9iamVjdC4KKworNi4yIENsb25pbmcgYW5kIEluaGVyaXRhbmNlCitXaGVuZXZlciBhIGZpbGUgaXMgcmVmZXJlbmNlZCBmb3IgdGhlIGZpcnN0IHRpbWUgYXMgYW4gb2JqZWN0IChhcyBvcHBvc2VkCit0byByZWFkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSksIHRoZSBnYW1lIHRyaWVzIHRvIGxvYWQgdGhlIGZpbGUgaW50bworbWVtb3J5IGFuZCBjcmVhdGUgYW4gb2JqZWN0LiAgSWYgdGhlIG9iamVjdCBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkIGludG8KK21lbW9yeSwgaXQgYmVjb21lcyBhcyBtYXN0ZXIgY29weS4gIE1hc3RlciBjb3BpZXMgb2Ygb2JqZWN0cyBtYXkgYmUKK2Nsb25lZCBidXQgbm90IHVzZWQgYXMgYWN0dWFsIGdhbWUgb2JqZWN0cy4gIFRoZSBtYXN0ZXIgY29weSBpcyB1c2VkIHRvCitzdXBwb3J0IGFueSBjbG9uZSBvYmplY3RzIGluIHRoZSBnYW1lLgorCitUaGUgbWFzdGVyIGNvcHkgaXMgdGhlIHNvdXJjZSBvZiBvbmUgb2YgdGhlIGNvbnRyb3ZlcnNpZXMgb2YgbXVkIExQQworY29kaW5nLCB0aGF0IGlzIHdoZXRoZXIgdG8gY2xvbmUgb3IgaW5oZXJpdC4gIFdpdGggcm9vbXMsIHRoZXJlIGlzIG5vCitxdWVzdGlvbiBvZiB3aGF0IHlvdSB3aXNoIHRvIGRvLCBzaW5jZSB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgaW5zdGFuY2UKK29mIGVhY2ggcm9vbSBvYmplY3QgaW4gdGhlIGdhbWUuICBTbyB5b3UgZ2VuZXJhbGx5IHVzZSBpbmhlcml0YW5jZSBpbgorY3JlYXRpbmcgcm9vbXMuICBNYW55IG11ZCBhZG1pbmlzdHJhdG9ycywgaW5jbHVkaW5nIG15c2VsZiwgaG93ZXZlcgorZW5jb3VyYWdlIGNyZWF0b3JzIHRvIGNsb25lIHRoZSBzdGFuZGFyZCBtb25zdGVyIG9iamVjdCBhbmQgY29uZmlndXJlIGl0Citmcm9tIGluc2lkZSByb29tIG9iamVjdHMgaW5zdGVhZCBvZiBrZWVwaW5nIG1vbnN0ZXJzIGluIHNlcGFyYXRlIGZpbGVzCit3aGljaCBpbmhlcml0IHRoZSBzdGFuZGFyZCBtb25zdGVyIG9iamVjdC4KKworQXMgSSBzdGF0ZWQgYWJvdmUsIGVhY2ggdGltZSBhIGZpbGUgaXMgcmVmZXJlbmNlZCB0byBjcmVhdGUgYW4gb2JqZWN0LCBhCittYXN0ZXIgY29weSBpcyBsb2FkZWQgaW50byBtZW1vcnkuICBXaGVuIHlvdSBkbyBzb21ldGhpbmcgbGlrZToKK3ZvaWQgcmVzZXQoKSB7CisgICAgb2JqZWN0IG9iOworICAgIG9iID0gbmV3KCIvc3RkL21vbnN0ZXIiKTsKKyAgICAgIC8qIGNsb25lX29iamVjdCgiL3N0ZC9tb25zdGVyIikgc29tZSBwbGFjZXMgKi8KKyAgICBvYi0+c2V0X25hbWUoImZvbyBtb25zdGVyIik7CisgICAgLi4uICByZXN0IG9mIG1vbnN0ZXIgY29uZmlnIGNvZGUgZm9sbG93ZWQgYnkgbW92aW5nCitpdCB0byB0aGUgcm9vbSAuLi4KK30KK3RoZSBkcml2ZXIgc2VhcmNoZXMgdG8gc2VlIGlmIHRoZWlyIGlzIGEgbWFzdGVyIG9iamVjdCBjYWxsZWQgIi9zdGQvbW9uc3RlciIuIAorSWYgbm90LCBpdCBjcmVhdGVzIG9uZS4gIElmIGl0IGRvZXMgZXhpc3QsIG9yIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQsIHRoZQorZHJpdmVyIHRoZW4gY3JlYXRlcyBhIGNsb25lIG9iamVjdCBjYWxsZWQgIi9zdGQvbW9uc3RlciM8bnVtYmVyPiIuICBJZgordGhpcyBpcyB0aGUgZmlyc3QgdGltZSAiL3N0ZC9tb25zdGVyIiBpcyBiZWluZyByZWZlcmVuY2VkLCBpbiBlZmZlY3QsIHR3bworb2JqZWN0cyBhcmUgYmVpbmcgY3JlYXRlZDogdGhlIG1hc3RlciBvYmplY3QgYW5kIHRoZSBjbG9uZWQgaW5zdGFuY2UuCisKK09uIHRoZSBvdGhlciBoYW5kLCBsZXQncyBzYXkgeW91IGRpZCBhbGwgeW91ciBjb25maWd1cmluZyBpbiB0aGUgY3JlYXRlKCkKK29mIGEgc3BlY2lhbCBtb25zdGVyIGZpbGUgd2hpY2ggaW5oZXJpdHMgIi9zdGQvbW9uc3RlciIuICBJbnN0ZWFkIG9mCitjbG9uaW5nIHRoZSBzdGFuZGFyZCBtb25zdGVyIG9iamVjdCBmcm9tIHlvdXIgcm9vbSwgeW91IGNsb25lIHlvdXIKK21vbnN0ZXIgZmlsZS4gIElmIHRoZSBzdGFuZGFyZCBtb25zdGVyIGhhcyBub3QgYmVlbiBsb2FkZWQsIGl0IGdldHMgbG9hZGVkCitzaW5jZSB5b3VyIG1vbnN0ZXIgaW5oZXJpdHMgaXQuICBJbiBhZGRpdGlvbiwgYSBtYXN0ZXIgY29weSBvZiB5b3VyIGZpbGUKK2dldHMgbG9hZGVkIGludG8gbWVtb3J5LiAgRmluYWxseSwgYSBjbG9uZSBvZiB5b3VyIG1vbnN0ZXIgaXMgY3JlYXRlZAorYW5kIG1vdmVkIGludG8gdGhlIHJvb20sIGZvciBhIHRvdGFsIG9mIHRocmVlIG9iamVjdHMgYWRkZWQgdG8gdGhlIGdhbWUuIAorTm90ZSB0aGF0IHlvdSBjYW5ub3QgbWFrZSB1c2Ugb2YgdGhlIG1hc3RlciBjb3B5IGVhc2lseSB0byBnZXQgYXJvdW5kCit0aGlzLiAgSWYsIGZvciBleGFtcGxlLCB5b3Ugd2VyZSB0byBkbzoKKyAgICAiL3dpemFyZHMvZGVzY2FydGVzL215X21vbnN0ZXIiLT5tb3ZlKHRoaXNfb2JqZWN0KCkpOworaW5zdGVhZCBvZgorICAgIG5ldygiL3dpemFyZHMvZGVzY2FydGVzL215X21vbnN0ZXIiKS0+bW92ZSh0aGlzX29iamVjdCgpKTsKK3lvdSB3b3VsZCBub3QgYmUgYWJsZSB0byBtb2RpZnkgdGhlIGZpbGUgIm15X21vbnN0ZXIuYyIgYW5kIHVwZGF0ZSBpdCwKK3NpbmNlIHRoZSB1cGRhdGUgY29tbWFuZCBkZXN0cm95cyB0aGUgY3VycmVudCBtYXN0ZXIgdmVyc2lvbiBvZiBhbgorb2JqZWN0LiAgT24gc29tZSBtdWRsaWJzIGl0IGFsc28gbG9hZHMgdGhlIG5ldyB2ZXJzaW9uIGludG8gbWVtb3J5LiAKK0ltYWdpbmUgdGhlIGxvb2sgb24gYSBwbGF5ZXIncyBmYWNlIHdoZW4gdGhlaXIgbW9uc3RlciBkaXNhcHBlYXJzIGluCittaWQtY29tYmF0IGNhdXNlIHlvdSB1cGRhdGVkIHRoZSBmaWxlIQorCitDbG9uaW5nIGlzIHRoZXJlZm9yZSBhIHVzZWZ1bCB0b28gd2hlbiB5b3UgcGxhbiBvbiBkb2luZyBqdXN0IHRoYXQtCitjbG9uaW5nLiAgSWYgeW91IGFyZSBkb2luZyBub3RoaW5nIHNwZWNpYWwgdG8gYSBtb25zdGVyIHdoaWNoIGNhbm5vdCBiZQorZG9uZSB0aHJvdWdoIGEgZmV3IGNhbGwgb3RoZXJzLCB0aGVuIHlvdSB3aWxsIHNhdmUgdGhlIG11ZCBmcm9tIGdldHRpbmcKK2xvYWRlZCB3aXRoIHVzZWxlc3MgbWFzdGVyIGNvcGllcy4gIEluaGVyaXRhbmNlLCBob3dldmVyLCBpcyB1c2VmdWwgaWYKK3lvdSBwbGFuIHRvIGFkZCBmdW5jdGlvbmFsaXR5IHRvIGFuIG9iamVjdCAod3JpdGUgeW91ciBvd24gZnVuY3Rpb25zKSBvcgoraWYgeW91IGhhdmUgYSBzaW5nbGUgY29uZmlndXJhdGlvbiB0aGF0IGdldHMgdXNlZCBvdmVyIGFuZCBvdmVyIGFnYWluCisoeW91IGhhdmUgYW4gYXJteSBvZiBvcmMgZ3VhcmRzIGFsbCB0aGUgc2FtZSwgc28geW91IHdyaXRlIGEgc3BlY2lhbCBvcmMKK2ZpbGUgYW5kIGNsb25lIGl0KS4KKworNi4zIEluc2lkZSBJbmhlcml0YW5jZQorV2hlbiBvYmplY3RzIEEgYW5kIEIgaW5oZXJpdCBvYmplY3QgQywgYWxsIHRocmVlIG9iamVjdHMgaGF2ZSB0aGVpciBvd24KK3NldCBvZiBkYXRhIHNoYXJpbmcgb25lIHNldCBvZiBmdW5jdGlvbiBkZWZpbml0aW9ucyBmcm9tIG9iamVjdCBDLiAgSW4KK2FkZGl0aW9uLCBBIGFuZCBCIHdpbGwgaGF2ZSBzZXBhcmF0ZSBmdW5jdGlvbnMgZGVmaW5pdGlvbnMgd2hpY2ggd2VyZQorZW50ZXJlZCBzZXBhcmF0ZWx5IGludG8gdGhlaXIgY29kZS4gIEZvciB0aGUgc2FrZSBvZiBleGFtcGxlIHRocm91Z2hvdXQKK3RoZSByZXN0IG9mIHRoZSBjaGFwdGVyLCB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUuICBEbyBub3QgYmUKK2Rpc3R1cmJlZCBpZiwgYXQgdGhpcyBwb2ludCwgc29tZSBvZiB0aGUgY29kZSBtYWtlcyBubyBzZW5zZToKKworT0JKRUNUIEMKK3ByaXZhdGUgc3RyaW5nIG5hbWUsIGNhcF9uYW1lLCBzaG9ydCwgbG9uZzsKK3ByaXZhdGUgaW50IHNldHVwOworCit2b2lkIHNldF9uYW1lKHN0cmluZyBzdHIpCitub21hc2sgc3RyaW5nIHF1ZXJ5X25hbWUoKTsKK3ByaXZhdGUgaW50IHF1ZXJ5X3NldHVwKCk7CitzdGF0aWMgdm9pZCB1bnNldHVwKCk7Cit2b2lkIHNldF9zaG9ydChzdHJpbmcgc3RyKTsKK3N0cmluZyBxdWVyeV9zaG9ydCgpOwordm9pZCBzZXRfbG9uZyhzdHJpbmcgc3RyKTsKK3N0cmluZyBxdWVyeV9sb25nKCk7CisKKwordm9pZCBzZXRfbmFtZShzdHJpbmcgc3RyKSB7IAorICAgIGlmKCFxdWVyeV9zZXR1cCgpKSB7CisgICAgICAgIG5hbWUgPSBzdHI7CisgICAgc2V0dXAgPSAxOworfQorCitub21hc2sgc3RyaW5nIHF1ZXJ5X25hbWUoKSB7IHJldHVybiBuYW1lOyB9CisKK3ByaXZhdGUgcXVlcnlfc2V0dXAoKSB7IHJldHVybiBzZXR1cDsgfQorCitzdGF0aWMgdm9pZCB1bnNldHVwKCkgeyBzZXR1cCA9IDA7IH0KKworc3RyaW5nIHF1ZXJ5X2NhcF9uYW1lKCkgeworICAgIHJldHVybiAobmFtZSA/IGNhcGl0YWxpemUobmFtZSkgOiAiIik7IH0KK30KKwordm9pZCBzZXRfc2hvcnQoc3RyaW5nIHN0cikgeyBzaG9ydCA9IHN0cjsgfQorCitzdHJpbmcgcXVlcnlfc2hvcnQoKSB7IHJldHVybiBzaG9ydDsgfQorCit2b2lkIHNldF9sb25nKHN0cmluZyBzdHIpIHsgbG9uZyA9IHN0cjsgfQorCitzdHJpbmcgcXVlcnlfbG9uZygpIHsgcmV0dXJuIHN0cjsgfQorCit2b2lkIGNyZWF0ZSgpIHsgc2V0ZXVpZChnZXR1aWQoKSk7IH0KKworT0JKRUNUIEIKK2luaGVyaXQgIi9zdGQvb2JqZWN0YyI7CisKK3ByaXZhdGUgaW50IHdjOworCit2b2lkIHNldF93YyhpbnQgd2MpOworaW50IHF1ZXJ5X3djKCk7CitpbnQgd2llbGR3ZWFwb24oc3RyaW5nIHN0cik7CisKK3ZvaWQgY3JlYXRlKCkgeyA6OmNyZWF0ZSgpOyB9CisKK3ZvaWQgaW5pdCgpIHsKKyAgICBpZihlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSA9PSB0aGlzX3BsYXllcigpKQorICAgICAgYWRkX2FjdGlvbigid2llbGR3ZWFwb24iLCAid2llbGQiKTsKK30KKwordm9pZCBzZXRfd2MoaW50IHgpIHsgd2MgPSB4OyB9CisKK2ludCBxdWVyeV93YygpIHsgcmV0dXJuIHdjOyB9CisKK2ludCB3aWVsZHdlYXBvbihzdHJpbmcgc3RyKSB7CisgICAgLi4uIGNvZGUgZm9yIHdpZWxkaW5nIHRoZSB3ZWFwb24gLi4uCit9CisKK09CSkVDVCBBCitpbmhlcml0ICIvc3RkL29iamVjdGMiOworCitpbnQgZ2hvc3Q7CisKK3ZvaWQgY3JlYXRlKCkgeyA6OmNyZWF0ZSgpOyB9CisKK3ZvaWQgY2hhbmdlX25hbWUoc3RyaW5nIHN0cikgeworICAgIGlmKCEoKGludCl0aGlzX29iamVjdCgpLT5pc19wbGF5ZXIoKSkpIHVuc2V0dXAoKTsKKyAgICBzZXRfbmFtZShzdHIpOworfQorCitzdHJpbmcgcXVlcnlfY2FwX25hbWUoKSB7CisgICAgaWYoZ2hvc3QpIHJldHVybiAiQSBnaG9zdCI7CisgICAgZWxzZSByZXR1cm4gOjpxdWVyeV9jYXBfbmFtZSgpOworfQorCitBcyB5b3UgY2FuIHNlZSwgb2JqZWN0IEMgaXMgaW5oZXJpdGVkIGJvdGggYnkgb2JqZWN0IEEgYW5kIG9iamVjdCBCLiAKK09iamVjdCBDIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBtdWNoIG92ZXJzaW1wbGlmaWVkIGJhc2Ugb2JqZWN0LCB3aXRoIEIKK2JlaW5nIGFuIGVxdWFsbHkgb3ZlcnNpbXBsaWZpZWQgd2VhcG9uIGFuZCBBIGJlaW5nIGFuIGVxdWFsbHkKK3NpbXBsaWZpZWQgbGl2aW5nIG9iamVjdC4gIE9ubHkgb25lIGNvcHkgb2YgZWFjaCBmdW5jdGlvbiBpcyByZXRhaW5lZCBpbgorbWVtb3J5LCBldmVuIHRob3VnaCB3ZSBoYXZlIGhlcmUgdGhyZWUgb2JqZWN0cyB1c2luZyB0aGUgZnVuY3Rpb25zLiAKK1RoZXJlIGFyZSBvZiBjb3Vyc2UsIHRocmVlIGluc3RhbmNlcyBvZiB0aGUgdmFyaWFibGVzIGZyb20gT2JqZWN0IEMgaW4KK21lbW9yeSwgd2l0aCBvbmUgaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmxlcyBvZiBPYmplY3QgQSBhbmQgT2JqZWN0IEIgaW4KK21lbW9yeS4gIEVhY2ggb2JqZWN0IHRodXMgZ2V0cyBpdHMgb3duIGRhdGEuICAKKworNi40IEZ1bmN0aW9uIGFuZCBWYXJpYWJsZSBMYWJlbHMKK05vdGljZSB0aGF0IG1hbnkgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSBhcmUgcHJvY2VlZGVkIHdpdGggbGFiZWxzIHdoaWNoCitoYXZlIG5vdCB5ZXQgYXBwZWFyZWQgaW4gZWl0aGVyIHRoaXMgdGV4dCBvciB0aGUgYmVnaW5uZXIgdGV4dCwgdGhlIGxhYmVscworc3RhdGljLCBwcml2YXRlLCBhbmQgbm9tYXNrLiAgVGhlc2UgbGFiZWxzIGRlZmluZSBzcGVjaWFsIHByaXZlbGVkZ2VzCit3aGljaCBhbiBvYmplY3QgbWF5IGhhdmUgdG8gaXRzIGRhdGEgYW5kIG1lbWJlciBmdW5jdGlvbnMuICBGdW5jdGlvbnMKK3lvdSBoYXZlIHVzZWQgdXAgdG8gdGhpcyBwb2ludCBoYXZlIHRoZSBkZWZhdWx0IGxhYmVsIHB1YmxpYy4gIFRoaXMgaXMKK2RlZmF1bHQgdG8gc3VjaCBhIGRlZ3JlZSwgc29tZSBkcml2ZXJzIGRvIG5vdCBzdXBwb3J0IHRoZSBsYWJlbGluZy4KKworQSBwdWJsaWMgdmFyaWFibGUgaXMgYXZhaWxhYmxlIHRvIGFueSBvYmplY3QgZG93biB0aGUgaW5oZXJpdGFuY2UgdHJlZQorZnJvbSB0aGUgb2JqZWN0IGluIHdoaWNoIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZC4gIFB1YmxpYyB2YXJpYWJsZXMgaW4KK29iamVjdCBDIG1heSBiZSBhY2Nlc3NlZCBieSBib3RoIG9iamVjdHMgQSBhbmQgQi4gIFNpbWlsYXJseSwgcHVibGljCitmdW5jdGlvbnMgbWF5IGJlIGNhbGxlZCBieSBhbnkgb2JqZWN0IGRvd24gdGhlIGluaGVyaXRhbmNlIHRyZWUgZnJvbSB0aGUKK29iamVjdCBpbiB3aGljaCB0aGV5IGFyZSBkZWNsYXJlZC4gCisKK1RoZSBvcHBvc2l0ZSBvZiBwdWJsaWMgaXMgb2YgY291cnNlIHByaXZhdGUuICBBIHByaXZhdGUgdmFyaWFibGUgb3IKK2Z1bmN0aW9uIG1heSBvbmx5IGJlIHJlZmVyZW5jZWQgZnJvbSBpbnNpZGUgdGhlIG9iamVjdCB3aGljaCBkZWNsYXJlcyBpdC4gCitJZiBvYmplY3QgQSBvciBCIHRyaWVkIHRvIG1ha2UgYW55IHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbgorb2JqZWN0IEMsIGFuIGVycm9yIHdvdWxkIHJlc3VsdCwgc2luY2UgdGhlIHZhcmlhYmxlcyBhcmUgc2FpZCB0byBiZSBvdXQgb2YKK3Njb3BlLCBvciBub3QgYXZhaWxhYmxlIHRvIGluaGVyaXRpbmcgY2xhc3NlcyBkdWUgdG8gdGhlaXIgcHJpdmF0ZSBsYWJlbHMuIAorRnVuY3Rpb25zLCBob3dldmVyLCBwcm92aWRlIGEgdW5pcXVlIGNoYWxsZW5nZSB3aGljaCB2YXJpYWJsZXMgZG8gbm90LiAKK0V4dGVybmFsIG9iamVjdHMgaW4gTFBDIGhhdmUgdGhlIGFiaWxpdHkgdG8gY2FsbCBmdW5jdGlvbnMgaW4gb3RoZXIgb2JqZWN0cwordGhyb3VnaCBjYWxsIG90aGVycy4gIFRoZSBwcml2YXRlIGxhYmVsIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdCBjYWxsCitvdGhlcnMuCisKK1RvIHByb3RlY3QgYWdhaW5zdCBjYWxsIG90aGVycywgZnVuY3Rpb25zIHVzZSB0aGUgbGFiZWwgc3RhdGljLiAgQSBmdW5jdGlvbgord2hpY2ggaXMgc3RhdGljIG1heSBvbmx5IGJlIGNhbGxlZCBmcm9tIGluc2lkZSB0aGUgY29tcGxldGUgb2JqZWN0IG9yCitmcm9tIHRoZSBnYW1lIGRyaXZlci4gIEJ5IGNvbXBsZXRlIG9iamVjdCwgSSBtZWFuIG9iamVjdCBBIGNhbiBjYWxsCitzdGF0aWMgZnVuY3Rpb25zIGluIHRoZSBvYmplY3QgQyBpdCBpbmhlcml0cy4gIFRoZSBzdGF0aWMgb25seSBwcm90ZWN0cyBhZ2FpbnN0CitleHRlcm5hbCBjYWxsIG90aGVycy4gIEluIGFkZGl0aW9uLCB0aGlzX29iamVjdCgpLT5mb28oKSBpcyBjb25zaWRlcmVkIGFuCitpbnRlcm5hbCBjYWxsIGFzIGZhciBhcyB0aGUgc3RhdGljIGxhYmVsIGdvZXMuCisKK1NpbmNlIHZhcmlhYmxlcyBjYW5ub3QgYmUgcmVmZXJlbmNlZCBleHRlcm5hbGx5LCB0aGVyZSBpcyBubyBuZWVkIGZvciBhbgorZXF1aXZhbGVudCBsYWJlbCBmb3IgdGhlbS4gIFNvbWV3aGVyZSBhbG9uZyB0aGUgbGluZSwgc29tZW9uZSBkZWNpZGVkCit0byBtdWRkeSB1cCB0aGUgd2F0ZXJzIGFuZCB1c2UgdGhlIHN0YXRpYyBsYWJlbCB3aXRoIHZhcmlhYmxlcyB0byBoYXZlIGEKK2NvbXBsZXRlbHkgc2VwYXJhdGUgbWVhbmluZy4gIFdoYXQgaXMgZXZlbiBtb3JlIG1hZGRlbmluZyBpcyB0aGF0IHRoaXMKK2xhYmVsIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggd2hhdCBpdCBtZWFucyBpbiB0aGUgQyBwcm9ncmFtbWluZworbGFuZ3VhZ2UuICBBIHN0YXRpYyB2YXJpYWJsZSBpcyBzaW1wbHkgYSB2YXJpYWJsZSB0aGF0IGRvZXMgbm90IGdldCBzYXZlZCB0bworZmlsZSB0aHJvdWdoIHRoZSBlZnVuIHNhdmVfb2JqZWN0KCkgYW5kIGRvZXMgbm90IGdldCByZXN0b3JlZCB0aHJvdWdoCityZXN0b3JlX29iamVjdCgpLiAgR28gZmlndXJlLgorCitJbiBnZW5lcmFsLCBpdCBpcyBnb29kIHByYWN0aWNlIHRvIGhhdmUgcHJpdmF0ZSB2YXJpYWJsZXMgd2l0aCBwdWJsaWMKK2Z1bmN0aW9ucywgdXNpbmcgcXVlcnlfKigpIGZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIHZhbHVlcyBvZiBpbmhlcml0ZWQKK3ZhcmlhYmxlcywgYW5kIHNldF8qKCksIGFkZF8qKCksIGFuZCBvdGhlciBzdWNoIGZ1bmN0aW9ucyB0byBjaGFuZ2UKK3Rob3NlIHZhbHVlcy4gIEluIHJlYWxtIGNvZGluZyB0aGlzIGlzIG5vdCBzb21ldGhpbmcgb25lIHJlYWxseSBoYXMgdG8KK3dvcnJ5IGEgbG90IGFib3V0LiAgQXMgYSBtYXR0ZXIgb2YgZmFjdCwgaW4gcmVhbG0gY29kaW5nIHlvdSBkbyBub3QgaGF2ZQordG8ga25vdyBtdWNoIG9mIGFueXRoaW5nIHdoaWNoIGlzIGluIHRoaXMgY2hhcHRlci4gIFRvIGJlIGNvbWUgYSByZWFsbHkKK2dvb2QgcmVhbG0gY29kZXIsIGhvd2V2ZXIsIHlvdSBoYXZlIHRvIGJlIGFibGUgdG8gcmVhZCB0aGUgbXVkbGliCitjb2RlLiAgQW5kIG11ZGxpYiBjb2RlIGlzIGZ1bGwgb2YgdGhlc2UgbGFiZWxzLiAgU28geW91IHNob3VsZCB3b3JrCithcm91bmQgd2l0aCB0aGVzZSBsYWJlbHMgdW50aWwgeW91IGNhbiByZWFkIGNvZGUgYW5kIHVuZGVyc3RhbmQgd2h5IGl0CitpcyB3cml0dGVuIHRoYXQgd2F5IGFuZCB3aGF0IGl0IG1lYW5zIHRvIG9iamVjdHMgd2hpY2ggaW5oZXJpdCB0aGUgY29kZS4KKworVGhlIGZpbmFsIGxhYmVsIGlzIG5vbWFzaywgYW5kIGl0IGRlYWxzIHdpdGggYSBwcm9wZXJ0eSBvZiBpbmhlcml0YW5jZQord2hpY2ggYWxsb3dzIHlvdSB0byByZXdyaXRlIGZ1bmN0aW9ucyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBkZWZpbmVkLiAKK0ZvciBleGFtcGxlLCB5b3UgY2FuIHNlZSBhYm92ZSB0aGF0IG9iamVjdCBBIHJld3JvdGUgdGhlIGZ1bmN0aW9uCitxdWVyeV9jYXBfbmFtZSgpLiAgQSByZXdyaXRlIG9mICBmdW5jdGlvbiBpcyBjYWxsZWQgb3ZlcnJpZGluZyB0aGUKK2Z1bmN0aW9uLiAgVGhlIG1vc3QgY29tbW9uIG92ZXJyaWRlIG9mIGEgZnVuY3Rpb24gd291bGQgYmUgaW4gYSBjYXNlCitsaWtlIHRoaXMsIHdoZXJlIGEgY29uZGl0aW9uIHBlY3VsaWFyIHRvIG91ciBvYmplY3QgKG9iamVjdCBBKSBuZWVkcyB0bworaGFwcGVuIG9uIGEgY2FsbCBvdCB0aGUgZnVuY3Rpb24gdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLiAgUHV0dGluZyB0ZXN0Citjb2RlIGludG8gb2JqZWN0IEMganVzdCBzbyBvYmplY3QgQSBjYW4gYmUgYSBnaG9zdCBpcyBwbGFpbiBzaWxseS4gIFNvCitpbnN0ZWFkLCB3ZSBvdmVycmlkZSBxdWVyeV9jYXBfbmFtZSgpIGluIG9iamVjdCBBLCB0ZXN0aW5nIHRvIHNlZSBpZiB0aGUKK29iamVjdCBpcyBhIGdob3N0LiAgSWYgc28sIHdlIGNoYW5nZSB3aGF0IGhhcHBlbnMgd2hlbiBhbm90aGVyIG9iamVjdAorcXVlcmllcyBmb3IgdGhlIGNhcCBuYW1lLiAgSWYgaXQgaXMgbm90IGEgZ2hvc3QsIHRoZW4gd2Ugd2FudCB0aGUgcmVndWxhcgorb2JqZWN0IGJlaGF2aW91ciB0byBoYXBwZW4uICBXZSB0aGVyZWZvcmUgdXNlIHRoZSBzY29wZSByZXNvbHV0aW9uCitvcGVyYXRvciAoOjopIHRvIGNhbGwgdGhlIGluaGVyaXRlZCB2ZXJzaW9uIG9mIHRoZSBxdWVyeV9jYXBfbmFtZSgpCitmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KKworQSBub21hc2sgZnVuY3Rpb24gaXMgb25lIHdoaWNoIGNhbm5vdCBiZSBvdmVycmlkZGVuIGVpdGhlciB0aHJvdWdoCitpbmhlcml0YW5jZSBvciB0aHJvdWdoIHNoYWRvd2luZy4gIFNoYWRvd2luZyBpcyBhIHNvcnQgb2YgYmFja3dhcmRzCitpbmhlcml0YW5jZSB3aGljaCB3aWxsIGJlIGRldGFpbGVkIGluIHRoZSBhZHZhbmNlZCBMUEMgdGV4dGJvb2suICBJbiB0aGUKK2V4YW1wbGUgYWJvdmUsIG5laXRoZXIgb2JqZWN0IEEgbm9yIG9iamVjdCBCIChub3IgYW55IG90aGVyIG9iamVjdCBmb3IKK3RoYXQgbWF0dGVyKSBjYW4gb3ZlcnJpZGUgcXVlcnlfbmFtZSgpLiAgU2luY2Ugd2Ugd2FudCB0byB1c2UKK3F1ZXJ5X25hbWUoKSBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIG9mIG9iamVjdHMsIHdlIGRvbid0IHdhbnQgcGVvcGxlCitmYWtpbmcgdXMgdGhyb3VnaCBzaGFkb3dpbmcgb3IgaW5oZXJpdGFuY2UuICBUaGUgZnVuY3Rpb24gdGhlcmVmb3JlIGdldHMKK3RoZSBub21hc2sgbGFiZWwuCisKKzYuNSBTdW1tYXJ5CitUaHJvdWdoIGluaGVyaXRhbmNlLCBhIGNvZGVyIG1heSBtYWtlIHVzZXIgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4KK290aGVyIG9iamVjdHMgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSB0ZWRpdW0gb2YgcHJvZHVjaW5nIG1hc3NlcyBvZgorc2ltaWxhciBvYmplY3RzIGFuZCB0byBpbmNyZWFzZSB0aGUgY29uc2lzdGVuY3kgb2Ygb2JqZWN0IGJlaGF2aW91ciBhY3Jvc3MKK211ZGxpYiBvYmplY3RzLiAgTFBDIGluaGVyaXRhbmNlIGFsbG93cyBvYmplY3RzIG1heGltdW0gcHJpdmVsZWRnZXMgaW4KK2RlZmluaW5nIGhvdyB0aGVpciBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBieSBleHRlcm5hbCBvYmplY3RzIGFzIHdlbGwgYXMKK29iamVjdHMgaW5oZXJpdGluZyB0aGVtLiAgVGhpcyBkYXRhIHNlY3VyaXR5IGlzIG1haW50YWluZWQgdGhyb3VnaCB0aGUKK2tleXdvcmRzLCBub21hc2ssIHByaXZhdGUsIGFuZCBzdGF0aWMuCisKK0luIGFkZGl0aW9uLCBhIGNvZGVyIGlzIGFibGUgdG8gY2hhbmdlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIG5vbi1wcm90ZWN0ZWQKK2Z1bmN0aW9ucyBieSBvdmVycmlkaW5nIHRoZW0uICBFdmVuIGluIHRoZSBwcm9jZXNzIG9mIG92ZXJyaWRpbmcgYQorZnVuY3Rpb24sIGhvd2V2ZXIsIGFuIG9iamVjdCBtYXkgYWNjZXNzIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB0aHJvdWdoCit0aGUgc2NvcGUgcmVzb2x1dGlvbiBvcGVyYXRvci4KKworQ29weXJpZ2h0IChjKSBHZW9yZ2UgUmVlc2UgMTk5MwpkaWZmIC0tZ2l0IGEvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI3IGIvZG9jL0tVUlMvTFBDLUtVUlMyL2NoYXB0ZXI3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOGNjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvS1VSUy9MUEMtS1VSUzIvY2hhcHRlcjcKQEAgLTAsMCArMSwyOTggQEAKK0ludGVybWVkaWF0ZSBMUEMKK0Rlc2NhcnRlcyBvZiBCb3JnCitOb3ZlbWJlciAxOTkzCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFwdGVyIDc6IERlYnVnZ2luZworCis3LjEgVHlwZXMgb2YgRXJyb3JzCitCeSBub3csIHlvdSBoYXZlIGxpa2VseSBydW4gaW50byBlcnJvcnMgaGVyZSwgdGhlcmUsIGFuZCBldmVyeXdoZXJlLiAgSW4KK2dlbmVyYWwsIHRoZXJlIGFyZSB0aHJlZSBzb3J0cyBvZiBlcnJvcnMgeW91IG1pZ2h0IHNlZTogY29tcGlsZSB0aW1lCitlcnJvcnMsIHJ1biB0aW1lIGVycm9ycywgYW5kIG1hbGZ1bmN0aW9uaW5nIGNvZGUuICBPbiBtb3N0IG11ZHMgeW91Cit3aWxsIGZpbmQgYSBwZXJzb25hbCBmaWxlIHdoZXJlIHlvdXIgY29tcGlsZSB0aW1lIGVycm9ycyBhcmUgbG9nZ2VkLiAgRm9yCit0aGUgbW9zdCBwYXJ0LCB0aGlzIGZpbGUgY2FuIGJlIGZvdW5kIGVpdGhlciBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5IGFzIHRoZQorZmlsZSBuYW1lZCAibG9nIiBvciAiLmxvZyIsIG9yIHNvbWV3aGVyZSBpbiB0aGUgZGlyZWN0b3J5ICIvbG9nIiBhcyBhIGZpbGUKK3dpdGggeW91ciBuYW1lLi4gIEluIGFkZGl0aW9uLCBtdWRzIHRlbmQgdG8ga2VlcCBhIGxvZyBvZiBydW4gdGltZSBlcnJvcnMKK3doaWNoIG9jY3VyIHdoaWxlIHRoZSBtdWQgaXMgdXAuICBBZ2FpbiwgdGhpcyBpcyBnZW5lcmFsbHkgZm91bmQgaW4KKyIvbG9nIi4gIE9uIE11ZE9TIG11ZHMgaXQgaXMgY2FsbGVkICJkZWJ1Zy5sb2ciLiAgT24gb3RoZXIgbXVkcyBpdCBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgZGlmZmVyZW50IGxpa2UgImxwbXVkLmxvZyIuICBBc2sgeW91ciBhZG1pbmlzdHJhdG9ycword2hlcmUgY29tcGlsZSB0aW1lIGFuZCBydW4gdGltZSBlcnJvcnMgYXJlIGVhY2ggbG9nZ2VkIGlmIHlvdSBkbyBub3QKK2FscmVhZHkga25vdy4KKworQ29tcGlsZSB0aW1lIGVycm9ycyBhcmUgZXJyb3JzIHdoaWNoIG9jY3VyIHdoZW4gdGhlIGRyaXZlciB0cmllcyB0byBsb2FkCithbiBvYmplY3QgaW50byBtZW1vcnkuICBJZiwgd2hlbiB0aGUgZHJpdmVyIGlzIHRyeWluZyB0byBsb2FkIGFuIG9iamVjdAoraW50byBtZW1vcnksIGl0IGVuY291bnRlcnMgdGhpbmdzIHdoaWNoIGl0IHNpbXBseSBkb2VzIG5vdCB1bmRlcnN0YW5kCit3aXRoIHJlc3BlY3QgdG8gd2hhdCB5b3Ugd3JvdGUsIGl0IHdpbGwgZmFpbCB0byBsb2FkIGl0IGludG8gbWVtb3J5IGFuZCBsb2cKK3doeSBpdCBjb3VsZCBub3QgbG9hZCB0aGUgb2JqZWN0IGludG8geW91ciBwZXJzb25hbCBlcnJvciBsb2cuICBUaGUgbW9zdAorY29tbW9uIGNvbXBpbGUgdGltZSBlcnJvcnMgYXJlIHR5cG9zLCBtaXNzaW5nIG9yIGV4dHJhICgpLCB7fS4gW10sIG9yICIiLAorYW5kIGZhaWx1cmUgdG8gZGVjbGFyZSBwcm9wZXJseSBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZQorb2JqZWN0LgorCitSdW4gdGltZSBlcnJvcnMgb2NjdXIgd2hlbiBzb21ldGhpbmcgd3JvbmcgaGFwcGVucyB0byBhbiBvYmplY3QgaW4KK21lbW9yeSB3aGlsZSBpdCBpcyBleGVjdXRpbmcgYSBzdGF0ZW1lbnQuICBGb3IgZXhhbXBsZSwgdGhlIGRyaXZlcgorY2Fubm90IHRlbGwgd2hldGhlciB0aGUgc3RhdGVtZW50ICJ4L3kiIHdpbGwgYmUgdmFsaWQgaW4gYWxsIGNpcmN1bXN0YW5jZXMuIAorSW4gZmFjdCwgaXQgaXMgYSB2YWxpZCBMUEMgZXhwcmVzc2lvbi4gIFlldCwgaWYgdGhlIHZhbHVlIG9mIHkgaXMgMCwgdGhlbiBhCitydW4gdGltZSBlcnJvciB3aWxsIG9jY3VyIHNpbmNlIHlvdSBjYW5ub3QgZGl2aWRlIGJ5IDAuICBXaGVuIHRoZSBkcml2ZXIKK3J1bnMgYWNyb3NzIGFuIGVycm9yIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24sIGl0IGFib3J0cworZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbiBhbmQgbG9ncyBhbiBlcnJvciB0byB0aGUgZ2FtZSdzIHJ1biB0aW1lIGVycm9yCitsb2cuICBJdCB3aWxsIGFsc28gc2hvdyB0aGUgZXJyb3IgdG8gdGhpc19wbGF5ZXIoKSwgaWYgZGVmaW5lZCwgaWYgdGhlIHBsYXllcgoraXMgYSBjcmVhdG9yLCBvciBpdCB3aWxsIHNob3cgIldoYXQ/IiB0byBwbGF5ZXJzLiAgTW9zdCBjb21tb24gY2F1c2VzCitmb3IgcnVuIHRpbWUgZXJyb3JzIGFyZSBiYWQgdmFsdWVzIGFuZCB0cnlpbmcgdG8gcGVyZm9ybSBvcGVyYXRpb25zIHdpdGgKK2RhdGEgdHlwZXMgZm9yIHdoaWNoIHRob3NlIG9wZXJhdGlvbnMgYXJlIG5vdCBkZWZpbmVkLgorCitUaGUgbW9zdCBpbnNpZGVvdXMgdHlwZSBvZiBlcnJvciwgaG93ZXZlciwgaXMgcGxhaW4gbWFsZnVuY3Rpb25pbmcKK2NvZGUuICBUaGVzZSBlcnJvcnMgZG8gbm90IGxvZywgc2luY2UgdGhlIGRyaXZlciBuZXZlciByZWFsbHkgcmVhbGl6ZXMgdGhhdAorYW55dGhpbmcgaXMgd3JvbmcuICBJbiBzaG9ydCwgdGhpcyBlcnJvciBoYXBwZW5zIHdoZW4geW91IHRoaW5rIHRoZSBjb2RlCitzYXlzIG9uZSB0aGluZywgYnV0IGluIGZhY3QgaXQgc2F5cyBhbm90aGVyIHRoaW5nLiAgUGVvcGxlIHRvbyBvZnRlbgorZW5jb3VudGVyIHRoaXMgYnVnIGFuZCBhdXRvbWF0aWNhbGx5IGluc2lzdCB0aGF0IGl0IG11c3QgYmUgYSBtdWRsaWIgb3IKK2RyaXZlciBidWcuICBFdmVyeW9uZSBtYWtlcyBhbGwgdHlwZXMgb2YgZXJyb3JzIHRob3VnaCwgYW5kIG1vcmUgb2Z0ZW4KK3RoYW4gbm90IHdoZW4gY29kZSBpcyBub3QgZnVuY3Rpb25pbmcgdGhlIHdheSB5b3Ugc2hvdWxkLCBpdCB3aWxsIGJlCitiZWNhdXNlIHlvdSBtaXNyZWFkIGl0LiAgCisKKzcuMiBEZWJ1Z2dpbmcgQ29tcGlsZSBUaW1lIEVycm9ycworQ29tcGlsZSB0aW1lIGVycm9ycyBhcmUgY2VydGFpbmx5IHRoZSBtb3N0IGNvbW1vbiBhbmQgc2ltcGxlc3QgYnVncyB0bworZGVidWcuICBOZXcgY29kZXJzIG9mdGVuIGdldCBmcnVzdHJhdGVkIGJ5IHRoZW0gZHVlIHRvIHRoZSBvYnNjdXJlCituYXR1cmUgb2Ygc29tZSBlcnJvciBtZXNzYWdlcy4gIE5ldmVydGhlbGVzcywgb25jZSBhIHBlcnNvbiBiZWNvbWVzCit1c2VkIHRvIHRoZSBlcnJvciBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgdGhlaXIgZHJpdmVyLCBkZWJ1Z2dpbmcgY29tcGlsZQordGltZSBlcnJvcnMgYmVjb21lcyB1dHRlcmx5IHJvdXRpbmUuCisKK0luIHlvdXIgZXJyb3IgbG9nLCB0aGUgZHJpdmVyIHdpbGwgdGVsbCB5b3UgdGhlIHR5cGUgb2YgZXJyb3IgYW5kIG9uIHdoaWNoCitsaW5lIGl0IGZpbmFsbHkgbm90aWNlZCB0aGVyZSB3YXMgYW4gZXJyb3IuICBOb3RlIHRoYXQgdGhpcyBpcyBub3Qgb24gd2hpY2gKK2xpbmUgdGhlIGFjdHVhbCBlcnJvciBuZWNlc3NhcmlseSBleGlzdHMuICBUaGUgbW9zdCBjb21tb24gY29tcGlsZSB0aW1lCitlcnJvciwgYmVzaWRlcyB0aGUgdHlwbywgaXMgdGhlIG1pc3Npbmcgb3Igc3VwZXJmbHVvdXMgcGFyZW50aGVzZXMsCiticmFja2V0cywgYnJhY2VzLCBvciBxdW90ZXMuICBZZXQgdGhpcyBlcnJvciBpcyB0aGUgb25lIHRoYXQgbW9zdCBiYWZmbGVzCituZXcgY29kZXJzLCBzaW5jZSB0aGUgZHJpdmVyIHdpbGwgbm90IG5vdGljZSB0aGUgbWlzc2luZyBvciBleHRyYSBwaWVjZQordW50aWwgd2VsbCBhZnRlciB0aGUgb3JpZ2luYWwuICBUYWtlIGZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgY29kZToKKworMSBpbnQgdGVzdChzdHJpbmcgc3RyKSB7CisyICAgIGludCB4OworMyAgICBmb3IoeCA9MDsgeDwxMDsgeCsrKQorNCAgICAgICAgd3JpdGUoeCsiXG4iKTsKKzUgICAgfQorNiAgICB3cml0ZSgiRG9uZS5cbiIpOworNyB9CisKK0RlcGVuZGluZyBvbiB3aGF0IHlvdSBpbnRlbmRlZCwgdGhlIGFjdHVhbCBlcnJvciBoZXJlIGlzIGVpdGhlciBhdCBsaW5lIDMKKyhtZWFuaW5nIHlvdSBhcmUgbWlzc2luZyBhIHspIG9yIGF0IGxpbmUgNSAobWVhaW5nIHlvdSBoYXZlIGFuIGV4dHJhIH0pLiAKK05ldmVydGhlbGVzcywgdGhlIGRyaXZlciB3aWxsIHJlcG9ydCB0aGF0IGl0IGZvdW5kIGFuIGVycm9yIHdoZW4gaXQgZ2V0cyB0bworbGluZSA2LiAgVGhlIGFjdHVhbCBkcml2ZXIgbWVzc2FnZSBtYXkgdmFyeSBmcm9tIGRyaXZlciB0byBkcml2ZXIsIGJ1dCBubworbWF0dGVyIHdoaWNoIGRyaXZlciwgeW91IHdpbGwgc2VlIGFuIGVycm9yIG9uIGxpbmUgNiwgc2luY2UgdGhlIH0gaW4gbGluZSA1CitpcyBpbnRlcnByZXRlZCBhcyBlbmRpbmcgdGhlIGZ1bmN0aW9uIHRlc3QoKS4gIEF0IGxpbmUgNiwgdGhlIGRyaXZlciBzZWVzIHRoYXQKK3lvdSBoYXZlIGEgd3JpdGUoKSBzaXR0aW5nIG91dHNpZGUgYW55IGZ1bmN0aW9uIGRlZmluaXRpb24sIGFuZCB0aHVzCityZXBvcnRzIGFuIGVycm9yLiAgR2VuZXJhbGx5LCB0aGUgZHJpdmVyIHdpbGwgYWxzbyBnbyBvbiB0byByZXBvcnQgdGhhdCBpdAorZm91bmQgYW4gZXJyb3IgYXQgbGluZSA3IGluIHRoZSBmb3JtIG9mIGFuIGV4dHJhIH0uCisKK1RoZSBzZWNyZXQgdG8gZGVidWdnaW5nIHRoZXNlIGlzIGNvZGluZyBzdHlsZS4gIEhhdmluZyBjbG9zaW5nIH0gbWF0Y2gKK3VwIHZlcnRpY2FsbHkgd2l0aCB0aGUgY2xhdXNlcyB0aGV5IGNsb3NlIG91dCBoZWxwcyB5b3Ugc2VlIHdoZXJlIHlvdSBhcmUKK21pc3NpbmcgdGhlbSB3aGVuIHlvdSBhcmUgZGVidWdnaW5nIGNvZGUuICBTaW1pbGFybHksIHdoZW4gdXNpbmcKK211bHRpcGxlIHNldHMgb2YgcGFyZW50aGVzZXMsIHNwYWNlIG91dCBkaWZmZXJlbnQgZ3JvdXBzIGxpa2UgdGhpczoKKyAgICBpZiggKHg9c2l6ZW9mKHdobz11c2VycygpKSA+ICggKHkreikvKGEtYikgKyAoLShyYW5kb20oNykpKSApICkgCitBcyB5b3UgY2FuIHNlZSwgdGhlIHBhcmVudGhlc2VzIGZvciB0aGUgZm9yKCkgc3RhdGVtZW50LCBhcmUgc3BhY2VkIG91dAorZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3RhdGVtZW50LiAgSW4gYWRkaXRpb24sIGluZGl2aWR1YWwgc3ViLWdyb3VwcyBhcmUKK3NwYWNlZCBzbyB0aGV5IGNhbiBlYXNpbHkgYmUgc29ydGVkIG91dCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IuCisKK09uY2UgeW91IGhhdmUgYSBjb2Rpbmcgc3R5bGUgd2hpY2ggYWlkcyBpbiBwaWNraW5nIHRoZXNlIG91dCwgeW91IGxlYXJuCit3aGljaCBlcnJvciBtZXNzYWdlcyB0ZW5kIHRvIGluZGljYXRlIHRoaXMgc29ydCBvZiBlcnJvci4gIFdoZW4KK2RlYnVnZ2luZyB0aGlzIHNvcnQgb2YgZXJyb3IsIHlvdSB0aGVuIHZpZXcgYSBzZWN0aW9uIG9mIGNvZGUgYmVmb3JlIGFuZAorYWZ0ZXIgdGhlIGxpbmUgaW4gcXVlc3Rpb24uICBJbiBtb3N0IGFsbCBjYXNlcywgeW91IHdpbGwgY2F0Y2ggdGhlIGJ1ZyByaWdodAorb2ZmLgorCitBbm90aGVyIGNvbW1vbiBjb21waWxlIHRpbWUgZXJyb3IgaXMgd2hlcmUgdGhlIGRyaXZlciByZXBvcnRzIGFuCit1bmtub3duIGlkZW50aWZpZXIuICBHZW5lcmFsbHksIHR5cG9zIGFuZCBmYWlsdXJlIHRvIGRlY2xhcmUgdmFyaWFibGVzCitjYXVzZXMgdGhpcyBzb3J0IG9mIGVycm9yLiAgRm9ydHVuYXRlbHksIHRoZSBlcnJvciBsb2cgd2lsbCBhbG1vc3QgYWx3YXlzCit0ZWxsIHlvdSBleGFjdGx5IHdoZXJlIHRoZSBlcnJvciBpcy4gIFNvIHdoZW4gZGVidWdnaW5nIGl0LCBlbnRlciB0aGUKK2VkaXRvciBhbmQgZmluZCB0aGUgbGluZSBpbiBxdWVzdGlvbi4gIElmIHRoZSBwcm9ibGVtIGlzIHdpdGggYSB2YXJpYWJsZSBhbmQKK2lzIG5vdCBhIHR5cG8sIG1ha2Ugc3VyZSB5b3UgZGVjbGFyZWQgaXQgcHJvcGVybHkuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYKK2l0IGlzIGEgdHlwbywgc2ltcGx5IGZpeCBpdCEKKworT25lIHRoaW5nIHRvIGJld2FyZSBvZiwgaG93ZXZlciwgaXMgdGhhdCB0aGlzIGVycm9yIHdpbGwgc29tZXRpbWVzIGJlCityZXBvcnRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgbWlzc2luZyBwYXJlbnRoZXNlcywgYnJhY2tldHMsIG9yIGJyYWNlcwordHlwZSBlcnJvci4gIEluIHRoZXNlIHNpdHVhdGlvbnMsIHlvdXIgcHJvYmxlbSB3aXRoIGFuIHVua25vd24gaWRlbnRpZmllcgoraXMgb2Z0ZW4gYm9ndXMuICBUaGUgZHJpdmVyIG1pc3JlYWRzIHRoZSB3YXkgdGhlIHt9IG9yIHdoYXRldmVyIGFyZQorc2V0dXAsIGFuZCB0aHVzIGdldHMgdmFyaWFibGUgZGVjbGFyYXRpb25zIGNvbmZ1c2VkLiAgVGhlcmVmb3JlIG1ha2UKK3N1cmUgYWxsIG90aGVyIGNvbXBpbGUgdGltZSBlcnJvcnMgYXJlIGNvcnJlY3RlZCBiZWZvcmUgYm90aGVyaW5nIHdpdGgKK3RoZXNlIHR5cGVzIG9mIGVycm9ycy4KKworSW4gdGhlIHNhbWUgY2xhc3Mgd2l0aCB0aGUgYWJvdmUgZXJyb3IsIGlzIHRoZSBnZW5lcmFsIHN5bnRheCBlcnJvci4gIFRoZQorZHJpdmVyIGdlbmVyYXRlcyB0aGlzIGVycm9yIHdoZW4gaXQgc2ltcGx5IGZhaWxzIHRvIHVuZGVyc3RhbmQgd2hhdCB5b3UKK3NhaWQuICBBZ2FpbiwgdGhpcyBpcyBvZnRlbiBjYXVzZWQgYnkgdHlwb3MsIGJ1dCBjYW4gYWxzbyBiZSBjYXVzZWQgYnkgbm90Citwcm9wZXJseSB1bmRlcnN0YW5kaW5nIHRoZSBzeW50YXggb2YgYSBjZXJ0YWluIGZlYXR1cmUgbGlrZSB3cml0aW5nIGEgZm9yKCkKK3N0YXRlbWVudDogZm9yKHg9MCwgeDwxMCwgeCsrKS4gIElmIHlvdSBnZXQgYW4gZXJyb3IgbGlrZSB0aGlzIHdoaWNoIGlzCitub3QgYSBzeW50YXggZXJyb3IsIHRyeSByZXZpZXdpbmcgdGhlIHN5bnRheCBvZiB0aGUgc3RhdGVtZW50IGluIHdoaWNoIHRoZQorZXJyb3IgaXMgb2NjdXJyaW5nLgorCis3LjMgRGVidWdnaW5nIFJ1biBUaW1lIEVycm9ycworUnVuIHRpbWUgZXJyb3JzIGFyZSBtdWNoIG1vcmUgY29tcGxleCB0aGFuIHRoZWlyIGNvbXBpbGUgdGltZQorY291bnRlcnBhcnRzLiAgRm9ydHVuYXRlbHkgdGhlc2UgZXJyb3JzIGRvIGdldCBsb2dnZWQsIHRob3VnaCBtYW55CitjcmVhdG9ycyBkbyBub3QgcmVhbGlzZSBvciB0aGV5IGRvIG5vdCBrbm93IHdoZXJlIHRvIGxvb2suICBUaGUgZXJyb3IgbG9nCitmb3IgcnVuIHRpbWUgZXJyb3JzIGFyZSBhbHNvIGdlbmVyYWxseSBtdWNoIG1vcmUgZGV0YWlsZWQgdGhhbiBjb21waWxlCit0aW1lIGVycm9ycywgbWVhbmluZyB0aGF0IHlvdSBjYW4gdHJhY2UgdGhlIGhpc3Rvcnkgb2YgdGhlIGV4ZWN1dGlvbiB0cmFpbgorZnJvbSB3aGVyZSBpdCBzdGFydGVkIHRvIHdoZXJlIGl0IHdlbnQgd3JvbmcuICBZb3UgdGhlcmVmb3JlIGNhbiBzZXR1cAorZGVidWdnaW5nIHRyYXBzIHVzaW5nIHByZWNvbXBpbGVyIHN0YXRlbWVudHMgbXVjaCBlYXNpZXIgdXNpbmcgdGhlc2UKK2xvZ3MuICBSdW4gdGltZSBlcnJvcnMsIGhvd2V2ZXIsIHRlbmQgdG8gcmVzdWx0IGZyb20gdXNpbmcgbW9yZQorY29tcGxleCBjb2RpZ24gdGVjaG5pcXVlcyB0aGFuIGJlZ2lubmVycyB0ZW5kIHRvIHVzZSwgd2hpY2ggbWVhbnMgeW91CithcmUgbGVmdCB3aXRoIGVycm9ycyB3aGljaCBhcmUgZ2VuZXJhbGx5IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBzaW1wbGUKK2NvbXBpbGUgdGltZSBlcnJvcnMuCisKK1J1biB0aW1lIGVycm9ycyBhbG1vc3QgYWx3YXlzIHJlc3VsdCBmcm9tIG1pc3VzaW5nIExQQyBkYXRhIHR5cGVzLiAKK01vc3QgY29tbW9ubHksIHRyeWluZyB0byBkbyBjYWxsIG90aGVycyB1c2luZyBvYmplY3QgdmFyaWFibGVzIHdoaWNoIGFyZQorTlVMTCwgaW5kZXhpbmcgb24gbWFwcGluZywgYXJyYXksIG9yIHN0cmluZyB2YXJpYWJsZXMgd2hpY2ggYXJlCitOVUxMLCBvciBwYXNzaW5nIGJhZCBhcmd1bWVudHMgdG8gZnVuY3Rpb25zLiAgV2Ugd2lsbCBsb29rIGF0IGEgcmVhbAorcnVuIHRpbWUgZXJyb3IgbG9nIGZyb20gTmlnaHRtYXJlOgorCitCYWQgYXJndW1lbnQgMSB0byBleHBsb2RlKCkKK3Byb2dyYW06IGJpbi9zeXN0ZW0vX2dyZXAuYywgb2JqZWN0OiBiaW4vc3lzdGVtL19ncmVwCitsaW5lIDMyCisnICAgICAgIGNtZF9ob29rJyBpbiAnICAgICAgICBzdGQvbGl2aW5nLmMnICgnICAgICAgCitzdGQvdXNlciM0MDAyJylsaW5lIDgzCisnICAgICAgIGNtZF9ncmVwJyBpbiAnICBiaW4vc3lzdGVtL19ncmVwLmMnICgnICAgCitiaW4vc3lzdGVtL19ncmVwJylsaW5lIDMyICAgICAKK0JhZCBhcmd1bWVudCAyIHRvIG1lc3NhZ2UoKQorcHJvZ3JhbTogYWRtL29iai9zaW11bF9lZnVuLmMsIG9iamVjdDogYWRtL29iai9zaW11bF9lZnVuCitsaW5lIDM0CisnICAgICAgIGNtZF9ob29rJyBpbiAnICAgICAgICBzdGQvbGl2aW5nLmMnICgnICAgICAgCitzdGQvdXNlciM0OTU3JylsaW5lIDgzCisnICAgICAgIGNtZF9sb29rJyBpbiAnICBiaW4vbW9ydGFsL19sb29rLmMnICgnICAgCitiaW4vbW9ydGFsL19sb29rJylsaW5lIDIzCisnIGV4YW1pbmVfb2JqZWN0JyBpbiAnICBiaW4vbW9ydGFsL19sb29rLmMnICgnICAgCitiaW4vbW9ydGFsL19sb29rJylsaW5lIDc4CisnICAgICAgICAgIHdyaXRlJyBpbiAnYWRtL29iai9zaW11bF9lZnVuLmMnICgnIAorYWRtL29iai9zaW11bF9lZnVuJylsaW5lIDM0CitCYWQgYXJndW1lbnQgMSB0byBjYWxsX290aGVyKCkKK3Byb2dyYW06IGJpbi9zeXN0ZW0vX2Nsb25lLmMsIG9iamVjdDogYmluL3N5c3RlbS9fY2xvbmUKK2xpbmUgMjUKKycgICAgICAgY21kX2hvb2snIGluICcgICAgICAgIHN0ZC9saXZpbmcuYycgKCcgICAgICAKK3N0ZC91c2VyIzM3MzQnKWxpbmUgODMKKycgICAgICBjbWRfY2xvbmUnIGluICcgYmluL3N5c3RlbS9fY2xvbmUuYycgKCcgIAorYmluL3N5c3RlbS9fY2xvbmUnKWxpbmUgMjUKK0lsbGVnYWwgaW5kZXgKK3Byb2dyYW06IHN0ZC9tb25zdGVyLmMsIG9iamVjdDoKK3dpemFyZHMvemFrbmFpZmVuL3NweSM3MjA1IGxpbmUgNzYKKycgICAgIGhlYXJ0X2JlYXQnIGluICcgICAgICAgc3RkL21vbnN0ZXIuYycKKygnd2l6YXJkcy96YWtuYWlmZW4vc3B5IzcyMDUnKWxpbmUKKzc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitBbGwgb2YgdGhlIGVycm9ycywgZXhjZXB0IHRoZSBsYXN0IG9uZSwgaW52b2x2ZSBwYXNzaW5nIGEgYmFkIGFyZ3VtZW50IHRvIGEKK2Z1bmN0aW9uLiAgVGhlIGZpcnN0IGJ1ZywgaW52b2x2ZXMgcGFzc2luZyBhIGJhZCBmaXJzdCBhcnVtZW50IHRvIHRoZSBlZnVuCitleHBsb2RlKCkuICBUaGlzIGVmdW4gZXhwZWN0cyBhIHN0cmluZyBhcyBpdHMgZmlyc3QgYXJnbWVudC4gIEluIGRlYnVnZ2luZwordGhlc2Uga2luZHMgb2YgZXJyb3JzLCB3ZSB3b3VsZCB0aGVyZWZvcmUgZ28gdG8gbGluZSAzMiBpbgorL2Jpbi9zeXN0ZW0vX2dyZXAuYyBhbmQgY2hlY2sgdG8gc2VlIHdoYXQgdGhlIGRhdGEgdHlwZSBvZiB0aGUgZmlyc3QKK2FyZ3VtZW50IGJlaW5nIHBhc3NlZCBpbiBmYWN0IGlzLiAgSW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UsIHRoZSB2YWx1ZSBiZWluZworcGFzc2VkIHNob3VsZCBiZSBhIHN0cmluZy4KKworSWYgZm9yIHNvbWUgcmVhc29uIEkgaGFzIGFjdHVhbGx5IHBhc3NlZCBzb21ldGhpbmcgZWxzZSwgSSB3b3VsZCBiZSBkb25lCitkZWJ1Z2dpbmcgYXQgdGhhdCBwb2ludCBhbmQgZml4IGl0IHNpbXBseSBieSBtYWtpbmcgc3VyZSB0aGF0IEkgd2FzCitwYXNzaW5nIGEgc3RyaW5nLiAgVGhpcyBzaXR1YXRpb24gaXMgbW9yZSBjb21wbGV4LiAgSSBub3cgbmVlZCB0byB0cmFjZQordGhlIGFjdHVhbCB2YWx1ZXMgY29udGFpbmVkIGJ5IHRoZSB2YXJpYWJsZSBiZWluZyBwYXNzZWQgdG8gZXhwbG9kZSwgc28KK3RoYXQgSSBjYW4gc2VlIHdoYXQgaXQgaXMgdGhlIGV4cGxvZGUoKSBlZnVuIHNlZXMgdGhhdCBpdCBpcyBiZWluZyBwYXNzZWQuCisKK1RoZSBsaW5lIGlzIHF1ZXN0aW9uIGlzIHRoaXM6CisgYm9yZ1tmaWxlc1tpXV0gPSByZWdleHAoZXhwbG9kZShyZWFkX2ZpbGUoZmlsZXNbaV0pLCAiXG4iKSwgZXhwKTsKK3doZXJlIGZpbGVzIGlzIGFuIGFycmF5IGZvciBzdHJpbmdzLCBpIGlzIGFuIGludGVnZXIsIGFuZCBib3JnIGlzIGEgbWFwcGluZy4gCitTbyBjbGVhcmx5IHdlIG5lZWQgdG8gZmluZCBvdXQgd2hhdCB0aGUgdmFsdWUgb2YgcmVhZF9maWxlKGZpbGVzW2ldKSBpcy4gCitXZWxsLCB0aGlzIGVmdW4gcmV0dXJucyBhIHN0cmluZyB1bmxlc3MgdGhlIGZpbGUgaW4gcXVlc3Rpb24gZG9lcyBub3QgZXhpc3QsCit0aGUgb2JqZWN0IGluIHF1ZXN0aW9uIGRvZXMgbm90IGhhdmUgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpbGUgaW4gcXVlc3Rpb24sIG9yCit0aGUgZmlsZSBpbiBxdWVzdGlvbiBpcyBhbiBlbXB0eSBmaWxlLCBpbiB3aGljaCBjYXNlcyB0aGUgZnVuY3Rpb24gd2lsbAorcmV0dXJuIE5VTEwuICBDbGVhcmx5LCBvdXIgcHJvYmxlbSBpcyB0aGF0IG9uZSBvZiB0aGVzZSBldmVudHMgbXVzdAoraGF2ZSBoYXBwZW5lZC4gIEluIG9yZGVyIHRvIHNlZSB3aGljaCwgd2UgbmVlZCB0byBsb29rIGF0IGZpbGVzW2ldLgorCitFeGFtaW5pbmcgdGhlIGNvZGUsIHRoZSBmaWxlcyBhcnJheSBnZXRzIGl0cyB2YWx1ZSB0aHJvdWdoIHRoZSBnZXRfZGlyKCkKK2VmdW4uICBUaGlzIHJldHVybnMgYWxsIHRoZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSBpZiB0aGUgb2JqZWN0IGhhcyByZWFkIGFjY2VzcwordG8gdGhlIGRpcmVjdG9yeS4gIFRoZXJlZm9yZSB0aGUgcHJvYmxlbSBpcyBuZWl0aGVyIGxhY2sgb2YgYWNjZXNzIG9yIG5vbi0KK2V4aXN0ZW50IGZpbGVzLiAgVGhlIGZpbGUgd2hpY2ggY2F1c2VkIHRoaXMgZXJyb3IgdGhlbiBtdXN0IGhhdmUgYmVlbiBhbgorZW1wdHkgZmlsZS4gIEFuZCwgaW4gZmFjdCwgdGhhdCBpcyBleGFjdGx5IHdoYXQgY2F1c2VkIHRoaXMgZXJyb3IuICBUbworZGVidWcgdGhhdCwgd2Ugd291bGQgcGFzcyBmaWxlcyB0aHJvdWdoIHRoZSBmaWx0ZXIoKSBlZnVuIGFuZCBtYWtlCitzdXJlIHRoYXQgb25seSBmaWxlcyB3aXRoIGEgZmlsZSBzaXplIGdyZWF0ZXIgdGhhbiAwIHdlcmUgYWxsb3dlZCBpbnRvIHRoZQorYXJyYXkuCisKK1RoZSBrZXkgdG8gZGVidWdnaW5nIGEgcnVuIHRpbWUgZXJyb3IgaXMgdGhlcmVmb3JlIGtub3dpbmcgZXhhY3RseSB3aGF0Cit0aGUgdmFsdWVzIG9mIGFsbCB2YXJpYWJsZXMgaW4gcXVlc3Rpb24gYXJlIGF0IHRoZSBleGFjdCBtb21lbnQgd2hlcmUgdGhlCitidWcgY3JlYXRlZC4gIFdoZW4gcmVhZGluZyB5b3VyIHJ1biB0aW1lIGxvZywgYmUgY2FyZWZ1bCB0byBzZXBhcmF0ZSB0aGUKK29iamVjdCBmcm9tIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBidWcgb2NjdXJyZWQuICBGb3IgZXhhbXBsZSwgdGhlCitpbmRleGluZyBlcnJvciBhYm92ZSBjYW1lIGFib3V0IGluIHRoZSBvYmplY3QgL3dpemFyZHMvemFrbmFpZmVuL3NweSwKK2J1dCB0aGUgZXJyb3Igb2NjdXJlZCB3aGlsZSBydW5uaW5nIGEgZnVuY3Rpb24gaW4gL3N0ZC9tb25zdGVyLmMsIHdoaWNoCit0aGUgb2JqZWN0IGluaGVyaXRlZC4KKworNy40IE1hbGZ1bmN0aW9uaW5nIENvZGUKK1RoZSBuYXN0aWVzdCBwcm9ibGVtIHRvIGRlYWwgd2l0aCBpcyB3aGVuIHlvdXIgY29kZSBkb2VzIG5vdCBiZWhhdmUgdGhlCit3YXkgeW91IGludGVuZGVkIGl0IHRvIGJlaGF2ZS4gIFRoZSBvYmplY3QgbG9hZHMgZmluZSwgYW5kIGl0IHByb2R1Y2VzIG5vCitydW4gdGltZSBlcnJvcnMsIGJ1dCB0aGluZ3Mgc2ltcGx5IGRvIG5vdCBoYXBwZW4gdGhlIHdheSB0aGV5IHNob3VsZC4gCitTaW5jZSB0aGUgZHJpdmVyIGRvZXMgbm90IHNlZSBhIHByb2JsZW0gd2l0aCB0aGlzIHR5cGUgb2YgY29kZSwgbm8gbG9ncworYXJlIHByb2R1Y2VkLiAgWW91IHRoZXJlZm9yZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIGNvZGUgbGluZSBieSBsaW5lCithbmQgZmlndXJlIG91dCB3aGF0IGlzIGhhcHBlbmluZy4KKworU3RlcCAxOiBMb2NhdGUgdGhlIGxhc3QgbGluZSBvZiBjb2RlIHlvdSBrbmV3IHN1Y2Nlc3NmdWxseSBleGVjdXRlZAorU3RlcCAyOiBMb2NhdGUgdGhlIGZpcnN0IGxpbmUgb2YgY29kZSB3aGVyZSB5b3Uga25vdyB0aGluZ3MgYXJlIGdvaW5nCit3cm9uZworU3RlcCAzOiBFeGFtaW5lIHRoZSBmbG93IG9mIHRoZSBjb2RlIGZyb20gdGhlIGtub3duIHN1Y2Nlc3NmdWwgcG9pbnQgdG8KK3RoZSBmaXJzdCBrbm93biB1bnN1Y2Nlc3NmdWwgcG9pbnQuCisKK01vcmUgb2Z0ZW4gdGhhbiBub3QsIHRoZXNlIHByb2JsZW1zIG9jY3VyciB3aGVuIHlvdSBhcmUgdXNpbmcgaWYoKQorc3RhdGVtZW50cyBhbmQgbm90IGFjY291bnRpbmcgZm9yIGFsbCBwb3NzaWJpbGl0aWVzLiAgRm9yIGV4YW1wbGU6CisKK2ludCBjbWQoc3RyaW5nIHRtcCkgeworICAgIGlmKHN0cmluZ3AodG1wKSkgcmV0dXJuIGRvX2EoKQorICAgIGVsc2UgaWYoaW50cCh0bXApKSByZXR1cm4gZG9fYigpCisgICAgcmV0dXJuIDE7Cit9CisKK0luIHRoaXMgY29kZSwgd2UgZmluZCB0aGF0IGl0IGNvbXBpbGVzIGFuZCBydW5zIGZpbmUuICBQcm9ibGVtIGlzIG5vdGhpbmcKK2hhcHBlbnMgd2hlbiBpdCBpcyBleGVjdXRlZC4gIFdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGUgY21kKCkgZnVuY3Rpb24KK2lzIGdldHRpbmcgZXhlY3V0ZWQsIHNvIHdlIGNhbiBzdGFydCB0aGVyZS4gIFdlIGFsc28ga25vdyB0aGF0IGEgdmFsdWUgb2YKKzEgaXMgaW4gZmFjdCBiZWluZyByZXR1cm5lZCwgc2luY2Ugd2UgZG8gbm90IHNlZSAiV2hhdD8iIHdoZW4gd2UgZW50ZXIKK3RoZSBjb21tYW5kLiAgSW1tZWRpYXRlbHksIHdlIGNhbiBzZWUgdGhhdCBmb3Igc29tZSByZWFzb24gdGhlCit2YXJpYWJsZSB0bXAgaGFzIGEgdmFsdWUgb3RoZXIgdGhhbiBzdHJpbmcgb3IgaW50LiAgQXMgaXQgdHVybnMgb3V0LCB3ZQoraXNzdWVkIHRoZSBjb21tYW5kIHdpdGhvdXQgcGFyYW1ldGVycywgc28gdG1wIHdhcyBOVUxMIGFuZCBmYWlsZWQKK2FsbCB0ZXN0cy4KKworVGhlIGFib3ZlIGV4YW1wbGUgaXMgcmF0aGVyIHNpbXBsaXN0aWMsIGJvcmRlcmluZyBvbiBzaWxseS4gCitOZXZlcnRoZWxlc3MsIGl0IGdpdmVzIHlvdSBhbiBpZGVhIG9mIGhvdyB0byBleGFtaW5lIHRoZSBmbG93IG9mIHRoZQorY29kZSB3aGVuIGRlYnVnZ2luZyBtYWxmdW5jdGlvbmluZyBjb2RlLiAgT3RoZXIgdG9vbHMgYXJlIGF2YWlsYWJsZSBhcword2VsbCB0byBoZWxwIGluIGRlYnVnZ2luZyBjb2RlLiAgVGhlIG1vc3QgaW1wb3J0YW50IHRvb2wgaXMgdGhlIHVzZSBvZgordGhlIHByZWNvbXBpbGVyIHRvIGRlYnVnIGNvZGUuICBXaXRoIHRoZSBjb2RlIGFib3ZlLCB3ZSBoYXZlIGEgY2xhdXNlCitjaGVja2luZyBmb3IgaW50ZWdlcnMgYmVpbmcgcGFzc2VkIHRvIGNtZCgpLiAgV2hlbiB3ZSB0eXBlICJjbWQgMTAiLAord2UgYXJlIGV4cGVjdGluZyBkb19iKCkgdG8gZXhlY3V0ZS4gIFdlIG5lZWQgdG8gc2VlIHdoYXQgdGhlIHZhbHVlIG9mCit0bXAgaXMgYmVmb3JlIHdlIGdldCBpbnRvIHRoZSBsb29wOgorCisjZGVmaW5lIERFQlVHCitpbnQgY21kKHN0cmluZyB0bXApIHsKKyNpZmRlZiBERUJVRworICAgIHdyaXRlKHRtcCk7CisjZW5kaWYKKyAgICBpZihzdHJpbmdwKHRtcCkpIHJldHVybiBkb19hKCk7CisgICAgZWxzZSBpZihpbnRwKHRtcCkpIHJldHVybiBkb19iKCk7CisgICAgZWxzZSByZXR1cm4gMTsKK30KKworV2UgZmluZCBvdXQgaW1tZWRpYXRlbHkgdXBvbiBpc3N1aW5nIHRoZSBjb21tYW5kLCB0aGF0IHRtcCBoYXMgYQordmFsdWUgb2YgIjEwIi4gIExvb2tpbmcgYmFjayBhdCB0aGUgY29kZSwgd2Ugc2xhcCBvdXJzZWx2ZXMgc2lsbHksCitmb3JnZXR0aW5nIHRoYXQgd2UgaGF2ZSB0byBjaGFuZ2UgY29tbWFuZCBhcmd1bWVudHMgdG8gaW50ZWdlcnMgdXNpbmcKK3NzY2FuZigpIGJlZm9yZSBldmFsdWF0aW5nIHRoZW0gYXMgaW50ZWdlcnMuCisKKzcuNSBTdW1tYXJ5CitUaGUga2V5IHRvIGRlYnVnZ2luZyBhbnkgTFBDIHByb2JsZW0gaXMgYWx3YXlzIGJlaW5nIGF3YXJlIG9mIHdoYXQKK3RoZSB2YWx1ZXMgb2YgeW91ciB2YXJpYWJsZXMgYXJlIGF0IGFueSBnaXZlbiBzdGVwIGluIHlvdXIgY29kZS4gIExQQworZXhlY3V0aW9uIHJlZHVjZXMgb24gdGhlIHNpbXBsZXN0IGxldmVsIHRvIGNoYW5nZXMgaW4gdmFyaWFibGUgdmFsdWVzLCBzbworYmFkIHZhbHVlcyBhcmUgd2hhdCBjYXVzZXMgYmFkIHRoaW5ncyB0byBoYXBwZW4gb25jZSBjb2RlIGhhcyBiZWVuCitsb2FkZWQgaW50byBtZW1vcnkuICBJZiB5b3UgZ2V0IGVycm9ycyBhYm91dCBiYWQgYXJndW1lbnRzIHRvCitmdW5jdGlvbnMsIG1vcmUgbGlrZWx5IHRoYW4gbm90IHlvdSBhcmUgcGFzc2luZyBhIE5VTEwgdmFsdWUgdG8gYQorZnVuY3Rpb24gZm9yIHRoYXQgYXJndW1lbnQuICBUaGlzIGhhcHBlbnMgbW9zdCBvZnRlbiB3aXRoIG9iamVjdHMsIHNpbmNlCitwZW9wbGUgd2lsbCBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAxKSB1c2UgYSB2YWx1ZSB0aGF0IHdhcyBzZXQgdG8gYW4gb2JqZWN0IHRoYXQgaGFzIHNpbmNlIGRlc3RydWN0ZWQKKyAgICAyKSB1c2UgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzX3BsYXllcigpIHdoZW4gdGhlcmUgaXMgbm8gdGhpc19wbGF5ZXIoKQorICAgIDMpIHVzZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXNfb2JqZWN0KCkganVzdCBhZnRlciB0aGlzX29iamVjdCgpIHdhcworICAgIGRlc3RydWN0ZWQKKworSW4gYWRkaXRpb24sIHBlb3BsZSB3aWxsIG9mdGVuIHJ1biBpbnRvIGVycm9ycyBpbnZvbHZpbmcgaWxsZWdhbCBpbmRleGluZyBvcgoraW5kZXhpbmcgb24gaWxsZWdhbCB0eXBlcy4gIE1vc3Qgb2Z0ZW4sIHRoaXMgaXMgYmVjYXVzZSB0aGUgbWFwcGluZyBvcgorYXJyYXkgaW4gcXVlc3Rpb24gd2FzIG5vdCBpbml0aWFsaXplZCwgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW5kZXhlZC4gCitUaGUga2V5IGlzIHRvIGtub3cgZXhhY3RseSB3aGF0IHRoZSBmdWxsIHZhbHVlIG9mIHRoZSBhcnJheSBvciBtYXBwaW5nCitzaG91bGQgYmUgYXQgdGhlIHBvaW50IGluIHF1ZXN0aW9uLiAgSW4gYWRkaXRpb24sIHdhdGNoIGZvciB1c2luZyBpbmRleAorbnVtYmVycyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiBnaXZlbiBhcnJheXMKKworRmluYWxseSwgbWFrZSB1c2Ugb2YgdGhlIHByZWNvbXBpbGVyIHRvIHRlbXBvcmFybHkgdGhyb3cgb3V0IGNvZGUsIG9yCitpbnRyb2R1Y2UgY29kZSB3aGljaCB3aWxsIHNob3cgeW91IHRoZSB2YWx1ZXMgb2YgdmFyaWFibGVzLiAgVGhlCitwcmVjb21waWxlciBtYWtlcyBpdCBlYXN5IHRvIGdldCByaWQgb2YgZGVidWdnaW5nIGNvZGUgcXVpY2tseSBvbmNlIHlvdQorYXJlIGRvbmUuICBZb3UgY2FuIHNpbXBseSByZW1vdmUgdGhlIERFQlVHIGRlZmluZSB3aGVuIHlvdSBhcmUKK2RvbmUuCisKK0NvcHlyaWdodCAoYykgR2VvcmdlIFJlZXNlIDE5OTMK