ZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdHNvcnQudHh0IGIvT2JqZWN0cy9saXN0c29ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzN2JlYgotLS0gL2Rldi9udWxsCisrKyBiL09iamVjdHMvbGlzdHNvcnQudHh0CkBAIC0wLDAgKzEsNjE4IEBACitJbnRybworLS0tLS0KK1RoaXMgZGVzY3JpYmVzIGFuIGFkYXB0aXZlLCBzdGFibGUsIG5hdHVyYWwgbWVyZ2Vzb3J0LCBtb2Rlc3RseSBjYWxsZWQKK3RpbXNvcnQgKGhleSwgSSBlYXJuZWQgaXQgPHdpbms+KS4gIEl0IGhhcyBzdXBlcm5hdHVyYWwgcGVyZm9ybWFuY2Ugb24gbWFueQora2luZHMgb2YgcGFydGlhbGx5IG9yZGVyZWQgYXJyYXlzIChsZXNzIHRoYW4gbGcoTiEpIGNvbXBhcmlzb25zIG5lZWRlZCwgYW5kCithcyBmZXcgYXMgTi0xKSwgeWV0IGFzIGZhc3QgYXMgUHl0aG9uJ3MgcHJldmlvdXMgaGlnaGx5IHR1bmVkIHNhbXBsZXNvcnQKK2h5YnJpZCBvbiByYW5kb20gYXJyYXlzLgorCitJbiBhIG51dHNoZWxsLCB0aGUgbWFpbiByb3V0aW5lIG1hcmNoZXMgb3ZlciB0aGUgYXJyYXkgb25jZSwgbGVmdCB0byByaWdodCwKK2FsdGVybmF0ZWx5IGlkZW50aWZ5aW5nIHRoZSBuZXh0IHJ1biwgdGhlbiBtZXJnaW5nIGl0IGludG8gdGhlIHByZXZpb3VzCitydW5zICJpbnRlbGxpZ2VudGx5Ii4gIEV2ZXJ5dGhpbmcgZWxzZSBpcyBjb21wbGljYXRpb24gZm9yIHNwZWVkLCBhbmQgc29tZQoraGFyZC13b24gbWVhc3VyZSBvZiBtZW1vcnkgZWZmaWNpZW5jeS4KKworCitDb21wYXJpc29uIHdpdGggUHl0aG9uJ3MgU2FtcGxlc29ydCBIeWJyaWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKyB0aW1zb3J0IGNhbiByZXF1aXJlIGEgdGVtcCBhcnJheSBjb250YWluaW5nIGFzIG1hbnkgYXMgTi8vMiBwb2ludGVycywKKyAgd2hpY2ggbWVhbnMgYXMgbWFueSBhcyAyKk4gZXh0cmEgYnl0ZXMgb24gMzItYml0IGJveGVzLiAgSXQgY2FuIGJlCisgIGV4cGVjdGVkIHRvIHJlcXVpcmUgYSB0ZW1wIGFycmF5IHRoaXMgbGFyZ2Ugd2hlbiBzb3J0aW5nIHJhbmRvbSBkYXRhOyBvbgorICBkYXRhIHdpdGggc2lnbmlmaWNhbnQgc3RydWN0dXJlLCBpdCBtYXkgZ2V0IGF3YXkgd2l0aG91dCB1c2luZyBhbnkgZXh0cmEKKyAgaGVhcCBtZW1vcnkuICBUaGlzIGFwcGVhcnMgdG8gYmUgdGhlIHN0cm9uZ2VzdCBhcmd1bWVudCBhZ2FpbnN0IGl0LCBidXQKKyAgY29tcGFyZWQgdG8gdGhlIHNpemUgb2YgYW4gb2JqZWN0LCAyIHRlbXAgYnl0ZXMgd29yc3QtY2FzZSAoYWxzbyBleHBlY3RlZC0KKyAgY2FzZSBmb3IgcmFuZG9tIGRhdGEpIGRvZXNuJ3Qgc2NhcmUgbWUgbXVjaC4KKworICBJdCB0dXJucyBvdXQgdGhhdCBQZXJsIGlzIG1vdmluZyB0byBhIHN0YWJsZSBtZXJnZXNvcnQsIGFuZCB0aGUgY29kZSBmb3IKKyAgdGhhdCBhcHBlYXJzIGFsd2F5cyB0byByZXF1aXJlIGEgdGVtcCBhcnJheSB3aXRoIHJvb20gZm9yIGF0IGxlYXN0IE4KKyAgcG9pbnRlcnMuIChOb3RlIHRoYXQgSSB3b3VsZG4ndCB3YW50IHRvIGRvIHRoYXQgZXZlbiBpZiBzcGFjZSB3ZXJlbid0IGFuCisgIGlzc3VlOyBJIGJlbGlldmUgaXRzIGVmZm9ydHMgYXQgbWVtb3J5IGZydWdhbGl0eSBhbHNvIHNhdmUgdGltc29ydAorICBzaWduaWZpY2FudCBwb2ludGVyLWNvcHlpbmcgY29zdHMsIGFuZCBhbGxvdyBpdCB0byBoYXZlIGEgc21hbGxlciB3b3JraW5nCisgIHNldC4pCisKKysgQWNyb3NzIGFib3V0IGZvdXIgaG91cnMgb2YgZ2VuZXJhdGluZyByYW5kb20gYXJyYXlzLCBhbmQgc29ydGluZyB0aGVtCisgIHVuZGVyIGJvdGggbWV0aG9kcywgc2FtcGxlc29ydCByZXF1aXJlZCBhYm91dCAxLjUlIG1vcmUgY29tcGFyaXNvbnMKKyAgKHRoZSBwcm9ncmFtIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlKS4KKworKyBJbiByZWFsIGxpZmUsIHRoaXMgbWF5IGJlIGZhc3RlciBvciBzbG93ZXIgb24gcmFuZG9tIGFycmF5cyB0aGFuCisgIHNhbXBsZXNvcnQgd2FzLCBkZXBlbmRpbmcgb24gcGxhdGZvcm0gcXVpcmtzLiAgU2luY2UgaXQgZG9lcyBmZXdlcgorICBjb21wYXJpc29ucyBvbiBhdmVyYWdlLCBpdCBjYW4gYmUgZXhwZWN0ZWQgdG8gZG8gYmV0dGVyIHRoZSBtb3JlCisgIGV4cGVuc2l2ZSBhIGNvbXBhcmlzb24gZnVuY3Rpb24gaXMuICBPVE9ILCBpdCBkb2VzIG1vcmUgZGF0YSBtb3ZlbWVudAorICAocG9pbnRlciBjb3B5aW5nKSB0aGFuIHNhbXBsZXNvcnQsIGFuZCB0aGF0IG1heSBuZWdhdGUgaXRzIHNtYWxsCisgIGNvbXBhcmlzb24gYWR2YW50YWdlIChkZXBlbmRpbmcgb24gcGxhdGZvcm0gcXVpcmtzKSB1bmxlc3MgY29tcGFyaXNvbgorICBpcyB2ZXJ5IGV4cGVuc2l2ZS4KKworKyBPbiBhcnJheXMgd2l0aCBtYW55IGtpbmRzIG9mIHByZS1leGlzdGluZyBvcmRlciwgdGhpcyBibG93cyBzYW1wbGVzb3J0IG91dAorICBvZiB0aGUgd2F0ZXIuICBJdCdzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gc2FtcGxlc29ydCBldmVuIG9uIHNvbWUKKyAgY2FzZXMgc2FtcGxlc29ydCB3YXMgc3BlY2lhbC1jYXNpbmcgdGhlIHNub3Qgb3V0IG9mLiAgSSBiZWxpZXZlIHRoYXQgbGlzdHMKKyAgdmVyeSBvZnRlbiBkbyBoYXZlIGV4cGxvaXRhYmxlIHBhcnRpYWwgb3JkZXIgaW4gcmVhbCBsaWZlLCBhbmQgdGhpcyBpcyB0aGUKKyAgc3Ryb25nZXN0IGFyZ3VtZW50IGluIGZhdm9yIG9mIHRpbXNvcnQgKGluZGVlZCwgc2FtcGxlc29ydCdzIHNwZWNpYWwgY2FzZXMKKyAgZm9yIGV4dHJlbWUgcGFydGlhbCBvcmRlciBhcmUgYXBwcmVjaWF0ZWQgYnkgcmVhbCB1c2VycywgYW5kIHRpbXNvcnQgZ29lcworICBtdWNoIGRlZXBlciB0aGFuIHRob3NlLCBpbiBwYXJ0aWN1bGFyIG5hdHVyYWxseSBjb3ZlcmluZyBldmVyeSBjYXNlIHdoZXJlCisgIHNvbWVvbmUgaGFzIHN1Z2dlc3RlZCAiYW5kIGl0IHdvdWxkIGJlIGNvb2wgaWYgbGlzdC5zb3J0KCkgaGFkIGEgc3BlY2lhbAorICBjYXNlIGZvciB0aGlzIHRvbyAuLi4gYW5kIGZvciB0aGF0IC4uLiIpLgorCisrIEhlcmUgYXJlIGV4YWN0IGNvbXBhcmlzb24gY291bnRzIGFjcm9zcyBhbGwgdGhlIHRlc3RzIGluIHNvcnRwZXJmLnB5LAorICB3aGVuIHJ1biB3aXRoIGFyZ3VtZW50cyAiMTUgMjAgMSIuCisKKyAgRmlyc3QgdGhlIHRyaXZpYWwgY2FzZXMsIHRyaXZpYWwgZm9yIHNhbXBsZXNvcnQgYmVjYXVzZSBpdCBzcGVjaWFsLWNhc2VkCisgIHRoZW0sIGFuZCB0cml2aWFsIGZvciB0aW1zb3J0IGJlY2F1c2UgaXQgbmF0dXJhbGx5IHdvcmtzIG9uIHJ1bnMuICBXaXRoaW4KKyAgYW4gIm4iIGJsb2NrLCB0aGUgZmlyc3QgbGluZSBnaXZlcyB0aGUgIyBvZiBjb21wYXJlcyBkb25lIGJ5IHNhbXBsZXNvcnQsCisgIHRoZSBzZWNvbmQgbGluZSBieSB0aW1zb3J0LCBhbmQgdGhlIHRoaXJkIGxpbmUgaXMgdGhlIHBlcmNlbnRhZ2UgYnkKKyAgd2hpY2ggdGhlIHNhbXBsZXNvcnQgY291bnQgZXhjZWVkcyB0aGUgdGltc29ydCBjb3VudDoKKworICAgICAgbiAgIFxzb3J0ICAgL3NvcnQgICA9c29ydAorLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0gIC0tLS0tLQorICAzMjc2OCAgIDMyNzY4ICAgMzI3NjcgICAzMjc2NyAgc2FtcGxlc29ydAorICAgICAgICAgIDMyNzY3ICAgMzI3NjcgICAzMjc2NyAgdGltc29ydAorICAgICAgICAgIDAuMDAlICAgMC4wMCUgICAwLjAwJSAgKHNhbXBsZXNvcnQgLSB0aW1zb3J0KSAvIHRpbXNvcnQKKworICA2NTUzNiAgIDY1NTM2ICAgNjU1MzUgICA2NTUzNQorICAgICAgICAgIDY1NTM1ICAgNjU1MzUgICA2NTUzNQorICAgICAgICAgIDAuMDAlICAgMC4wMCUgICAwLjAwJQorCisgMTMxMDcyICAxMzEwNzIgIDEzMTA3MSAgMTMxMDcxCisgICAgICAgICAxMzEwNzEgIDEzMTA3MSAgMTMxMDcxCisgICAgICAgICAgMC4wMCUgICAwLjAwJSAgIDAuMDAlCisKKyAyNjIxNDQgIDI2MjE0NCAgMjYyMTQzICAyNjIxNDMKKyAgICAgICAgIDI2MjE0MyAgMjYyMTQzICAyNjIxNDMKKyAgICAgICAgICAwLjAwJSAgIDAuMDAlICAgMC4wMCUKKworIDUyNDI4OCAgNTI0Mjg4ICA1MjQyODcgIDUyNDI4NworICAgICAgICAgNTI0Mjg3ICA1MjQyODcgIDUyNDI4NworICAgICAgICAgIDAuMDAlICAgMC4wMCUgICAwLjAwJQorCisxMDQ4NTc2IDEwNDg1NzYgMTA0ODU3NSAxMDQ4NTc1CisgICAgICAgIDEwNDg1NzUgMTA0ODU3NSAxMDQ4NTc1CisgICAgICAgICAgMC4wMCUgICAwLjAwJSAgIDAuMDAlCisKKyAgVGhlIGFsZ29yaXRobXMgYXJlIGVmZmVjdGl2ZWx5IGlkZW50aWNhbCBpbiB0aGVzZSBjYXNlcywgZXhjZXB0IHRoYXQKKyAgdGltc29ydCBkb2VzIG9uZSBsZXNzIGNvbXBhcmUgaW4gXHNvcnQuCisKKyAgTm93IGZvciB0aGUgbW9yZSBpbnRlcmVzdGluZyBjYXNlcy4gIGxnKG4hKSBpcyB0aGUgaW5mb3JtYXRpb24tdGhlb3JldGljCisgIGxpbWl0IGZvciB0aGUgYmVzdCBhbnkgY29tcGFyaXNvbi1iYXNlZCBzb3J0aW5nIGFsZ29yaXRobSBjYW4gZG8gb24KKyAgYXZlcmFnZSAoYWNyb3NzIGFsbCBwZXJtdXRhdGlvbnMpLiAgV2hlbiBhIG1ldGhvZCBnZXRzIHNpZ25pZmljYW50bHkKKyAgYmVsb3cgdGhhdCwgaXQncyBlaXRoZXIgYXN0cm9ub21pY2FsbHkgbHVja3ksIG9yIGlzIGZpbmRpbmcgZXhwbG9pdGFibGUKKyAgc3RydWN0dXJlIGluIHRoZSBkYXRhLgorCisgICAgICBuICAgbGcobiEpICAgICpzb3J0ICAgICAzc29ydCAgICArc29ydCAgICB+c29ydCAgICAgIXNvcnQKKy0tLS0tLS0gIC0tLS0tLS0gICAtLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tICAtLS0tLS0tICAtLS0tLS0tLQorICAzMjc2OCAgIDQ0NDI1NSAgIDQ1MzA4NCAgICA0NTM2MDQgICAgMzI5MDggICAxMzA0ODQgICAgNDY5MTMyICBzYW1wbGVzb3J0CisgICAgICAgICAgICAgICAgICAgNDQ5MjM1ICAgICAzMzAxOSAgICAzMzAxNiAgIDE4ODcyMCAgICAgNjU1MzQgIHRpbXNvcnQKKyAgICAgICAgICAgICAgICAgICAgMC44NiUgIDEyNzMuNzclICAgLTAuMzMlICAtMzAuODYlICAgNjE1Ljg2JSAgJWNoIGZyb20gdGltc29ydAorCisgIDY1NTM2ICAgOTU0MDM3ICAgOTczMTExICAgIDk3MDQ2NCAgICA2NTY4NiAgIDI2MDAxOSAgIDEwMDQ1OTcKKyAgICAgICAgICAgICAgICAgICA5NjM5MjQgICAgIDY1NzY3ICAgIDY1ODAyICAgMzc3NjM0ICAgIDEzMTA3MAorICAgICAgICAgICAgICAgICAgICAwLjk1JSAgMTM3NS42MSUgICAtMC4xOCUgIC0zMS4xNSUgICA2NjYuNDYlCisKKyAxMzEwNzIgIDIwMzkxMzcgIDIxMDAwMTkgICAyMTAyNzA4ICAgMTMxMjMyICAgNTU1MDM1ICAgMjE2MTI2OAorICAgICAgICAgICAgICAgICAgMjA1ODg2MyAgICAxMzE0MjIgICAxMzEzNjMgICA3NTU0NzYgICAgMjYyMTQyCisgICAgICAgICAgICAgICAgICAgIDIuMDAlICAxNDk5Ljk3JSAgIC0wLjEwJSAgLTI2LjUzJSAgIDcyNC40NiUKKworIDI2MjE0NCAgNDM0MDQwOSAgNDQ2MTQ3MSAgIDQ0NDI3OTYgICAyNjIzMTQgIDExMDc4MjYgICA0NTg0MzE2CisgICAgICAgICAgICAgICAgICA0MzgwMTQ4ICAgIDI2MjQ0NiAgIDI2MjQ2NiAgMTUxMTE3NCAgICA1MjQyODYKKyAgICAgICAgICAgICAgICAgICAgMS44NiUgIDE1OTIuODQlICAgLTAuMDYlICAtMjYuNjklICAgNzc0LjM5JQorCisgNTI0Mjg4ICA5MjA1MDk2ICA5NDQ4MTQ2ICAgOTM2ODY4MSAgIDUyNDQ2OCAgMjIxODU2MiAgIDk2OTE1NTMKKyAgICAgICAgICAgICAgICAgIDkyODU0NTQgICAgNTI0NTc2ICAgNTI0NjI2ICAzMDIyNTg0ICAgMTA0ODU3NAorICAgICAgICAgICAgICAgICAgICAxLjc1JSAgMTY4NS45NSUgICAtMC4wMyUgIC0yNi42MCUgICA4MjQuMjYlCisKKzEwNDg1NzYgMTk0NTg3NTYgMTk5NTA1NDEgIDIwMzA3OTU1ICAxMDQ4NzY2ICA0NDMwNjE2ICAyMDQzMzM3MQorICAgICAgICAgICAgICAgICAxOTYyMTEwMCAgIDEwNDg4NTQgIDEwNDg5MzMgIDYwNDU0MTggICAyMDk3MTUwCisgICAgICAgICAgICAgICAgICAgIDEuNjglICAxODM2LjIwJSAgIC0wLjAyJSAgLTI2LjcxJSAgIDg3NC4zNCUKKworICBEaXNjdXNzaW9uIG9mIGNhc2VzOgorCisgICpzb3J0OiAgVGhlcmUncyBubyBzdHJ1Y3R1cmUgaW4gcmFuZG9tIGRhdGEgdG8gZXhwbG9pdCwgc28gdGhlIHRoZW9yZXRpY2FsCisgIGxpbWl0IGlzIGxnKG4hKS4gIEJvdGggbWV0aG9kcyBnZXQgY2xvc2UgdG8gdGhhdCwgYW5kIHRpbXNvcnQgaXMgaHVnZ2luZworICBpdCAoaW5kZWVkLCBpbiBhICptYXJnaW5hbCogc2Vuc2UsIGl0J3MgYSBzcGVjdGFjdWxhciBpbXByb3ZlbWVudCAtLQorICB0aGVyZSdzIG9ubHkgYWJvdXQgMSUgbGVmdCBiZWZvcmUgaGl0dGluZyB0aGUgd2FsbCwgYW5kIHRpbXNvcnQga25vd3MKKyAgZGFybmVkIHdlbGwgaXQncyBkb2luZyBjb21wYXJlcyB0aGF0IHdvbid0IHBheSBvbiByYW5kb20gZGF0YSAtLSBidXQgc28KKyAgZG9lcyB0aGUgc2FtcGxlc29ydCBoeWJyaWQpLiAgRm9yIGNvbnRyYXN0LCBIb2FyZSdzIG9yaWdpbmFsIHJhbmRvbS1waXZvdAorICBxdWlja3NvcnQgZG9lcyBhYm91dCAzOSUgbW9yZSBjb21wYXJlcyB0aGFuIHRoZSBsaW1pdCwgYW5kIHRoZSBtZWRpYW4tb2YtMworICB2YXJpYW50IGFib3V0IDE5JSBtb3JlLgorCisgIDNzb3J0IGFuZCAhc29ydDogIE5vIGNvbnRlc3Q7IHRoZXJlJ3Mgc3RydWN0dXJlIGluIHRoaXMgZGF0YSwgYnV0IG5vdCBvZgorICB0aGUgc3BlY2lmaWMga2luZHMgc2FtcGxlc29ydCBzcGVjaWFsLWNhc2VzLiAgTm90ZSB0aGF0IHN0cnVjdHVyZSBpbiAhc29ydAorICB3YXNuJ3QgcHV0IHRoZXJlIG9uIHB1cnBvc2UgLS0gaXQgd2FzIGNyYWZ0ZWQgYXMgYSB3b3JzdCBjYXNlIGZvciBhCisgIHByZXZpb3VzIHF1aWNrc29ydCBpbXBsZW1lbnRhdGlvbi4gIFRoYXQgdGltc29ydCBuYWlscyBpdCBjYW1lIGFzIGEKKyAgc3VycHJpc2UgdG8gbWUgKGFsdGhvdWdoIGl0J3Mgb2J2aW91cyBpbiByZXRyb3NwZWN0KS4KKworICArc29ydDogIHNhbXBsZXNvcnQgc3BlY2lhbC1jYXNlcyB0aGlzIGRhdGEsIGFuZCBkb2VzIGEgZmV3IGxlc3MgY29tcGFyZXMKKyAgdGhhbiB0aW1zb3J0LiAgSG93ZXZlciwgdGltc29ydCBydW5zIHRoaXMgY2FzZSBzaWduaWZpY2FudGx5IGZhc3RlciBvbiBhbGwKKyAgYm94ZXMgd2UgaGF2ZSB0aW1pbmdzIGZvciwgYmVjYXVzZSB0aW1zb3J0IGlzIGluIHRoZSBidXNpbmVzcyBvZiBtZXJnaW5nCisgIHJ1bnMgZWZmaWNpZW50bHksIHdoaWxlIHNhbXBsZXNvcnQgZG9lcyBtdWNoIG1vcmUgZGF0YSBtb3ZlbWVudCBpbiB0aGlzCisgIChmb3IgaXQpIHNwZWNpYWwgY2FzZS4KKworICB+c29ydDogIHNhbXBsZXNvcnQncyBzcGVjaWFsIGNhc2VzIGZvciBsYXJnZSBtYXNzZXMgb2YgZXF1YWwgZWxlbWVudHMgYXJlCisgIGV4dHJlbWVseSBlZmZlY3RpdmUgb24gfnNvcnQncyBzcGVjaWZpYyBkYXRhIHBhdHRlcm4sIGFuZCB0aW1zb3J0IGp1c3QKKyAgaXNuJ3QgZ29pbmcgdG8gZ2V0IGNsb3NlIHRvIHRoYXQsIGRlc3BpdGUgdGhhdCBpdCdzIGNsZWFybHkgZ2V0dGluZyBhCisgIGdyZWF0IGRlYWwgb2YgYmVuZWZpdCBvdXQgb2YgdGhlIGR1cGxpY2F0ZXMgKHRoZSAjIG9mIGNvbXBhcmVzIGlzIG11Y2ggbGVzcworICB0aGFuIGxnKG4hKSkuICB+c29ydCBoYXMgYSBwZXJmZWN0bHkgdW5pZm9ybSBkaXN0cmlidXRpb24gb2YganVzdCA0CisgIGRpc3RpbmN0IHZhbHVlcywgYW5kIGFzIHRoZSBkaXN0cmlidXRpb24gZ2V0cyBtb3JlIHNrZXdlZCwgc2FtcGxlc29ydCdzCisgIGVxdWFsLWVsZW1lbnQgZ2ltbWlja3MgYmVjb21lIGxlc3MgZWZmZWN0aXZlLCB3aGlsZSB0aW1zb3J0J3MgYWRhcHRpdmUKKyAgc3RyYXRlZ2llcyBmaW5kIG1vcmUgdG8gZXhwbG9pdDsgaW4gYSBkYXRhYmFzZSBzdXBwbGllZCBieSBLZXZpbiBBbHRpcywgYQorICBzb3J0IG9uIGl0cyBoaWdobHkgc2tld2VkICJvbiB3aGljaCBzdG9jayBleGNoYW5nZSBkb2VzIHRoaXMgY29tcGFueSdzCisgIHN0b2NrIHRyYWRlPyIgZmllbGQgcmFuIG92ZXIgdHdpY2UgYXMgZmFzdCB1bmRlciB0aW1zb3J0LgorCisgIEhvd2V2ZXIsIGRlc3BpdGUgdGhhdCB0aW1zb3J0IGRvZXMgbWFueSBtb3JlIGNvbXBhcmlzb25zIG9uIH5zb3J0LCBhbmQKKyAgdGhhdCBvbiBzZXZlcmFsIHBsYXRmb3JtcyB+c29ydCBydW5zIGhpZ2hseSBzaWduaWZpY2FudGx5IHNsb3dlciB1bmRlcgorICB0aW1zb3J0LCBvbiBvdGhlciBwbGF0Zm9ybXMgfnNvcnQgcnVucyBoaWdobHkgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdW5kZXIKKyAgdGltc29ydC4gIE5vIG90aGVyIGtpbmQgb2YgZGF0YSBoYXMgc2hvd24gdGhpcyB3aWxkIHgtcGxhdGZvcm0gYmVoYXZpb3IsCisgIGFuZCB3ZSBkb24ndCBoYXZlIGFuIGV4cGxhbmF0aW9uIGZvciBpdC4gIFRoZSBvbmx5IHRoaW5nIEkgY2FuIHRoaW5rIG9mCisgIHRoYXQgY291bGQgdHJhbnNmb3JtIHdoYXQgInNob3VsZCBiZSIgaGlnaGx5IHNpZ25pZmljYW50IHNsb3dkb3ducyBpbnRvCisgIGhpZ2hseSBzaWduaWZpY2FudCBzcGVlZHVwcyBvbiBzb21lIGJveGVzIGFyZSBjYXRhc3Ryb3BoaWMgY2FjaGUgZWZmZWN0cworICBpbiBzYW1wbGVzb3J0LgorCisgIEJ1dCB0aW1zb3J0ICJzaG91bGQgYmUiIHNsb3dlciB0aGFuIHNhbXBsZXNvcnQgb24gfnNvcnQsIHNvIGl0J3MgaGFyZAorICB0byBjb3VudCB0aGF0IGl0IGlzbid0IG9uIHNvbWUgYm94ZXMgYXMgYSBzdHJpa2UgYWdhaW5zdCBpdCA8d2luaz4uCisKKworQSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aW1zb3J0IGZvbGxvd3MuCisKK1J1bnMKKy0tLS0KK2NvdW50X3J1bigpIHJldHVybnMgdGhlICMgb2YgZWxlbWVudHMgaW4gdGhlIG5leHQgcnVuLiAgQSBydW4gaXMgZWl0aGVyCisiYXNjZW5kaW5nIiwgd2hpY2ggbWVhbnMgbm9uLWRlY3JlYXNpbmc6CisKKyAgICBhMCA8PSBhMSA8PSBhMiA8PSAuLi4KKworb3IgImRlc2NlbmRpbmciLCB3aGljaCBtZWFucyBzdHJpY3RseSBkZWNyZWFzaW5nOgorCisgICAgYTAgPiBhMSA+IGEyID4gLi4uCisKK05vdGUgdGhhdCBhIHJ1biBpcyBhbHdheXMgYXQgbGVhc3QgMiBsb25nLCB1bmxlc3Mgd2Ugc3RhcnQgYXQgdGhlIGFycmF5J3MKK2xhc3QgZWxlbWVudC4KKworVGhlIGRlZmluaXRpb24gb2YgZGVzY2VuZGluZyBpcyBzdHJpY3QsIGJlY2F1c2UgdGhlIG1haW4gcm91dGluZSByZXZlcnNlcworYSBkZXNjZW5kaW5nIHJ1biBpbi1wbGFjZSwgdHJhbnNmb3JtaW5nIGEgZGVzY2VuZGluZyBydW4gaW50byBhbiBhc2NlbmRpbmcKK3J1bi4gIFJldmVyc2FsIGlzIGRvbmUgdmlhIHRoZSBvYnZpb3VzIGZhc3QgInN3YXAgZWxlbWVudHMgc3RhcnRpbmcgYXQgZWFjaAorZW5kLCBhbmQgY29udmVyZ2UgYXQgdGhlIG1pZGRsZSIgbWV0aG9kLCBhbmQgdGhhdCBjYW4gdmlvbGF0ZSBzdGFiaWxpdHkgaWYKK3RoZSBzbGljZSBjb250YWlucyBhbnkgZXF1YWwgZWxlbWVudHMuICBVc2luZyBhIHN0cmljdCBkZWZpbml0aW9uIG9mCitkZXNjZW5kaW5nIGVuc3VyZXMgdGhhdCBhIGRlc2NlbmRpbmcgcnVuIGNvbnRhaW5zIGRpc3RpbmN0IGVsZW1lbnRzLgorCitJZiBhbiBhcnJheSBpcyByYW5kb20sIGl0J3MgdmVyeSB1bmxpa2VseSB3ZSdsbCBzZWUgbG9uZyBydW5zLiAgSWYgYSBuYXR1cmFsCitydW4gY29udGFpbnMgbGVzcyB0aGFuIG1pbnJ1biBlbGVtZW50cyAoc2VlIG5leHQgc2VjdGlvbiksIHRoZSBtYWluIGxvb3AKK2FydGlmaWNpYWxseSBib29zdHMgaXQgdG8gbWlucnVuIGVsZW1lbnRzLCB2aWEgYSBzdGFibGUgYmluYXJ5IGluc2VydGlvbiBzb3J0CithcHBsaWVkIHRvIHRoZSByaWdodCBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgZm9sbG93aW5nIHRoZSBzaG9ydCBuYXR1cmFsCitydW4uICBJbiBhIHJhbmRvbSBhcnJheSwgKmFsbCogcnVucyBhcmUgbGlrZWx5IHRvIGJlIG1pbnJ1biBsb25nIGFzIGEKK3Jlc3VsdC4gIFRoaXMgaGFzIHR3byBwcmltYXJ5IGdvb2QgZWZmZWN0czoKKworMS4gUmFuZG9tIGRhdGEgc3Ryb25nbHkgdGVuZHMgdGhlbiB0b3dhcmQgcGVyZmVjdGx5IGJhbGFuY2VkIChib3RoIHJ1bnMgaGF2ZQorICAgdGhlIHNhbWUgbGVuZ3RoKSBtZXJnZXMsIHdoaWNoIGlzIHRoZSBtb3N0IGVmZmljaWVudCB3YXkgdG8gcHJvY2VlZCB3aGVuCisgICBkYXRhIGlzIHJhbmRvbS4KKworMi4gQmVjYXVzZSBydW5zIGFyZSBuZXZlciB2ZXJ5IHNob3J0LCB0aGUgcmVzdCBvZiB0aGUgY29kZSBkb2Vzbid0IG1ha2UKKyAgIGhlcm9pYyBlZmZvcnRzIHRvIHNoYXZlIGEgZmV3IGN5Y2xlcyBvZmYgcGVyLW1lcmdlIG92ZXJoZWFkcy4gIEZvcgorICAgZXhhbXBsZSwgcmVhc29uYWJsZSB1c2Ugb2YgZnVuY3Rpb24gY2FsbHMgaXMgbWFkZSwgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvCisgICBpbmxpbmUgZXZlcnl0aGluZy4gIFNpbmNlIHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gTi9taW5ydW4gcnVucyB0byBiZWdpbgorICAgd2l0aCwgYSBmZXcgImV4dHJhIiBmdW5jdGlvbiBjYWxscyBwZXIgbWVyZ2UgaXMgYmFyZWx5IG1lYXN1cmFibGUuCisKKworQ29tcHV0aW5nIG1pbnJ1bgorLS0tLS0tLS0tLS0tLS0tLQorSWYgTiA8IDY0LCBtaW5ydW4gaXMgTi4gIElPVywgYmluYXJ5IGluc2VydGlvbiBzb3J0IGlzIHVzZWQgZm9yIHRoZSB3aG9sZQorYXJyYXkgdGhlbjsgaXQncyBoYXJkIHRvIGJlYXQgdGhhdCBnaXZlbiB0aGUgb3ZlcmhlYWRzIG9mIHRyeWluZyBzb21ldGhpbmcKK2ZhbmNpZXIuCisKK1doZW4gTiBpcyBhIHBvd2VyIG9mIDIsIHRlc3Rpbmcgb24gcmFuZG9tIGRhdGEgc2hvd2VkIHRoYXQgbWlucnVuIHZhbHVlcyBvZgorMTYsIDMyLCA2NCBhbmQgMTI4IHdvcmtlZCBhYm91dCBlcXVhbGx5IHdlbGwuICBBdCAyNTYgdGhlIGRhdGEtbW92ZW1lbnQgY29zdAoraW4gYmluYXJ5IGluc2VydGlvbiBzb3J0IGNsZWFybHkgaHVydCwgYW5kIGF0IDggdGhlIGluY3JlYXNlIGluIHRoZSBudW1iZXIKK29mIGZ1bmN0aW9uIGNhbGxzIGNsZWFybHkgaHVydC4gIFBpY2tpbmcgKnNvbWUqIHBvd2VyIG9mIDIgaXMgaW1wb3J0YW50CitoZXJlLCBzbyB0aGF0IHRoZSBtZXJnZXMgZW5kIHVwIHBlcmZlY3RseSBiYWxhbmNlZCAoc2VlIG5leHQgc2VjdGlvbikuICBXZQorcGljayAzMiBhcyBhIGdvb2QgdmFsdWUgaW4gdGhlIHN3ZWV0IHJhbmdlOyBwaWNraW5nIGEgdmFsdWUgYXQgdGhlIGxvdyBlbmQKK2FsbG93cyB0aGUgYWRhcHRpdmUgZ2ltbWlja3MgbW9yZSBvcHBvcnR1bml0eSB0byBleHBsb2l0IHNob3J0ZXIgbmF0dXJhbAorcnVucy4KKworQmVjYXVzZSBzb3J0cGVyZi5weSBvbmx5IHRyaWVzIHBvd2VycyBvZiAyLCBpdCB0b29rIGEgbG9uZyB0aW1lIHRvIG5vdGljZQordGhhdCAzMiBpc24ndCBhIGdvb2QgY2hvaWNlIGZvciB0aGUgZ2VuZXJhbCBjYXNlISAgQ29uc2lkZXIgTj0yMTEyOgorCis+Pj4gZGl2bW9kKDIxMTIsIDMyKQorKDY2LCAwKQorPj4+CisKK0lmIHRoZSBkYXRhIGlzIHJhbmRvbWx5IG9yZGVyZWQsIHdlJ3JlIHZlcnkgbGlrZWx5IHRvIGVuZCB1cCB3aXRoIDY2IHJ1bnMKK2VhY2ggb2YgbGVuZ3RoIDMyLiAgVGhlIGZpcnN0IDY0IG9mIHRoZXNlIHRyaWdnZXIgYSBzZXF1ZW5jZSBvZiBwZXJmZWN0bHkKK2JhbGFuY2VkIG1lcmdlcyAoc2VlIG5leHQgc2VjdGlvbiksIGxlYXZpbmcgcnVucyBvZiBsZW5ndGhzIDIwNDggYW5kIDY0IHRvCittZXJnZSBhdCB0aGUgZW5kLiAgVGhlIGFkYXB0aXZlIGdpbW1pY2tzIGNhbiBkbyB0aGF0IHdpdGggZmV3ZXIgdGhhbiAyMDQ4KzY0Citjb21wYXJlcywgYnV0IGl0J3Mgc3RpbGwgbW9yZSBjb21wYXJlcyB0aGFuIG5lY2Vzc2FyeSwgYW5kLS0gbWVyZ2Vzb3J0J3MKK2J1Z2Fib28gcmVsYXRpdmUgdG8gc2FtcGxlc29ydCAtLWEgbG90IG1vcmUgZGF0YSBtb3ZlbWVudCAoTyhOKSBjb3BpZXMganVzdAordG8gZ2V0IDY0IGVsZW1lbnRzIGludG8gcGxhY2UpLgorCitJZiB3ZSB0YWtlIG1pbnJ1bj0zMyBpbiB0aGlzIGNhc2UsIHRoZW4gd2UncmUgdmVyeSBsaWtlbHkgdG8gZW5kIHVwIHdpdGggNjQKK3J1bnMgZWFjaCBvZiBsZW5ndGggMzMsIGFuZCB0aGVuIGFsbCBtZXJnZXMgYXJlIHBlcmZlY3RseSBiYWxhbmNlZC4gIEJldHRlciEKKworV2hhdCB3ZSB3YW50IHRvIGF2b2lkIGlzIHBpY2tpbmcgbWlucnVuIHN1Y2ggdGhhdCBpbgorCisgICAgcSwgciA9IGRpdm1vZChOLCBtaW5ydW4pCisKK3EgaXMgYSBwb3dlciBvZiAyIGFuZCByPjAgKHRoZW4gdGhlIGxhc3QgbWVyZ2Ugb25seSBnZXRzIHIgZWxlbWVudHMgaW50bworcGxhY2UsIGFuZCByPG1pbnJ1biBpcyBzbWFsbCBjb21wYXJlZCB0byBOKSwgb3Igcj0wIGFuZCBxIGEgbGl0dGxlIGxhcmdlcgordGhhbiBhIHBvd2VyIG9mIDIgKHRoZW4gd2UndmUgZ290IGEgY2FzZSBzaW1pbGFyIHRvICIyMTEyIiwgYWdhaW4gbGVhdmluZwordG9vIGxpdHRsZSB3b3JrIGZvciB0aGUgbGFzdCBtZXJnZSB0byBkbykuCisKK0luc3RlYWQgd2UgcGljayBhIG1pbnJ1biBpbiByYW5nZSgzMiwgNjUpIHN1Y2ggdGhhdCBOL21pbnJ1biBpcyBleGFjdGx5IGEKK3Bvd2VyIG9mIDIsIG9yIGlmIHRoYXQgaXNuJ3QgcG9zc2libGUsIGlzIGNsb3NlIHRvLCBidXQgc3RyaWN0bHkgbGVzcyB0aGFuLAorYSBwb3dlciBvZiAyLiAgVGhpcyBpcyBlYXNpZXIgdG8gZG8gdGhhbiBpdCBtYXkgc291bmQ6ICB0YWtlIHRoZSBmaXJzdCA2CitiaXRzIG9mIE4sIGFuZCBhZGQgMSBpZiBhbnkgb2YgdGhlIHJlbWFpbmluZyBiaXRzIGFyZSBzZXQuICBJbiBmYWN0LCB0aGF0CitydWxlIGNvdmVycyBldmVyeSBjYXNlIGluIHRoaXMgc2VjdGlvbiwgaW5jbHVkaW5nIHNtYWxsIE4gYW5kIGV4YWN0IHBvd2Vycworb2YgMjsgbWVyZ2VfY29tcHV0ZV9taW5ydW4oKSBpcyBhIGRlY2VwdGl2ZWx5IHNpbXBsZSBmdW5jdGlvbi4KKworCitUaGUgTWVyZ2UgUGF0dGVybgorLS0tLS0tLS0tLS0tLS0tLS0KK0luIG9yZGVyIHRvIGV4cGxvaXQgcmVndWxhcml0aWVzIGluIHRoZSBkYXRhLCB3ZSdyZSBtZXJnaW5nIG9uIG5hdHVyYWwKK3J1biBsZW5ndGhzLCBhbmQgdGhleSBjYW4gYmVjb21lIHdpbGRseSB1bmJhbGFuY2VkLiAgVGhhdCdzIGEgR29vZCBUaGluZworZm9yIHRoaXMgc29ydCEgIEl0IG1lYW5zIHdlIGhhdmUgdG8gZmluZCBhIHdheSB0byBtYW5hZ2UgYW4gYXNzb3J0bWVudCBvZgorcG90ZW50aWFsbHkgdmVyeSBkaWZmZXJlbnQgcnVuIGxlbmd0aHMsIHRob3VnaC4KKworU3RhYmlsaXR5IGNvbnN0cmFpbnMgcGVybWlzc2libGUgbWVyZ2luZyBwYXR0ZXJucy4gIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlCiszIGNvbnNlY3V0aXZlIHJ1bnMgb2YgbGVuZ3RocworCisgICAgQToxMDAwMCAgQjoyMDAwMCAgQzoxMDAwMAorCit3ZSBkYXJlIG5vdCBtZXJnZSBBIHdpdGggQyBmaXJzdCwgYmVjYXVzZSBpZiBBLCBCIGFuZCBDIGhhcHBlbiB0byBjb250YWluCithIGNvbW1vbiBlbGVtZW50LCBpdCB3b3VsZCBnZXQgb3V0IG9mIG9yZGVyIHdydCBpdHMgb2NjdXJlbmNlKHMpIGluIEIuICBUaGUKK21lcmdpbmcgbXVzdCBiZSBkb25lIGFzIChBK0IpK0Mgb3IgQSsoQitDKSBpbnN0ZWFkLgorCitTbyBtZXJnaW5nIGlzIGFsd2F5cyBkb25lIG9uIHR3byBjb25zZWN1dGl2ZSBydW5zIGF0IGEgdGltZSwgYW5kIGluLXBsYWNlLAorYWx0aG91Z2ggdGhpcyBtYXkgcmVxdWlyZSBzb21lIHRlbXAgbWVtb3J5IChtb3JlIG9uIHRoYXQgbGF0ZXIpLgorCitXaGVuIGEgcnVuIGlzIGlkZW50aWZpZWQsIGl0cyBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCBhcmUgcHVzaGVkIG9uIGEgc3RhY2sKK2luIHRoZSBNZXJnZVN0YXRlIHN0cnVjdC4gIG1lcmdlX2NvbGxhcHNlKCkgaXMgdGhlbiBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgaXQKK3Nob3VsZCBtZXJnZSBpdCB3aXRoIHByZWNlZGluZyBydW4ocykuICBXZSB3b3VsZCBsaWtlIHRvIGRlbGF5IG1lcmdpbmcgYXMKK2xvbmcgYXMgcG9zc2libGUgaW4gb3JkZXIgdG8gZXhwbG9pdCBwYXR0ZXJucyB0aGF0IG1heSBjb21lIHVwIGxhdGVyLCBidXQgd2UKK2xpa2UgZXZlbiBtb3JlIHRvIGRvIG1lcmdpbmcgYXMgc29vbiBhcyBwb3NzaWJsZSB0byBleHBsb2l0IHRoYXQgdGhlIHJ1biBqdXN0Citmb3VuZCBpcyBzdGlsbCBoaWdoIGluIHRoZSBtZW1vcnkgaGllcmFyY2h5LiAgV2UgYWxzbyBjYW4ndCBkZWxheSBtZXJnaW5nCisidG9vIGxvbmciIGJlY2F1c2UgaXQgY29uc3VtZXMgbWVtb3J5IHRvIHJlbWVtYmVyIHRoZSBydW5zIHRoYXQgYXJlIHN0aWxsCit1bm1lcmdlZCwgYW5kIHRoZSBzdGFjayBoYXMgYSBmaXhlZCBzaXplLgorCitXaGF0IHR1cm5lZCBvdXQgdG8gYmUgYSBnb29kIGNvbXByb21pc2UgbWFpbnRhaW5zIHR3byBpbnZhcmlhbnRzIG9uIHRoZQorc3RhY2sgZW50cmllcywgd2hlcmUgQSwgQiBhbmQgQyBhcmUgdGhlIGxlbmd0aHMgb2YgdGhlIHRocmVlIHJpZ2htb3N0IG5vdC15ZXQKK21lcmdlZCBzbGljZXM6CisKKzEuICBBID4gQitDCisyLiAgQiA+IEMKKworTm90ZSB0aGF0LCBieSBpbmR1Y3Rpb24sICMyIGltcGxpZXMgdGhlIGxlbmd0aHMgb2YgcGVuZGluZyBydW5zIGZvcm0gYQorZGVjcmVhc2luZyBzZXF1ZW5jZS4gICMxIGltcGxpZXMgdGhhdCwgcmVhZGluZyB0aGUgbGVuZ3RocyByaWdodCB0byBsZWZ0LAordGhlIHBlbmRpbmctcnVuIGxlbmd0aHMgZ3JvdyBhdCBsZWFzdCBhcyBmYXN0IGFzIHRoZSBGaWJvbmFjY2kgbnVtYmVycy4KK1RoZXJlZm9yZSB0aGUgc3RhY2sgY2FuIG5ldmVyIGdyb3cgbGFyZ2VyIHRoYW4gYWJvdXQgbG9nX2Jhc2VfcGhpKE4pIGVudHJpZXMsCit3aGVyZSBwaGkgPSAoMStzcXJ0KDUpKS8yIH49IDEuNjE4LiAgVGh1cyBhIHNtYWxsICMgb2Ygc3RhY2sgc2xvdHMgc3VmZmljZQorZm9yIHZlcnkgbGFyZ2UgYXJyYXlzLgorCitJZiBBIDw9IEIrQywgdGhlIHNtYWxsZXIgb2YgQSBhbmQgQyBpcyBtZXJnZWQgd2l0aCBCICh0aWVzIGZhdm9yIEMsIGZvciB0aGUKK2ZyZXNobmVzcy1pbi1jYWNoZSByZWFzb24pLCBhbmQgdGhlIG5ldyBydW4gcmVwbGFjZXMgdGhlIEEsQiBvciBCLEMgZW50cmllczsKK2UuZy4sIGlmIHRoZSBsYXN0IDMgZW50cmllcyBhcmUKKworICAgIEE6MzAgIEI6MjAgIEM6MTAKKwordGhlbiBCIGlzIG1lcmdlZCB3aXRoIEMsIGxlYXZpbmcKKworICAgIEE6MzAgIEJDOjMwCisKK29uIHRoZSBzdGFjay4gIE9yIGlmIHRoZXkgd2VyZQorCisgICAgQTo1MDAgIEI6NDAwOiAgQzoxMDAwCisKK3RoZW4gQSBpcyBtZXJnZWQgd2l0aCBCLCBsZWF2aW5nCisKKyAgICBBQjo5MDAgIEM6MTAwMAorCitvbiB0aGUgc3RhY2suCisKK0luIGJvdGggZXhhbXBsZXMsIHRoZSBzdGFjayBjb25maWd1cmF0aW9uIGFmdGVyIHRoZSBtZXJnZSBzdGlsbCB2aW9sYXRlcworaW52YXJpYW50ICMyLCBhbmQgbWVyZ2VfY29sbGFwc2UoKSBnb2VzIG9uIHRvIGNvbnRpbnVlIG1lcmdpbmcgcnVucyB1bnRpbAorYm90aCBpbnZhcmlhbnRzIGFyZSBzYXRpc2ZpZWQuICBBcyBhbiBleHRyZW1lIGNhc2UsIHN1cHBvc2Ugd2UgZGlkbid0IGRvIHRoZQorbWlucnVuIGdpbW1pY2ssIGFuZCBuYXR1cmFsIHJ1bnMgd2VyZSBvZiBsZW5ndGhzIDEyOCwgNjQsIDMyLCAxNiwgOCwgNCwgMiwKK2FuZCAyLiAgTm90aGluZyB3b3VsZCBnZXQgbWVyZ2VkIHVudGlsIHRoZSBmaW5hbCAyIHdhcyBzZWVuLCBhbmQgdGhhdCB3b3VsZAordHJpZ2dlciA3IHBlcmZlY3RseSBiYWxhbmNlZCBtZXJnZXMuCisKK1RoZSB0aHJ1c3Qgb2YgdGhlc2UgcnVsZXMgd2hlbiB0aGV5IHRyaWdnZXIgbWVyZ2luZyBpcyB0byBiYWxhbmNlIHRoZSBydW4KK2xlbmd0aHMgYXMgY2xvc2VseSBhcyBwb3NzaWJsZSwgd2hpbGUga2VlcGluZyBhIGxvdyBib3VuZCBvbiB0aGUgbnVtYmVyIG9mCitydW5zIHdlIGhhdmUgdG8gcmVtZW1iZXIuICBUaGlzIGlzIG1heGltYWxseSBlZmZlY3RpdmUgZm9yIHJhbmRvbSBkYXRhLAord2hlcmUgYWxsIHJ1bnMgYXJlIGxpa2VseSB0byBiZSBvZiAoYXJ0aWZpY2lhbGx5IGZvcmNlZCkgbGVuZ3RoIG1pbnJ1biwgYW5kCit0aGVuIHdlIGdldCBhIHNlcXVlbmNlIG9mIHBlcmZlY3RseSBiYWxhbmNlZCBtZXJnZXMgKHdpdGgsIHBlcmhhcHMsIHNvbWUKK29kZGJhbGxzIGF0IHRoZSBlbmQpLgorCitPVE9ILCBvbmUgcmVhc29uIHRoaXMgc29ydCBpcyBzbyBnb29kIGZvciBwYXJ0bHkgb3JkZXJlZCBkYXRhIGhhcyB0byBkbword2l0aCB3aWxkbHkgdW5iYWxhbmNlZCBydW4gbGVuZ3Rocy4KKworCitNZXJnZSBNZW1vcnkKKy0tLS0tLS0tLS0tLQorTWVyZ2luZyBhZGphY2VudCBydW5zIG9mIGxlbmd0aHMgQSBhbmQgQiBpbi1wbGFjZSBpcyB2ZXJ5IGRpZmZpY3VsdC4KK1RoZW9yZXRpY2FsIGNvbnN0cnVjdGlvbnMgYXJlIGtub3duIHRoYXQgY2FuIGRvIGl0LCBidXQgdGhleSdyZSB0b28gZGlmZmljdWx0CithbmQgc2xvdyBmb3IgcHJhY3RpY2FsIHVzZS4gIEJ1dCBpZiB3ZSBoYXZlIHRlbXAgbWVtb3J5IGVxdWFsIHRvIG1pbihBLCBCKSwKK2l0J3MgZWFzeS4KKworSWYgQSBpcyBzbWFsbGVyIChmdW5jdGlvbiBtZXJnZV9sbyksIGNvcHkgQSB0byBhIHRlbXAgYXJyYXksIGxlYXZlIEIgYWxvbmUsCithbmQgdGhlbiB3ZSBjYW4gZG8gdGhlIG9idmlvdXMgbWVyZ2UgYWxnb3JpdGhtIGxlZnQgdG8gcmlnaHQsIGZyb20gdGhlIHRlbXAKK2FyZWEgYW5kIEIsIHN0YXJ0aW5nIHRoZSBzdG9yZXMgaW50byB3aGVyZSBBIHVzZWQgdG8gbGl2ZS4gIFRoZXJlJ3MgYWx3YXlzIGEKK2ZyZWUgYXJlYSBpbiB0aGUgb3JpZ2luYWwgYXJlYSBjb21wcmlzaW5nIGEgbnVtYmVyIG9mIGVsZW1lbnRzIGVxdWFsIHRvIHRoZQorbnVtYmVyIG5vdCB5ZXQgbWVyZ2VkIGZyb20gdGhlIHRlbXAgYXJyYXkgKHRyaXZpYWxseSB0cnVlIGF0IHRoZSBzdGFydDsKK3Byb2NlZWQgYnkgaW5kdWN0aW9uKS4gIFRoZSBvbmx5IHRyaWNreSBiaXQgaXMgdGhhdCBpZiBhIGNvbXBhcmlzb24gcmFpc2VzIGFuCitleGNlcHRpb24sIHdlIGhhdmUgdG8gcmVtZW1iZXIgdG8gY29weSB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGJhY2sgaW4gZnJvbQordGhlIHRlbXAgYXJlYSwgbGVzdCB0aGUgYXJyYXkgZW5kIHVwIHdpdGggZHVwbGljYXRlIGVudHJpZXMgZnJvbSBCLiAgQnV0Cit0aGF0J3MgZXhhY3RseSB0aGUgc2FtZSB0aGluZyB3ZSBuZWVkIHRvIGRvIGlmIHdlIHJlYWNoIHRoZSBlbmQgb2YgQiBmaXJzdCwKK3NvIHRoZSBleGl0IGNvZGUgaXMgcGxlYXNhbnRseSBjb21tb24gdG8gYm90aCB0aGUgbm9ybWFsIGFuZCBlcnJvciBjYXNlcy4KKworSWYgQiBpcyBzbWFsbGVyIChmdW5jdGlvbiBtZXJnZV9oaSwgd2hpY2ggaXMgbWVyZ2VfbG8ncyAibWlycm9yIGltYWdlIiksCittdWNoIHRoZSBzYW1lLCBleGNlcHQgdGhhdCB3ZSBuZWVkIHRvIG1lcmdlIHJpZ2h0IHRvIGxlZnQsIGNvcHlpbmcgQiBpbnRvIGEKK3RlbXAgYXJyYXkgYW5kIHN0YXJ0aW5nIHRoZSBzdG9yZXMgYXQgdGhlIHJpZ2h0IGVuZCBvZiB3aGVyZSBCIHVzZWQgdG8gbGl2ZS4KKworQSByZWZpbmVtZW50OiAgV2hlbiB3ZSdyZSBhYm91dCB0byBtZXJnZSBhZGphY2VudCBydW5zIEEgYW5kIEIsIHdlIGZpcnN0IGRvCithIGZvcm0gb2YgYmluYXJ5IHNlYXJjaCAobW9yZSBvbiB0aGF0IGxhdGVyKSB0byBzZWUgd2hlcmUgQlswXSBzaG91bGQgZW5kIHVwCitpbiBBLiAgRWxlbWVudHMgaW4gQSBwcmVjZWRpbmcgdGhhdCBwb2ludCBhcmUgYWxyZWFkeSBpbiB0aGVpciBmaW5hbAorcG9zaXRpb25zLCBlZmZlY3RpdmVseSBzaHJpbmtpbmcgdGhlIHNpemUgb2YgQS4gIExpa2V3aXNlIHdlIGFsc28gc2VhcmNoIHRvCitzZWUgd2hlcmUgQVstMV0gc2hvdWxkIGVuZCB1cCBpbiBCLCBhbmQgZWxlbWVudHMgb2YgQiBhZnRlciB0aGF0IHBvaW50IGNhbgorYWxzbyBiZSBpZ25vcmVkLiAgVGhpcyBjdXRzIHRoZSBhbW91bnQgb2YgdGVtcCBtZW1vcnkgbmVlZGVkIGJ5IHRoZSBzYW1lCithbW91bnQuCisKK1RoZXNlIHByZWxpbWluYXJ5IHNlYXJjaGVzIG1heSBub3QgcGF5IG9mZiwgYW5kIGNhbiBiZSBleHBlY3RlZCAqbm90KiB0bworcmVwYXkgdGhlaXIgY29zdCBpZiB0aGUgZGF0YSBpcyByYW5kb20uICBCdXQgdGhleSBjYW4gd2luIGh1Z2UgaW4gYWxsIG9mCit0aW1lLCBjb3B5aW5nLCBhbmQgbWVtb3J5IHNhdmluZ3Mgd2hlbiB0aGV5IGRvIHBheSwgc28gdGhpcyBpcyBvbmUgb2YgdGhlCisicGVyLW1lcmdlIG92ZXJoZWFkcyIgbWVudGlvbmVkIGFib3ZlIHRoYXQgd2UncmUgaGFwcHkgdG8gZW5kdXJlIGJlY2F1c2UKK3RoZXJlIGlzIGF0IG1vc3Qgb25lIHZlcnkgc2hvcnQgcnVuLiAgSXQncyBnZW5lcmFsbHkgdHJ1ZSBpbiB0aGlzIGFsZ29yaXRobQordGhhdCB3ZSdyZSB3aWxsaW5nIHRvIGdhbWJsZSBhIGxpdHRsZSB0byB3aW4gYSBsb3QsIGV2ZW4gdGhvdWdoIHRoZSBuZXQKK2V4cGVjdGF0aW9uIGlzIG5lZ2F0aXZlIGZvciByYW5kb20gZGF0YS4KKworCitNZXJnZSBBbGdvcml0aG1zCistLS0tLS0tLS0tLS0tLS0tCittZXJnZV9sbygpIGFuZCBtZXJnZV9oaSgpIGFyZSB3aGVyZSB0aGUgYnVsayBvZiB0aGUgdGltZSBpcyBzcGVudC4gIG1lcmdlX2xvCitkZWFscyB3aXRoIHJ1bnMgd2hlcmUgQSA8PSBCLCBhbmQgbWVyZ2VfaGkgd2hlcmUgQSA+IEIuICBUaGV5IGRvbid0IGtub3cKK3doZXRoZXIgdGhlIGRhdGEgaXMgY2x1c3RlcmVkIG9yIHVuaWZvcm0sIGJ1dCBhIGxvdmVseSB0aGluZyBhYm91dCBtZXJnaW5nCitpcyB0aGF0IG1hbnkga2luZHMgb2YgY2x1c3RlcmluZyAicmV2ZWFsIHRoZW1zZWx2ZXMiIGJ5IGhvdyBtYW55IHRpbWVzIGluIGEKK3JvdyB0aGUgd2lubmluZyBtZXJnZSBlbGVtZW50IGNvbWVzIGZyb20gdGhlIHNhbWUgcnVuLiAgV2UnbGwgb25seSBkaXNjdXNzCittZXJnZV9sbyBoZXJlOyBtZXJnZV9oaSBpcyBleGFjdGx5IGFuYWxvZ291cy4KKworTWVyZ2luZyBiZWdpbnMgaW4gdGhlIHVzdWFsLCBvYnZpb3VzIHdheSwgY29tcGFyaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIEEKK3RvIHRoZSBmaXJzdCBvZiBCLCBhbmQgbW92aW5nIEJbMF0gdG8gdGhlIG1lcmdlIGFyZWEgaWYgaXQncyBsZXNzIHRoYW4gQVswXSwKK2Vsc2UgbW92aW5nIEFbMF0gdG8gdGhlIG1lcmdlIGFyZWEuICBDYWxsIHRoYXQgdGhlICJvbmUgcGFpciBhdCBhIHRpbWUiCittb2RlLiAgVGhlIG9ubHkgdHdpc3QgaGVyZSBpcyBrZWVwaW5nIHRyYWNrIG9mIGhvdyBtYW55IHRpbWVzIGluIGEgcm93ICJ0aGUKK3dpbm5lciIgY29tZXMgZnJvbSB0aGUgc2FtZSBydW4uCisKK0lmIHRoYXQgY291bnQgcmVhY2hlcyBNSU5fR0FMTE9QLCB3ZSBzd2l0Y2ggdG8gImdhbGxvcGluZyBtb2RlIi4gIEhlcmUKK3dlICpzZWFyY2gqIEIgZm9yIHdoZXJlIEFbMF0gYmVsb25ncywgYW5kIG1vdmUgb3ZlciBhbGwgdGhlIEIncyBiZWZvcmUKK3RoYXQgcG9pbnQgaW4gb25lIGNodW5rIHRvIHRoZSBtZXJnZSBhcmVhLCB0aGVuIG1vdmUgQVswXSB0byB0aGUgbWVyZ2UKK2FyZWEuICBUaGVuIHdlIHNlYXJjaCBBIGZvciB3aGVyZSBCWzBdIGJlbG9uZ3MsIGFuZCBzaW1pbGFybHkgbW92ZSBhCitzbGljZSBvZiBBIGluIG9uZSBjaHVuay4gIFRoZW4gYmFjayB0byBzZWFyY2hpbmcgQiBmb3Igd2hlcmUgQVswXSBiZWxvbmdzLAorZXRjLiAgV2Ugc3RheSBpbiBnYWxsb3BpbmcgbW9kZSB1bnRpbCBib3RoIHNlYXJjaGVzIGZpbmQgc2xpY2VzIHRvIGNvcHkKK2xlc3MgdGhhbiBNSU5fR0FMTE9QIGVsZW1lbnRzIGxvbmcsIGF0IHdoaWNoIHBvaW50IHdlIGdvIGJhY2sgdG8gb25lLXBhaXItCithdC1hLXRpbWUgbW9kZS4KKworCitHYWxsb3BpbmcKKy0tLS0tLS0tLQorU3RpbGwgd2l0aG91dCBsb3NzIG9mIGdlbmVyYWxpdHksIGFzc3VtZSBBIGlzIHRoZSBzaG9ydGVyIHJ1bi4gIEluIGdhbGxvcGluZworbW9kZSwgd2UgZmlyc3QgbG9vayBmb3IgQVswXSBpbiBCLiAgV2UgZG8gdGhpcyB2aWEgImdhbGxvcGluZyIsIGNvbXBhcmluZworQVswXSBpbiB0dXJuIHRvIEJbMF0sIEJbMV0sIEJbM10sIEJbN10sIC4uLiwgQlsyKipqIC0gMV0sIC4uLiwgdW50aWwgZmluZGluZwordGhlIGsgc3VjaCB0aGF0IEJbMioqKGstMSkgLSAxXSA8IEFbMF0gPD0gQlsyKiprIC0gMV0uICBUaGlzIHRha2VzIGF0IG1vc3QKK3JvdWdobHkgbGcoQikgY29tcGFyaXNvbnMsIGFuZCwgdW5saWtlIGEgc3RyYWlnaHQgYmluYXJ5IHNlYXJjaCwgZmF2b3JzCitmaW5kaW5nIHRoZSByaWdodCBzcG90IGVhcmx5IGluIEIgKG1vcmUgb24gdGhhdCBsYXRlcikuCisKK0FmdGVyIGZpbmRpbmcgc3VjaCBhIGssIHRoZSByZWdpb24gb2YgdW5jZXJ0YWludHkgaXMgcmVkdWNlZCB0byAyKiooay0xKSAtIDEKK2NvbnNlY3V0aXZlIGVsZW1lbnRzLCBhbmQgYSBzdHJhaWdodCBiaW5hcnkgc2VhcmNoIHJlcXVpcmVzIGV4YWN0bHkgay0xCithZGRpdGlvbmFsIGNvbXBhcmlzb25zIHRvIG5haWwgaXQuICBUaGVuIHdlIGNvcHkgYWxsIHRoZSBCJ3MgdXAgdG8gdGhhdAorcG9pbnQgaW4gb25lIGNodW5rLCBhbmQgdGhlbiBjb3B5IEFbMF0uICBOb3RlIHRoYXQgbm8gbWF0dGVyIHdoZXJlIEFbMF0KK2JlbG9uZ3MgaW4gQiwgdGhlIGNvbWJpbmF0aW9uIG9mIGdhbGxvcGluZyArIGJpbmFyeSBzZWFyY2ggZmluZHMgaXQgaW4gbm8KK21vcmUgdGhhbiBhYm91dCAyKmxnKEIpIGNvbXBhcmlzb25zLgorCitJZiB3ZSBkaWQgYSBzdHJhaWdodCBiaW5hcnkgc2VhcmNoLCB3ZSBjb3VsZCBmaW5kIGl0IGluIG5vIG1vcmUgdGhhbgorY2VpbGluZyhsZyhCKzEpKSBjb21wYXJpc29ucyAtLSBidXQgc3RyYWlnaHQgYmluYXJ5IHNlYXJjaCB0YWtlcyB0aGF0IG1hbnkKK2NvbXBhcmlzb25zIG5vIG1hdHRlciB3aGVyZSBBWzBdIGJlbG9uZ3MuICBTdHJhaWdodCBiaW5hcnkgc2VhcmNoIHRodXMgbG9zZXMKK3RvIGdhbGxvcGluZyB1bmxlc3MgdGhlIHJ1biBpcyBxdWl0ZSBsb25nLCBhbmQgd2Ugc2ltcGx5IGNhbid0IGd1ZXNzCit3aGV0aGVyIGl0IGlzIGluIGFkdmFuY2UuCisKK0lmIGRhdGEgaXMgcmFuZG9tIGFuZCBydW5zIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLCBBWzBdIGJlbG9uZ3MgYXQgQlswXSBoYWxmCit0aGUgdGltZSwgYXQgQlsxXSBhIHF1YXJ0ZXIgb2YgdGhlIHRpbWUsIGFuZCBzbyBvbjogIGEgY29uc2VjdXRpdmUgd2lubmluZworc3ViLXJ1biBpbiBCIG9mIGxlbmd0aCBrIG9jY3VycyB3aXRoIHByb2JhYmlsaXR5IDEvMioqKGsrMSkuICBTbyBsb25nCit3aW5uaW5nIHN1Yi1ydW5zIGFyZSBleHRyZW1lbHkgdW5saWtlbHkgaW4gcmFuZG9tIGRhdGEsIGFuZCBndWVzc2luZyB0aGF0IGEKK3dpbm5pbmcgc3ViLXJ1biBpcyBnb2luZyB0byBiZSBsb25nIGlzIGEgZGFuZ2Vyb3VzIGdhbWUuCisKK09UT0gsIGlmIGRhdGEgaXMgbG9wc2lkZWQgb3IgbHVtcHkgb3IgY29udGFpbnMgbWFueSBkdXBsaWNhdGVzLCBsb25nCitzdHJldGNoZXMgb2Ygd2lubmluZyBzdWItcnVucyBhcmUgdmVyeSBsaWtlbHksIGFuZCBjdXR0aW5nIHRoZSBudW1iZXIgb2YKK2NvbXBhcmlzb25zIG5lZWRlZCB0byBmaW5kIG9uZSBmcm9tIE8oQikgdG8gTyhsb2cgQikgaXMgYSBodWdlIHdpbi4KKworR2FsbG9waW5nIGNvbXByb21pc2VzIGJ5IGdldHRpbmcgb3V0IGZhc3QgaWYgdGhlcmUgaXNuJ3QgYSBsb25nIHdpbm5pbmcKK3N1Yi1ydW4sIHlldCBmaW5kaW5nIHN1Y2ggdmVyeSBlZmZpY2llbnRseSB3aGVuIHRoZXkgZXhpc3QuCisKK0kgZmlyc3QgbGVhcm5lZCBhYm91dCB0aGUgZ2FsbG9waW5nIHN0cmF0ZWd5IGluIGEgcmVsYXRlZCBjb250ZXh0OyBzZWU6CisKKyAgICAiQWRhcHRpdmUgU2V0IEludGVyc2VjdGlvbnMsIFVuaW9ucywgYW5kIERpZmZlcmVuY2VzIiAoMjAwMCkKKyAgICBFcmlrIEQuIERlbWFpbmUsIEFsZWphbmRybyBM83Blei1PcnRpeiwgSi4gSWFuIE11bnJvCisKK2FuZCBpdHMgZm9sbG93dXAocykuICBBbiBlYXJsaWVyIHBhcGVyIGNhbGxlZCB0aGUgc2FtZSBzdHJhdGVneQorImV4cG9uZW50aWFsIHNlYXJjaCI6CisKKyAgICJPcHRpbWlzdGljIFNvcnRpbmcgYW5kIEluZm9ybWF0aW9uIFRoZW9yZXRpYyBDb21wbGV4aXR5IgorICAgUGV0ZXIgTWNJbHJveQorICAgU09EQSAoRm91cnRoIEFubnVhbCBBQ00tU0lBTSBTeW1wb3NpdW0gb24gRGlzY3JldGUgQWxnb3JpdGhtcyksIHBwCisgICA0NjctNDc0LCBBdXN0aW4sIFRleGFzLCAyNS0yNyBKYW51YXJ5IDE5OTMuCisKK2FuZCBpdCBwcm9iYWJseSBkYXRlcyBiYWNrIHRvIGFuIGVhcmxpZXIgcGFwZXIgYnkgQmVudGxleSBhbmQgWWFvLiAgVGhlCitNY0lsb3J5IHBhcGVyIGluIHBhcnRpY3VsYXIgaGFzIGdvb2QgYW5hbHlzaXMgb2YgYSBtZXJnZXNvcnQgdGhhdCdzCitwcm9iYWJseSBzdHJvbmdseSByZWxhdGVkIHRvIHRoaXMgb25lIGluIGl0cyBnYWxsb3Bpbmcgc3RyYXRlZ3kuCisKKworR2FsbG9waW5nIHdpdGggYSBCcm9rZW4gTGVnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvIHdoeSBkb24ndCB3ZSBhbHdheXMgZ2FsbG9wPyAgQmVjYXVzZSBpdCBjYW4gbG9zZSwgb24gdHdvIGNvdW50czoKKworMS4gV2hpbGUgd2UncmUgd2lsbGluZyB0byBlbmR1cmUgc21hbGwgcGVyLXJ1biBvdmVyaGVhZHMsIHBlci1jb21wYXJpc29uCisgICBvdmVyaGVhZHMgYXJlIGEgZGlmZmVyZW50IHN0b3J5LiAgQ2FsbGluZyBZZXQgQW5vdGhlciBGdW5jdGlvbiBwZXIKKyAgIGNvbXBhcmlzb24gaXMgZXhwZW5zaXZlLCBhbmQgZ2FsbG9wX2xlZnQoKSBhbmQgZ2FsbG9wX3JpZ2h0KCkgYXJlCisgICB0b28gbG9uZy13aW5kZWQgZm9yIHNhbmUgaW5saW5pbmcuCisKKzIuIElnbm9yaW5nIGZ1bmN0aW9uLWNhbGwgb3ZlcmhlYWQsIGdhbGxvcGluZyBjYW4tLSBhbGFzIC0tcmVxdWlyZSBtb3JlCisgICBjb21wYXJpc29ucyB0aGFuIGxpbmVhciBvbmUtYXQtdGltZSBzZWFyY2gsIGRlcGVuZGluZyBvbiB0aGUgZGF0YS4KKworIzIgcmVxdWlyZXMgZGV0YWlscy4gIElmIEFbMF0gYmVsb25ncyBiZWZvcmUgQlswXSwgZ2FsbG9waW5nIHJlcXVpcmVzIDEKK2NvbXBhcmUgdG8gZGV0ZXJtaW5lIHRoYXQsIHNhbWUgYXMgbGluZWFyIHNlYXJjaCwgZXhjZXB0IGl0IGNvc3RzIG1vcmUKK3RvIGNhbGwgdGhlIGdhbGxvcCBmdW5jdGlvbi4gIElmIEFbMF0gYmVsb25ncyByaWdodCBiZWZvcmUgQlsxXSwgZ2FsbG9waW5nCityZXF1aXJlcyAyIGNvbXBhcmVzLCBhZ2FpbiBzYW1lIGFzIGxpbmVhciBzZWFyY2guICBPbiB0aGUgdGhpcmQgY29tcGFyZSwKK2dhbGxvcGluZyBjaGVja3MgQVswXSBhZ2FpbnN0IEJbM10sIGFuZCBpZiBpdCdzIDw9LCByZXF1aXJlcyBvbmUgbW9yZQorY29tcGFyZSB0byBkZXRlcm1pbmUgd2hldGhlciBBWzBdIGJlbG9uZ3MgYXQgQlsyXSBvciBCWzNdLiAgVGhhdCdzIGEgdG90YWwKK29mIDQgY29tcGFyZXMsIGJ1dCBpZiBBWzBdIGRvZXMgYmVsb25nIGF0IEJbMl0sIGxpbmVhciBzZWFyY2ggd291bGQgaGF2ZQorZGlzY292ZXJlZCB0aGF0IGluIG9ubHkgMyBjb21wYXJlcywgYW5kIHRoYXQncyBhIGh1Z2UgbG9zcyEgIFJlYWxseS4gIEl0J3MKK2FuIGluY3JlYXNlIG9mIDMzJSBpbiB0aGUgbnVtYmVyIG9mIGNvbXBhcmVzIG5lZWRlZCwgYW5kIGNvbXBhcmlzb25zIGFyZQorZXhwZW5zaXZlIGluIFB5dGhvbi4KKworaW5kZXggaW4gQiB3aGVyZSAgICAjIGNvbXBhcmVzIGxpbmVhciAgIyBnYWxsb3AgICMgYmluYXJ5ICBnYWxsb3AKK0FbMF0gYmVsb25ncyAgICAgICAgc2VhcmNoIG5lZWRzICAgICAgIGNvbXBhcmVzICBjb21wYXJlcyAgdG90YWwKKy0tLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tCisgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgMSAgICAgICAgIDAgICAgICAgMQorCisgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgMiAgICAgICAgIDAgICAgICAgMgorCisgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgMyAgICAgICAgIDEgICAgICAgNAorICAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgIDMgICAgICAgICAxICAgICAgIDQKKworICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgNSAgICAgICAgIDQgICAgICAgICAyICAgICAgIDYKKyAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICAgICAgIDYgICAgICAgICA0ICAgICAgICAgMiAgICAgICA2CisgICAgICAgICAgICAgICA2ICAgICAgICAgICAgICAgICAgICA3ICAgICAgICAgNCAgICAgICAgIDIgICAgICAgNgorICAgICAgICAgICAgICAgNyAgICAgICAgICAgICAgICAgICAgOCAgICAgICAgIDQgICAgICAgICAyICAgICAgIDYKKworICAgICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgOSAgICAgICAgIDUgICAgICAgICAzICAgICAgIDgKKyAgICAgICAgICAgICAgIDkgICAgICAgICAgICAgICAgICAgMTAgICAgICAgICA1ICAgICAgICAgMyAgICAgICA4CisgICAgICAgICAgICAgIDEwICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgNSAgICAgICAgIDMgICAgICAgOAorICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgICAgICAxMiAgICAgICAgIDUgICAgICAgICAzICAgICAgIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKworSW4gZ2VuZXJhbCwgaWYgQVswXSBiZWxvbmdzIGF0IEJbaV0sIGxpbmVhciBzZWFyY2ggcmVxdWlyZXMgaSsxIGNvbXBhcmlzb25zCit0byBkZXRlcm1pbmUgdGhhdCwgYW5kIGdhbGxvcGluZyBhIHRvdGFsIG9mIDIqZmxvb3IobGcoaSkpKzIgY29tcGFyaXNvbnMuCitUaGUgYWR2YW50YWdlIG9mIGdhbGxvcGluZyBpcyB1bmJvdW5kZWQgYXMgaSBncm93cywgYnV0IGl0IGRvZXNuJ3Qgd2luIGF0CithbGwgdW50aWwgaT02LiAgQmVmb3JlIHRoZW4sIGl0IGxvc2VzIHR3aWNlIChhdCBpPTIgYW5kIGk9NCksIGFuZCB0aWVzCithdCB0aGUgb3RoZXIgdmFsdWVzLiAgQXQgYW5kIGFmdGVyIGk9NiwgZ2FsbG9waW5nIGFsd2F5cyB3aW5zLgorCitXZSBjYW4ndCBndWVzcyBpbiBhZHZhbmNlIHdoZW4gaXQncyBnb2luZyB0byB3aW4sIHRob3VnaCwgc28gd2UgZG8gb25lIHBhaXIKK2F0IGEgdGltZSB1bnRpbCB0aGUgZXZpZGVuY2Ugc2VlbXMgc3Ryb25nIHRoYXQgZ2FsbG9waW5nIG1heSBwYXkuICBNSU5fR0FMTE9QCitpcyA4IGFzIEkgdHlwZSB0aGlzLCBhbmQgdGhhdCdzIHByZXR0eSBzdHJvbmcgZXZpZGVuY2UuICBIb3dldmVyLCBpZiB0aGUgZGF0YQoraXMgcmFuZG9tLCBpdCBzaW1wbHkgd2lsbCB0cmlnZ2VyIGdhbGxvcGluZyBtb2RlIHB1cmVseSBieSBsdWNrIGV2ZXJ5IG5vdworYW5kIGFnYWluLCBhbmQgaXQncyBxdWl0ZSBsaWtlbHkgdG8gaGl0IG9uZSBvZiB0aGUgbG9zaW5nIGNhc2VzIG5leHQuICA4CitmYXZvcnMgcHJvdGVjdGluZyBhZ2FpbnN0IGEgc2xvd2Rvd24gb24gcmFuZG9tIGRhdGEgYXQgdGhlIGV4cGVuc2Ugb2YgZ2l2aW5nCit1cCBzbWFsbCB3aW5zIG9uIGxpZ2h0bHkgY2x1c3RlcmVkIGRhdGEsIGFuZCB0aW55IG1hcmdpbmFsIHdpbnMgb24gaGlnaGx5CitjbHVzdGVyZWQgZGF0YSAodGhleSB3aW4gaHVnZSBhbnl3YXksIGFuZCBpZiB5b3UncmUgZ2V0dGluZyBhIGZhY3RvciBvZgorMTAgc3BlZWR1cCwgYW5vdGhlciBwZXJjZW50IGp1c3QgaXNuJ3Qgd29ydGggZmlnaHRpbmcgZm9yKS4KKworCitHYWxsb3BpbmcgQ29tcGxpY2F0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgZGVzY3JpcHRpb24gYWJvdmUgd2FzIGZvciBtZXJnZV9sby4gIG1lcmdlX2hpIGhhcyB0byBtZXJnZSAiZnJvbSB0aGUKK290aGVyIGVuZCIsIGFuZCByZWFsbHkgbmVlZHMgdG8gZ2FsbG9wIHN0YXJ0aW5nIGF0IHRoZSBsYXN0IGVsZW1lbnQgaW4gYSBydW4KK2luc3RlYWQgb2YgdGhlIGZpcnN0LiAgR2FsbG9waW5nIGZyb20gdGhlIGZpcnN0IHN0aWxsIHdvcmtzLCBidXQgZG9lcyBtb3JlCitjb21wYXJpc29ucyB0aGFuIGl0IHNob3VsZCAodGhpcyBpcyBzaWduaWZpY2FudCAtLSBJIHRpbWVkIGl0IGJvdGggd2F5cykuCitGb3IgdGhpcyByZWFzb24sIHRoZSBnYWxsb3BfbGVmdCgpIGFuZCBnYWxsb3BfcmlnaHQoKSBmdW5jdGlvbnMgaGF2ZSBhCisiaGludCIgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBpbmRleCBhdCB3aGljaCBnYWxsb3Bpbmcgc2hvdWxkIGJlZ2luLiAgU28KK2dhbGxvcGluZyBjYW4gYWN0dWFsbHkgc3RhcnQgYXQgYW55IGluZGV4LCBhbmQgcHJvY2VlZCBhdCBvZmZzZXRzIG9mIDEsIDMsCis3LCAxNSwgLi4uIG9yIC0xLCAtMywgLTcsIC0xNSwgLi4uIGZyb20gdGhlIHN0YXJ0aW5nIGluZGV4LgorCitJbiB0aGUgY29kZSBhcyBJIHR5cGUgaXQncyBhbHdheXMgY2FsbGVkIHdpdGggZWl0aGVyIDAgb3Igbi0xICh3aGVyZSBuIGlzCit0aGUgIyBvZiBlbGVtZW50cyBpbiBhIHJ1bikuICBJdCdzIHRlbXB0aW5nIHRvIHRyeSB0byBkbyBzb21ldGhpbmcgZmFuY2llciwKK21lbGRpbmcgZ2FsbG9waW5nIHdpdGggc29tZSBmb3JtIG9mIGludGVycG9sYXRpb24gc2VhcmNoOyBmb3IgZXhhbXBsZSwgaWYKK3dlJ3JlIG1lcmdpbmcgYSBydW4gb2YgbGVuZ3RoIDEgd2l0aCBhIHJ1biBvZiBsZW5ndGggMTAwMDAsIGluZGV4IDUwMDAgaXMKK3Byb2JhYmx5IGEgYmV0dGVyIGd1ZXNzIGF0IHRoZSBmaW5hbCByZXN1bHQgdGhhbiBlaXRoZXIgMCBvciA5OTk5LiAgQnV0CitpdCdzIHVuY2xlYXIgaG93IHRvIGdlbmVyYWxpemUgdGhhdCBpbnR1aXRpb24gdXNlZnVsbHksIGFuZCBtZXJnaW5nIG9mCit3aWxkbHkgdW5iYWxhbmNlZCBydW5zIGFscmVhZHkgZW5qb3lzIGV4Y2VsbGVudCBwZXJmb3JtYW5jZS4KKworCitDb21wYXJpbmcgQXZlcmFnZSAjIG9mIENvbXBhcmVzIG9uIFJhbmRvbSBBcnJheXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSGVyZSBsaXN0LnNvcnQoKSBpcyBzYW1wbGVzb3J0LCBhbmQgbGlzdC5tc29ydCgpIHRoaXMgc29ydDoKKworIiIiCitpbXBvcnQgcmFuZG9tCitmcm9tIHRpbWUgaW1wb3J0IGNsb2NrIGFzIG5vdworCitkZWYgZmlsbChuKToKKyAgICBmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZG9tCisgICAgcmV0dXJuIFtyYW5kb20oKSBmb3IgaSBpbiB4cmFuZ2UobildCisKK2RlZiBteWNtcCh4LCB5KToKKyAgICBnbG9iYWwgbmNtcAorICAgIG5jbXAgKz0gMQorICAgIHJldHVybiBjbXAoeCwgeSkKKworZGVmIHRpbWVpdCh2YWx1ZXMsIG1ldGhvZCk6CisgICAgZ2xvYmFsIG5jbXAKKyAgICBYID0gdmFsdWVzWzpdCisgICAgYm91bmQgPSBnZXRhdHRyKFgsIG1ldGhvZCkKKyAgICBuY21wID0gMAorICAgIHQxID0gbm93KCkKKyAgICBib3VuZChteWNtcCkKKyAgICB0MiA9IG5vdygpCisgICAgcmV0dXJuIHQyLXQxLCBuY21wCisKK2Zvcm1hdCA9ICIlNXMgICU5LjJmICAlMTFkIgorZjIgICAgID0gIiU1cyAgJTkuMmYgICUxMS4yZiIKKworZGVmIGRyaXZlKCk6CisgICAgY291bnQgPSBzc3QgPSBzc2NtcCA9IG1zdCA9IG1zY21wID0gbmVsdHMgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgbiA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwKQorICAgICAgICBuZWx0cyArPSBuCisgICAgICAgIHggPSBmaWxsKG4pCisKKyAgICAgICAgdCwgYyA9IHRpbWVpdCh4LCAnc29ydCcpCisgICAgICAgIHNzdCArPSB0CisgICAgICAgIHNzY21wICs9IGMKKworICAgICAgICB0LCBjID0gdGltZWl0KHgsICdtc29ydCcpCisgICAgICAgIG1zdCArPSB0CisgICAgICAgIG1zY21wICs9IGMKKworICAgICAgICBjb3VudCArPSAxCisgICAgICAgIGlmIGNvdW50ICUgMTA6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHByaW50ICJjb3VudCIsIGNvdW50LCAibmVsdHMiLCBuZWx0cworICAgICAgICBwcmludCBmb3JtYXQgJSAoInNvcnQiLCAgc3N0LCBzc2NtcCkKKyAgICAgICAgcHJpbnQgZm9ybWF0ICUgKCJtc29ydCIsIG1zdCwgbXNjbXApCisgICAgICAgIHByaW50IGYyICAgICAlICgiIiwgKHNzdC1tc3QpKjFlMi9tc3QsIChzc2NtcC1tc2NtcCkqMWUyL21zY21wKQorCitkcml2ZSgpCisiIiIKKworSSByYW4gdGhpcyBvbiBXaW5kb3dzIGFuZCBrZXB0IHVzaW5nIHRoZSBjb21wdXRlciBsaWdodGx5IHdoaWxlIGl0IHdhcworcnVubmluZy4gIHRpbWUuY2xvY2soKSBpcyB3YWxsLWNsb2NrIHRpbWUgb24gV2luZG93cywgd2l0aCBiZXR0ZXIgdGhhbgorbWljcm9zZWNvbmQgcmVzb2x1dGlvbi4gIHNhbXBsZXNvcnQgc3RhcnRlZCB3aXRoIGEgMS41MiUgIy1vZi1jb21wYXJpc29ucworZGlzYWR2YW50YWdlLCBmZWxsIHF1aWNrbHkgdG8gMS40OCUsIGFuZCB0aGVuIGZsdWN0dWF0ZWQgd2l0aGluIHRoYXQgc21hbGwKK3JhbmdlLiAgSGVyZSdzIHRoZSBsYXN0IGNodW5rIG9mIG91dHB1dCBiZWZvcmUgSSBraWxsZWQgdGhlIGpvYjoKKworY291bnQgMjYzMCBuZWx0cyAxMzA5MDY1NDMKKyBzb3J0ICAgIDYxMTAuODAgICAxOTM3ODg3NTczCittc29ydCAgICA2MDAyLjc4ICAgMTkwOTM4OTM4MQorICAgICAgICAgICAgMS44MCAgICAgICAgIDEuNDkKKworV2UndmUgZG9uZSBuZWFybHkgMiBiaWxsaW9uIGNvbXBhcmlzb25zIGFwaWVjZSBhdCBQeXRob24gc3BlZWQgdGhlcmUsIGFuZAordGhhdCdzIGVub3VnaCA8d2luaz4uCisKK0ZvciByYW5kb20gYXJyYXlzIG9mIHNpemUgMiAoeWVzLCB0aGVyZSBhcmUgb25seSAyIGludGVyZXN0aW5nIG9uZXMpLAorc2FtcGxlc29ydCBoYXMgYSA1MCUoISkgY29tcGFyaXNvbiBkaXNhZHZhbnRhZ2UuICBUaGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YKK3NhbXBsZXNvcnQgc3BlY2lhbC1jYXNpbmcgYXQgbW9zdCBvbmUgYXNjZW5kaW5nIHJ1biBhdCB0aGUgc3RhcnQsIHRoZW4KK2ZhbGxpbmcgYmFjayB0byB0aGUgZ2VuZXJhbCBjYXNlIGlmIGl0IGRvZXNuJ3QgZmluZCBhbiBhc2NlbmRpbmcgcnVuCitpbW1lZGlhdGVseS4gIFRoZSBjb25zZXF1ZW5jZSBpcyB0aGF0IGl0IGVuZHMgdXAgdXNpbmcgdHdvIGNvbXBhcmVzIHRvIHNvcnQKK1syLCAxXS4gIEdyYXRpZnlpbmdseSwgdGltc29ydCBkb2Vzbid0IGRvIGFueSBzcGVjaWFsLWNhc2luZywgc28gaGFkIHRvIGJlCit0YXVnaHQgaG93IHRvIGRlYWwgd2l0aCBtaXh0dXJlcyBvZiBhc2NlbmRpbmcgYW5kIGRlc2NlbmRpbmcgcnVucworZWZmaWNpZW50bHkgaW4gYWxsIGNhc2VzLgo=